51单片机 多机串口通信,这样初始化有错吗?

51单片机 多机串口通信,这样初始化有错吗?

void UART_intit()
{
TMOD=0x21;
SCON=0xf0;
//SM2=1;
PCON=0x00;//波特率是否加倍
EA=1;
ES=1;
TH1=0xF3;
TL1=0xF3;
TR1=1;
}

主从机都统一使用以上初始化函数
错误特点 主机 发送第2次信号后 不断进入串口中断,我用LED提示看见了这个现象

已经排除了硬件问题了,因为这个电路在双机通信时使用过 没有问题的,可是现在3机通信,我用了应答的方法,最后排除出很可能是初始化函数不正确 ,是因为初始化不正确吗?
最奇怪的是 当主机不断受到串口中断时 我把连接主机的所有txd和rxd线都拔下后,中断提示的LED仍然不断闪烁!无语了

void UART_INTERR() interrupt 4 using 1//这是从机的串口中断程序
{
unsigned char word;
RI=0;
word=SBUF;
if(RB8==1)
{
if(word==0x11)//本机地址码
{
LED=~LED;
DELAY_MS(1000);
SM2=0;
TB8=1;
SBUF=0x11;//应答主机
while(TI==0);
TI=0;

}else{
SM2=1;
}
}
if(RB8==0)
{
SM2=1;
if(word==0x7d)
{
MADA_CONTROL=1;
}
if(word==0x34)
{
MADA_CONTROL=0;
}

}
}

这是我其中一个从机的串口中断程序 只应答主机一次而已啊!
从机的LED反而没闪烁 就是主机的串口中断不断闪烁,
unsigned char word;
RI=0;
word=SBUF;
if(RB8==1)
{
if(word==0x11)
{
LED=~LED;
}
}//这是主机的串口中断程序

第1个回答  2012-09-06
串口初始化没问题

我觉得问题在这里面, 应答时最好先关闭中断ES, 应答后再开中断,不然退出中断后又进入串口中断, 而且应答的数据0x11 和你前面判断的本机地址一样, 所以进入这个循环了, 你试试把应答的0x11改成其他数据。
word=SBUF; //这句最好是放在判断RB8之后

if(word==0x11)//本机地址码
{
LED=~LED;
DELAY_MS(1000);
SM2=0;
TB8=1;
SBUF=0x11;//应答主机
while(TI==0);
TI=0;追问

仍然是不行啊

第2个回答  2012-09-06
没错。那的看你的接受语句判断的效果了。
第3个回答  2012-09-06
满足中断的条件是SM2=1和RB8=1,或者SM2=0,所以你看看发送程序是否有问题,是不是从机接收信号后在不断地发送数据。追问

最奇怪的是 当主机不断受到串口中断时 我把连接主机的所有txd和rxd线都拔下后,中断提示的LED仍然不断闪烁!无语了

追答

呵呵,看来不一定出在串口中断里,别的地方有闪烁处理吗?

追问

没有了 唯一的

追答

还有一个可能,就是你的单片机老在复位,也就是没有关看门狗,你看看,是不是这种情况。

追问

具体怎样才会造成这样的情况的?怎样知道是不是老在复位?

追答

你可以再初始化程序里再加个LED呀,我觉得你的闪烁不是程序控制造成的,而是复位造成的。

本回答被提问者和网友采纳
第4个回答  2012-09-06
没错
第5个回答  2012-09-06
顶下

51如果要多次使用串口 需要多次初始化串口吗?
51单片机使用串口通信时,只需要初始化一次就行了,不需要多次初始化,可在主程序的while(1)循环语句前初始化一次即可。

我用的51单片机,想要使用串口发送数据,可是我用串口助手调试的时候发现...
串口发送数据子程序和串口初始化子程序有错。TR1=1; 才启动T1控制波特率。你采用查询方式发送,串口就不要开中断,ES=1; 应删掉。修改后的程序如下。

两个串口的51单片机的串口初始化与中断的问题
不能,两个串口不能用同一个时钟,一个得用TIM1,一个得用BRT。

51单片机Keil C51下使用printf输出到串口,为何初始化了串口之后就可以使...
因为是这样的,在Keil\\C51\\LIB目录下有个putchar.c文件,printf函数会调用该文件中的 putchar函数,putchar里面的使用的寄存器都是标准51的(如TI,SBUF),它 们的地址是固定的,由此可知printf函数只针对串口0。如果想让printf函数支持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为S...

C51单片机能与3个串口设备通讯吗?
当然可以啦,三个串口通信设备要连在同一条总线上,如USART;SPI;I2C总线上,51单片机发送的每一串信号都带有地址信息,当发出的地址信息与这三个串口通信设备的某一个地址相同时,单片机就可以这个通信设备通信了,其他的就处于休眠状态。

关于51单片机通过串口发送数据的问题 我没有用循环发送 但是连上电脑...
呵呵,您使用的是C8051F系列单片机。因此,初始化时应当禁用WDT。在初始化里增加以下语句:PCA0MD &= ~0x40;PCA0MD = 0x00;这样,单片机就不会不停地复位了。

51单片机如何初始化成8-n-1(8数据位,无奇偶校验位,1停止位)波特率,是...
用串口的模式1,是10位异步通信方式。1起始位,8数据位,1停止位,没有奇偶校验位。这种模式就是:8-n-1(8数据位,无奇偶校验位,1停止位)的模式。完全符合你的要求。--- 带奇偶校验位的,要用方式2或方式3。把奇偶校验位,放到TB8上,就可以发送了,这就是偶校验。接收的奇偶校验位,在...

51单片机串行通行时 接收到的数据和发送的数据不一致
1 T1时钟初值都没配置,复位默认为0,也就是说波特率都没有配置,幸运的是两片单片机都没配置,也就是波特率刚好相等。2 单片机程序最基本运行程序就是错的,没有死循环,程序只执行了一遍,然后就胡乱运行,怎么可能按你的要求运行。建议不要改程序,还是重新学写程序,买块开发板,按照附带的例程...

51单片机同时接两个串口设备可以吗?
1.可以,如果要使用同一个通信口,需要使用网络通信协议,例如modbus协议。2.不好说,通信协议定义不同不能通用,除非各个设备能各自兼容。如果要实现一条通信线上谁都可以访问任何的其他设备,则成为多主机网络,这时就麻烦的多了。

51单片机的串口扩展问题
如果一定要用一个串口的单片机,那你可能用普通IO来模拟串口。从网上查资料还是有的。另:你的理解是不是有问题,所谓有A模块不间断输出数据给单片机,可能吗?那你单片机就要不停地处理串口了,还干不干别的。建议你把三个模块都设置为被动发送(即从机)的,最好不要主动的,如果一定要有主动的,...

相似回答