51单片机串行口中断的使用(指针)
初始化中断服务函数主函数
这个程序的功能是通过上位机发送数字1234给单片机,单片机再把对应的数组发送给上位机
初始化
unsigned char shu1[] = {1};
unsigned char shu2[] = {1,2};
unsigned char shu3[] = {1,2,3,4};
unsigned char shu4[] = {1,2,2,3,4,5,6,7,8};
unsigned char Data_Txd,flag_Rxd;
unsigned int Rxd_arrived;
unsigned char *ptr_Txd;
void SCON_init()
{
SCON = 0x50; //10位UART 波特率可变
TMOD = 0x20; //T1的初值可重载的8位计数器
TH1 = 256-3; //9600的波特率算下来的
TL1 = 256-3; //9600的波特率算下来的
ES = 1; //打开串口中断
EA = 1; //打开总中断
TR1 = 1; //开启计数器1的使能端
}
中断服务函数
void zhongduan4() interrupt 4
{
if(RI == 1)
{
Rxd_arrived = SBUF;
RI = 0;
flag_Rxd = 1;
}
if(TI == 1)
{
if(Data_Txd>0)
{
SBUF = *ptr_Txd; //当前句子下面有两句,可相当延时函数,让数据有充分时间发送到SBUF
ptr_Txd++;
Data_Txd--;
}
TI = 0;
}
}
SBUF = *ptr_Txd; 是取出指针指向变量的值给SBUF;
主函数
void main()
{
SCON_init();
while(1)
{
if(flag_Rxd == 1)
{
flag_Rxd = 0;
/*上位机是以十六进制通过串口发送过来的,数据不管被强制转化成char型还是int型的,都对应着ASCLL表上相应的字符,十进制*/
switch (Rxd_arrived)
{
case 49:
ptr_Txd = shu1;
Data_Txd = sizeof(shu1);
TI = 1;
break;
case 50:
ptr_Txd = shu2;
Data_Txd = sizeof(shu2);
TI = 1;
break;
case '3':
ptr_Txd = shu3;
Data_Txd = sizeof(shu3);
TI = 1;
break;
case '4':
ptr_Txd = shu4;
Data_Txd = sizeof(shu4);
TI = 1;
break;
default:
break;
}
}
}
}
1、sizeof();是一个功能指令,读取括号里面的变量的位数 2、str_Txd = shu1; 这样是把数组的首地址(首个数字的地址)赋给指针