完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
程序如下: 串口1接收发送都可以使用,串口2发送测试也是可以用的,现在问题就是卡在接收上,接收有问题 麻烦论坛大神帮忙看看串口2接收哪里有问题,万分感谢!!! /*********************************************************************** 时间:2020.04.04 芯片:STC12C5A60S2 晶振:11.0592MHz 波特率:115200bps 引脚定义:串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0 串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2 功能描述:STC12双串口通信(中断方式) 当串行口1接收数据后,将此数据由串行口2发送出去 当串行口2接收数据后,将此数据由串行口1发送出去 ***********************************************************************/ #include #include "intrins.h" #include "string.h" #include "stdio.h" #define S2RI 0x01 //串口2接收中断请求标志位 #define S2ti 0x02 //串口2发送中断请求标志位 #define uchar unsigned char #define uint unsigned int #define S2RI 0x01 #define S2TI 0x02 #define Code_head1 0xAA #define Code_head2 0x55 #define len 25 bit busy2; //此位用于串口判断是否发送繁忙 char xdata Uart2_buff[40]; //缓冲数据 char xdata Uart1_buff[40]; uchar count2=0; //串口计数器 uchar count1=0; //串口计数器 char xdata echo[40]; unsigned char flag1,flag2,temp1,temp2; void Clear_Buff(); //清除串口1,2中数组的值,为下一次做准备 void read_code2(uchar _char); //保存串口接收到的字符 void Uart_1_SendString(char *P); //串口1 发送字符串函数 float TDM_Receive_Check(); void set_brrate(); void serial_put_uint(unsigned int number); void dispplay(int _data); void read_ac(); void read_once(); void delay_ms(uint ms); /****************串行口初始化函数****************/ void InitUART(void) { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 /****************************115200******************************/ AUXR &= 0xF7; //波特率不倍速 S2CON = 0x50; //8位数据,可变波特率 AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T BRT = 0xFD; //设定独立波特率发生器重装值 AUXR |= 0x10; //启动独立波特率发生器 IE2=0x01;//允许串口2中断。 EA=1;//总中断一定要开,不然能发送,不能接收 } /****************串行口1发送****************/ void UART_1SendOneByte(unsigned char c) { SBUF = c; while(!TI); //若TI=0,在此等待 TI = 0; } /****************串行口2发送****************/ void UART_2SendOneByte(unsigned char c) { S2BUF = c; while(!(S2CON&S2TI)); //若S2TI=0,在此等待 S2CON&=~S2TI; //S2TI=0 } /*****************主函数******************/ void main(void) { InitUART(); //串行口初始化 Uart_1_SendString("*****************************rn"); Uart_1_SendString("************00000***********rn"); while(1) { int i; //如果串口1接收到数据,将此数据由串口2发送 if(flag1==1) { flag1=0; for(i=0; i UART_1SendOneByte(Uart1_buff[i]); } read_ac(); Uart_1_SendString("rn"); Clear_Buff(); } //如果串口2接收到数据,将此数据由串口1发送 if(flag2==1) { flag2=0; UART_1SendOneByte(temp2); } } } /************串行口1中断处理函数*************/ void UART_1Interrupt(void) interrupt 4 using 3 { if(RI) { RI=0; ES=0;//关掉串口总中断。 Uart1_buff[count1]=SBUF; switch(Uart1_buff[count1]) { case 'r': flag1=1; count1=0; ES=0; REN=0; break; case 'n': flag1=1; count1=0; ES=0; REN=0; break; default: count1++; } ES=1;//再开串口中断。 } } /************串行口2中断处理函数*************/ void UART_2Interrupt(void) interrupt 8 using 2 { if(S2CON & S2RI)//判断是否有接收中断。 { S2CON &= 0xFE;//清除串口2接收中断。 ES=0;//关掉串口总中断。 Uart2_buff[count2]=S2BUF; count2++; ES=1;//再开串口中断。 } } /*---------------------------- 串口1发送函数: 参数: 字符串 返回值: None ----------------------------*/ void Uart_1_SendString(char *P) { ES = 0; REN=0; while(*P!=' |