单片机串口通信问题

求助串口通信问题
//以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率2400
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar ge,shi,bai,qian,wan;
uint r;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uint ge,uint shi,uint bai,uint qian,uint wan);
delay(uchar m);
void main()
{
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
wan=r/10000;
qian=r%10000/1000;
bai=r%1000/100;
shi=r%100/10;
ge=r%10;
display(ge,shi,bai,qian,wan);
}
}
void ser() interrupt 4
{
RI=0;
r=SBUF;
}
void display(uint ge,uint shi,uint bai,uint qian,uint wan)
{
P1=0xf4;
P2=table[ge];
delay(10);
P1=0xf3;
P2=table[shi];
delay(10);
P1=0xf2;
P2=table[bai];
delay(10);
P1=0xf1;
P2=table[qian];
delay(10);
P1=0xf0;
P2=table[wan];
delay(10);

}
delay(uchar m)
{
uchar a,b;
for(a=m;a>0;a--)
for(b=100;b>0;b--);
}
自我感觉程序没有错误。但是用串口助手发送是十六进制数时小于255的十六进制数才正确,大于255就出错误了,比如发送ffff,还是显示255,发100的时候显示16,请问是什么地方出现了问题。

头文件中包含了reg52.h ,说明你这是51内核的单片机串口通信程序,51的串口通信特殊寄存器SBUF的大小是8位的,即一个字节,2的8次方即256,所以只能接收到最大255的数,你要想传进去大于255的数,需要在中断接收处理函数中对r=SBUF这句重写,做判断,大于255的数要先寄存在其它寄存器,然后两次或多次接收的数再组合成你需要的数.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-05
串口通信,每次发送、接受,都是一字节,即0~255。

较大的数,要多次传输才行。
第2个回答  2010-07-05
程序中r的范围是0到255,即8位二进制数,你可以这样试哈
把中断改为如下:
void ser() interrupt 4
{
RI=0;
unsigned char temp=0,shu,m;
if(temp==1)
{
shu=(m<<8)|r;
temp=0;
}
m=r;
temp++;
}
数据的发送类似
相似回答