proteus串口调试问题

来源:百度知道 编辑:UC知道 时间:2024/05/14 05:14:42
#include<reg52.h>
unsigned char a;
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//设置波特率9600
TR1=1;//开始计时
REN=1;//开串口接收
SM0=0;
SM1=1;//方式1
while(1)
{
if(RI==1)
{
RI=0;
a=SBUF;
SBUF=a;
}
}
}
我用keil做的程序,烧到proteus中,用COMPIM和虚拟串口连接调试,能收到返回的数据,但总是有时候对,有时候错。比如我传给单片机0x00,有时候返回00,有时候返回80,交替出现,不知道是为什么。
1楼不对吧,REN=1;SM0=0;SM1=1;这些是SCON中的位.我都说了,能收到数,只是一会是一个错的数,一会是一个对的数。所有寄存器默认为0,不用设置PCON和ES。方式1为自动重装定时器,初值是自动的。加入TI控制也不行,试了。第二次TI一定会=1,利用RI引发后直接输出,没有用到TI,TI=几不会影响发送和接收。因为程序执行时间远小于发送间隔时间。

你的波特率如果没问题的话,可能是你的发送没有设置好。
在发送前加一个判断吧。“while(TI==1);”
if(RI==1)
{
RI=0;
while(TI==1);
a=SBUF;
SBUF=a;
}
这样就避免了发送没完成,你又发了第二次,数据会乱的,你试试看。

你没有用SCON设置串口工作模式
PCON设置波特率是否加倍
还有发送完后没有清发送标志位TI=0,你难道是发一次重启一次吗?
你既然没有用到串口中断,那么还是把它关了ES=0
那真不好意思,我第一次看见用SM0=0,SM1=1来设置串口工作模式,学习了。
那么我再请教一个问题,第一次发送SBUF=a 完成后,TI==1吧,
第二次执行SBUF=a之前TI=1,情况会怎样?书上没写。