题目是:以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定。
我已经把数字分成两个8位接收进来了,但最后数码管上显示的最大还是255,不知为何
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef};
uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar flag,wan,qian,shi,bai,ge;
uint a;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void display(uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)
{
wan=a/10000;
qian=a%10000/1000;
bai=a%1000/100;
shi=a%100/10;
ge=a%10;
dula=1;
P0=tabledu[wan];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[0];
wela=0;
delayms(5);
dula=1;
P0=tabledu[qian];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[1];
wela=0;
delayms(5);
dula=1;
P0=tabledu[bai];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[2];
wela=0;
delayms(5);
dula=1;
P0=tabledu[shi];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[3];
wela=0;
delayms(5);
dula=1;
P0=tabledu[ge];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[4];
wela=0;
delayms(5);
}
void main()
{
init();
while(1)
{
if(flag==1)
{
display(wan,qian,bai,shi,ge);
ES=0;
SBUF=a/256;
while(!TI);
TI=0;
SBUF=a%256;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
static uchar i=0;
RI=0;
if(i==0)
{
a=SBUF;
i++;
}
else
{
a=a*256+SBUF;
i=0;
flag=1;
}
}
我在中断里不是把它分成两次发送了么 。。 那种方法不对吗?
追答我已经把数字分成两个8位接收进来了,但最后数码管上显示的最大还是255,
----
不是说收的问题。
不是先得有人发送,单片机,才能接收吗?
这么多字节的传送,楼主是怎么发送的?
没太理解你的意思。 不就两个字节吗? 我就是用那个串口助手,比如我输入一个fffd,数码管上应该显示65533,但显示的是00255
追答FFFD,是 16 进制?
哪个是第一字节,哪个是第二字节?
你还有反回传输的部分,此时,也可能漏掉某个字节。
反向传输,串口助手,正常收到了 FFFD 吗?
题目说用十六进制发送,先传送的第一字节是高八位吧,然后是低八位,不过最后反向传输回去的时候没收到FFFD,不知道怎么回事
追答哦,反向,没有正常收到,这就应该是线路、波特率、方式几、等等问题。
如果反向收到,而单片机显示不正常,就可能是第一、第二字节数据错位的问题。
----
另外,多字节数据传送,不是像你这样的,应该先制订协议。
规定,什么数据是第一字节、数据的校验码等等。