请问这段代码哪里有问题?怎么改?
/*中断实现串口通信 */
#include<reg52.h>
unsigned char flag;
void main()
{
void init();
init();
while(1)
{
while(!flag)
;
ES = 0;
P1 = SBUF;
flag = 0;
SBUF = P1;
while(!TI) //TI发送中断标志
;
TI = 0;
ES = 1;
}
}
void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1;
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}
void serial() interrupt 4
{
flag = 1;
RI = 0; //接收完数据后硬件将RI置1,必须软件归0
}
我的目的是发一个数据给单片机。然后把数据赋给P1口。。再把该数据传回来。
[code=C/C++]
void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1; //去掉这个语句就程序就正确了
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}
//ET1 = 1; //去掉这个语句就程序就正确了
为什么??
[/code]
51单片机串口通信中断的问题
肯定不会运行while(TI==0);下面的程序的,因为你的中断开着,程序跳到中断服务程序里面了,然后中断处理结束了之后,TI自动清零了,所以一直在while(TI==0);无限循环。程序里面,既然开通了中断功能,那你就一直使用中断功能,为什么你还要使用查询功能呢?甚至有时把中断给禁止了,这里面容易出现问题哈...
51单片机串口通信问题
一个一个问题回答:1、是在一个字节接收成功或一个字节发送成功以后进入中断程序(不过,一般在发送时是将中断关闭的,也就不进入中断了)。此时,定时器的作用就是为了设定串口速率,因为单片机的速度和串口的速度不是一个数量级的,所以一定要有个变速箱。2、数据的接收是由硬件控制的,其实,数据的...
C51单片机串口通信中断的问题
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。
看了51单片机的串口通信,有一些疑问??
所以在串口中断服务中,不能有太多的程序去处理,因为处理这数据时,串口被中断占用就不能接收数据。通常将需要处理的数据放到主程序中,因为前面说了,主程序和串口接收是可以同时运行的。如果在串口中断服务中,程序较多,占去太多时间,正如你说的,那就会丢帧而出错,这是不允许的。
51单片机串行口通信数据丢失问题
中断服务程序占用时间太长,将网EEPROM写的程序放在外边,另外,需要开辟一个接收缓冲区,否则有可能丢失数据,用串口助手是没有握手的,所以PC没有多长时间的等待,你来不及接收就丢失了。
51单片机串口通讯(模式1)问题:发送内容前半部分出错,后半部分正确。错...
ET1=1;此语句是罪魁祸首,定时器1已经作为串口波特率发生器了,就不能做其他用途了,此时定时必须禁止中断,而你程序中恰恰相反,来了句ET1=1;开启了定时器1中断,导致串口波特率发生混乱。那当然串口通信会有问题了,删掉ET1=1;该语句即可。
51单片机串口通信时, 外部中断无法执行
串口通信是不是也是采用中断方式?如果与外部中断为同一优先经中断的话,则当51单片机串口通信时(串口中断时),外部中断是无法执行的。如果想实现外部中断优先,需要改变它们的优先级别,串口低优先级PS=0,外部中断高优先级PX0=1,PX1=1
两个51单片机485串口通信接收数据出错原因?大概发送三、五次会有一次...
1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。这种处理方法,就会遗漏收到的数据。2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断...
51单片机串口通信上位机接收数据丢失,怎么解决
数据丢失多半是因为中断造成的,当串口通讯时,系统被其他中断占用了,那么就会出现数据丢失的情况,所以为了保险,可以采取以下措施:1、将串口中断优先级设为最高。2、增加反馈信号,DTR和DSR两个信号可以用起来。
51单片机定时中断导致主程序数码管显示出问题
1,最简单的,在通信可靠的前提下尽可能提高串口波特率,同时降低发送频率(就是增大定时器中断周期),再把要发送的数据弄少点,能用缩写的就别写一大串。。2,串口发送改为中断方式,这个不细说了,网上有资料。。3,舍弃数码管扫描的软件延时,改用硬件延时(就是把数码管的位的切换也放在定时器...