51单片机 串口程序

以2400bps从计算机发送任一字节数据,当单片机收到该数据后,在此数据前加上一序号然后连同此数据一起发送至计算机,当序号超过255时归零。
程序如下:
#include<reg52.h>
unsigned char flag,a,num1;
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xf4;
TL1=0xf4;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
num1++;
if(num1==255)
num1=0;
SBUF=num1;
while(!TI);
TI=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}

哪错了啊?为什么我通过串口调试助手发送的时候显示的是乱码呢

首先要确定串口调试助手的波特率也是2400,并接收要以十六进制数显示,最好发送也以十六进制数发送。
程序没有问题,是因为发送的num1在0-255之间,而用串口调试助手的字符显示方式不是全部都能显示出来的,有一部分就是显示乱码的,而显示十六进制数就没有问题了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-01-20
void
main()
{
scon
=
0x50;
tmod
=
0x20;
//设置定时器1为工作方式2
th1
=
0xf4;
tl1
=
0xf4;
tr1
=
1;
ea
=
1;
es
=
1;
while(1)
{
if(flag)
{
flag
=
0;
//不关闭串口中断,要让它继续接收
num1++;
//超过255,自动就是0
sbuf
=
num1;
while(!ti);
ti
=
0;
sbuf
=
a;
while(!ti);
ti
=
0;
}
}
}
void
ser()
interrupt
4
{
if
(ri)
{
ri
=
0;
a
=
sbuf;
flag
=
1;
}
}
第2个回答  推荐于2017-12-15
void main()
{
SCON = 0x50;
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xf4;
TL1 = 0xf4;
TR1 = 1;
EA = 1;
ES = 1;
while(1) {
if(flag) {
flag = 0; //不关闭串口中断,要让它继续接收
num1++; //超过255,自动就是0
SBUF = num1; while(!TI); TI = 0;
SBUF = a; while(!TI); TI = 0;
}
}
}
void ser() interrupt 4
{
if (RI) {
RI = 0;
a = SBUF;
flag = 1;
}
}本回答被提问者和网友采纳
第3个回答  2013-07-13
楼主的tmod 跟 你的中断程序 应该不相符吧~~~ void ser() interrupt 4
是否 应该是void ser() interrupt 3

如果是串口中断,那你的中断程序是对的,那就考虑TMOD的赋值追问

TMOD的赋值也每有错,是串口中断

追答

不好意思,解决不了你的问题

第4个回答  2013-07-13
TMOD=0x20;是00110000, 是方式3吧追问

我这是串口中断的

追答

串口调试助手有设置阿?

追问

设置了啊,波特率2400