完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
哪位大神帮我看看这个程序问题到底是出在哪里?我是下面连接三个节点,地址分别为01、02、03,但是用串口助手调试出来的只有节点一的数据是正确的,后两个都是一般数据是对的一半是错误的。下面是程序,在此拜谢!(初学者)
#include #include #include #define uchar unsigned char #define unit unsigned int//////////////////////串口2 s2con位寻址/////////////////////////////////// #define S2RI 0x01;//串口2接收中断请求标志位 #define S2ti 0x02;//串口2发送中断请求标志位 #define S2RB8 0x04; #define S2TB8 0x08; ***it RS485E=P1^0; //定义485的使能脚// RS485E=0为接收状态 RS485E=1为发送状态 unsigned char i; ///////////////////////////////////////////////////////////////////////// void uart2_init() //串口2初始化函数 { AUXR &= 0xf7; //波特率不倍速 S2CON = 0x50; //8位数据,可变波特率 //串口2方式1,接收充许 BRT = 0xFD; //设定独立波特率发生器重装值 AUXR &= 0xfb; //独立波特率发生器时钟为Fosc/12,即12T AUXR |= 0x10; //启动独立波特率发生器 IE2=0x01; //允许串口2中断 } void UartInit(void) //串口1初始化函数 //9600bps@11.0592MHz { PCON &= 0x7f; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T AUXR &= 0xfe; //串口1选择定时器1为波特率发生器 TMOD &= 0x0f; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 // ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; //开串口1中断 EA=1; //开总中断 // IE2&=0xfe; } /////////////////////////////延时程序/////////////////////////// void delay(unsigned int a) //延时约1ms { unsigned int i; while (--a!=0) for(i=125;i>0;i--);//1T单片机i=600,若是12T单片机i=125 }//---------------------------------------------------- ////////////////////////////////////////////////////////////////////// void main() { uart2_init(); UartInit(); RS485E=0; while(1) { } } /************************************************************* 串口一 中断处理函数 *************************************************************/ void UART1_Service(void) interrupt 4 //wuxian jizhan { if (RI == 1) { RI = 0; S2BUF = SBUF; while(!(S2CON&0x02)); S2CON&=0xfd; } } /************************************************************* 串口二 中断处理函数 *************************************************************/ void UART2_Receive(void) interrupt 8 //PC { static unsigned char adr=0x01; unsigned char a; if(S2CON & 0x01) { S2CON&=0xfe; a=S2BUF; // if(a==0x11) //Start { RS485E=1; delay(5); SBUF=adr++; while(!TI); // 等待数据传送 (TI发送中断标志) TI = 0; if(adr== 0x04) adr = 0x01; RS485E=0; } } } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-19 06:19 , Processed in 0.361227 second(s), Total 41, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191