完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是我写程序,只要是想,用stc15w4k48s4单片机实现,串口1以1s的时间周期连续发送0 1 2 3 4 5 6 7 8 9(加上以为校验和),用串口2接收遗传协议规定的数据并判断是否正确,若正确,串口2发送oxAA。
可是在调试过程中,串口一和串口2都接收不到正确的答案,想知道怎么办。 #include #include #include #include #include #define second 1000 #define uchar unsigned char #define uint unsigned int //#define FOSC 22118400L //#define BAUD 115200 // #define TM (65536-(FOSC/4/BAUD)) //uchar xdata Data1_BUF[32],Data2_BUF[32]; uchar DATA_Send[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; uchar xdata UART1_DATA_Receive[10],UART2_DATA_Receive[10]; uchar UART1_Rec_flag=0,UART2_Rec_flag=0; uchar i,pf,count,check1,check2,d[10]; //函数声明// void UART1_Send(uchar str1[]); //串口1发送数据 void UART2_Receive(uchar UART1_DATA_Receive[10]); //串口2接受数据 void UART2_Send(uchar str2[]); //串口2发送数据 void timer0_config(); //定时器0 void UART_init(void); //初始化串口波特率,使用定时器2 //void PC_Send(); //PC机发送数据 //主函数// void main() { timer0_config(); UART_init(); while(1) { //if(0){ SCON = 0x50; if(UART1_Rec_flag==1) UART1_Rec_flag=0; S2CON=0x50; while(count==second) { count=0; UART1_Send(UART1_DATA_Receive); if(UART2_Rec_flag==1) { UART2_Rec_flag=0; S2CON &=0x04;//关闭串口2接收控制 // if((check1^check2)==0) //{ UART2_Send(UART1_DATA_Receive); // } //ES2=1; } //ES1=1; } } } // //串口1发送数据 // //void UART1_Send(uchar d[]) // { // uchar i; // for(i=0;i<10;i++) // SBUF=d; // while(!TI) // TI=0; // } //串口2发送数据// void UART2_Send(uchar d[]) { uchar i; for(i=0;i<10;i++) S2BUF=d ; while(!(S2CON&0x02)); S2CON&=~0x02; } //串口1中断处理函数 void UART1_Routine() interrupt 4 { uchar d[10]; uchar length=10; while(1) { while(RI==0) {} RI=0; pf=0; for(i=0;i { d=SBUF; //P1=d; pf+=d; check1=pf; SBUF=pf; // while(RI==0) {} RI=0; } //P1=pf; while(RI==0) {} RI=0; //P1=SBUF; //check1=pf; if((SBUF^pf)==0) { //P1=0;//time(500) SBUF=0xaa; } UART1_Rec_flag=1; //while(TI==0) {} TI=0; } } //串口2中断处理函数// void UART2_Routine() interrupt 8 { while(1) { while(RI==0) {} RI=0; pf=0; //uchar check2 for(i=0;i<10;i++) { d=S2BUF; //P3=d; check2+=d; pf=check2; } //P3=check2; if((S2BUF^pf)==0) { //time(500) SBUF=0xAA; } UART2_Rec_flag=1; //while(TI==0) {} TI=0; } } //定时器0的初始化// void timer0_config() { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0xCD; //设置定时初值 TH0 = 0xD4; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 } //定时器T0中断服务函数// void timer0_Routine () interrupt 1 { uchar count; TF0=0; TR0=1; while(count==second) { count=0; TF0=0; } } //串口初始化函数 void UART_init(void) //115200bps@22.1184MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设定定时器1为16位自动重装方式 TL1 = 0xD0; //设定定时初值 TH1 = 0xFF; //设定定时初值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 S2CON = 0x50; //8位数据,可变波特率 AUXR |= 0x04; //定时器2时钟为Fosc,即1T T2L = 0xD0; //设定定时初值 T2H = 0xFF; //设定定时初值 AUXR |= 0x10; //启动定时器2 EA=1; ES=1; //开启串口中断 //PS=1; //PS2=0; } |
|
相关推荐
1个回答
|
|
关注一下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1187 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1122 浏览 2 评论
2223 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1311 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1735 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 02:28 , Processed in 0.419385 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号