STC12C5A60S2双串口使用程序(已经验证成功)#includestc12c5a60s2.h#includeintrins.h#defineucharunsignedchar#defineS2RI0x01//串口2接收中断请求标志位#defineS2TI0x02//串口2发送中断请求标志位//================================================//对于将P4.4、P4.5当做I/O口使用必须添加的定义||//================================================sfrp4sw=0xbb;//需在主函数文件中做相应设置4、5、6为1(作为I/O口使用)/*sbitbutton1=P4^3;sbitbutton2=P4^4;sbitbutton3=P4^5;sbitbutton4=P4^6;*/ucharcodetemp1[]={白云:“我可是个名人”};ucharcodetemp2[]={黑土:“啥名人啊,你就是个人名”};ucharcodetemp3[]={小崔:“诶,大叔大妈,你俩都冷静冷静”};ucharcodetemp4[]={观众:“哈哈哈哈”};/*voiddelay_1ms(ucharii)//误差-0.018084490741us{unsignedchara,b;for(;ii0;ii--)for(b=18;b0;b--)for(a=152;a0;a--);_nop_();//ifKeil,requireuseintrins.h}voiddelay1s(void)//误差-0.000000000125us{unsignedchara,b,c;for(c=212;c0;c--)for(b=160;b0;b--)for(a=80;a0;a--);_nop_();//ifKeil,requireuseintrins.h_nop_();//ifKeil,requireuseintrins.h}*///************************串口通信部分******************************ucharwj_uun='!';//用于存放串口1接收的字符ucharwj_uun2='?';//用于存放串口2接收的字符voidbt_uart_init()//单片机双串口初始化{//SCON=0X50;//SM0=0SM1=1SM2=0REN=1SM0=0;//串口工作方式1:1位起始位,8位数据位,1位停止位允许串口接收SM1=1;REN=1;//允许串口接收//RI=1;//接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行串口中断)TMOD=0X20;//定时器T1工作方式2TH1=0XFD;//9600bit/s下的定时器初值TL1=0XFD;TR1=1;//启动定时器T1EA=1;//开总中断ES=1;//开串行口中断S2CON=0x50;//串口2工作在方式110位异步收发S2SM0=0S2SM1=1S2REN=1允许接收BRT=0XFD;//9600bit/s下的独立波特率发生器初值AUXR=0x10;//辅助寄存器:00010000-BRTR=1:独立波特率发生器开始计数,S2SMOD=0:波特率不加倍,BRTx12=0:独立波特率每12个时钟计数一次IE2=0x01;//开串口2中断00000001-ES2=1//AUXR1=0x10;//00010000-S2_P4=1:UART2从P1口(RxD2:P1.2TxD2:P1.3)切换到P4口(RxD2:P4.2TxD2:P4.3)否则默认都为P1口}/**************串口1发送函数*****************/voids1_send_char(uchardat)//发送端(发送的是字符){SBUF=dat;//将字符送入发送缓冲寄存器while(!TI);//TI为发送状态标志位,0:发送中1:发送结束TI=0;//手动清零标志位}voids1_send_string(uchar*pt)//通过调用发送字符函数来发送字符数组{while(*pt!='\0'){s1_send_char(*pt++);}}/**************串口2发送函数*****************/voids2_send_char(uchardat2)//发送端(发送的是字符){S2BUF=dat2;//将字符送入串口2的发送缓冲寄存器while(!(S2CON&S2TI));//判断发送是否结束:S2CON.bit2=0:发送中1:发送结束S2CON&=~S2TI;//手动清零标志位,令S2CON.bit2=0}voids2_send_string(uchar*pt2)//通过调用发送字符函数来发送字符数组{while(*pt2!='\0'){s2_send_char(*pt2++);}}/**************串口1中断程序*****************/voidbt_serial_1()interrupt4//中断编号4为串行口1中断{if(RI)//接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行中断){RI=0;//同样需要手动清零wj_uun=SBUF;//将接收缓冲器接收的字符送入变量中}}/**************串口2中断程序*****************/voidbt_serial_2()interrupt8//中断编号8为串行口2中断{if(S2CON&S2RI)//接收标志位:S2CON.bit1=0:正在接收1:接收完毕(如果RI=1就一直执行中断){S2CON&=~S2RI;//同样需要手动清零,令S2CON.bit1=0wj_uun2=S2BUF;//将串口2接收到的字符送入变量中}}voidmain(void){bt_uart_init();//串口初始化p4sw=0x70;//01110000对应的4、5、6脚设置成功通用I/O口while(1){/*if(wj_uun!='!')//串口1接收{s1_send_char(wj_uun);//串口1发送wj_uun='!';}*/if(wj_uun2!='?')//串口2接收{s2_send_char(wj_uun2);//串口2发送wj_uun2='?';}}}