51单片机串行口中断的使用(指针)

    技术2022-07-10  151

    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; 这样是把数组的首地址(首个数字的地址)赋给指针

    Processed: 0.012, SQL: 9