这是我写得一个关于单片机串口通信的程序,希望高手指点下,先谢谢;啊

来源:百度知道 编辑:UC知道 时间:2024/05/24 12:51:15
以2400bps从计算机发送任一字节数据,当单片机收到该数据后,在此数据前加上一序号然后连同此数据一起发送至计算机,
为什么该程序把ES=0这句;不要了,也能正确运行呢?;而在把最下面的TI下面的flag=0;这句不要了,就不能运行了,同时即使把该句子放到IF里面也不能运行,(不能运行是指一打开串口通信,单片机就不停地发送数据)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I get"; //定义单片机发回上位机的信息;
sbit beep=P2^3; //定义蜂鸣器;
uchar flag,i; //标志量;
uint a; //从上位机发来的数据,放在这里;
void init()
{
TMOD=0x20; //计时方式2,8位自动重装;
TH1=0xf4; //定义发送的波特率为2400;
TL1=0Xf4;
TR1=1; //开计时器,
SM0=0; //这三行为定义允许串口接收数据;
SM1=1;
REN=1;
EA=1; //开总中断;
ES=1;
} //开串口中断;
void main()
{
init();
while(1)
{
if(flag==1)
{
// ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
// while(!TI);
// TI=0;
SBUF=a;
while(!TI);
flag=0;
}<

ES=0 关串行中断 ;首先说明是不能正常运行的 ,就相当于下面程序

void ser() interrupt 4 //中断程序;
{
RI=0; //把RI重新置为0;因为一接受完数据都会进入中断且使RI置为1;
a=SBUF;
flag=1;
}
没有起到作用,你怎么能够正确的接受数据。

flag=0;去掉后你的标志同样不行,他是接受标志 清零。肯定是不行

while(!TI)有了这个语句,就最好中断换成查询方式。
楼主的问题是先执行中断,中断响应后才会判断while(!TI)

程序是正常的。
楼主的疑问是没有必要的。

应该是先执行中断

这跟谁的板子没关系