51单片机串口通信发送多个字节的问题
题目是:以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定。我已经把数字分成两个8位接收进来了,但最后数码管上显示的最大还是2...
题目是:以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,不知为何
#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;
}
} 展开
展开全部
照抄了楼主最后那无比精妙的if语句,我的程序果断活了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序反应你的思路。思路有问题,结果就有问题。显示就一直放在循环 不要加什么条件判断避免意外的闪烁,中断里面(可以不看建议 最好分两次,数据,数据的反码来校验数据的正确性)关键来了 :进去之后把REN寄存器关了禁止接收。处理完里面的事情在把它打开。发送端每发一次需要等待一次 ,处理是需要时间的。多少可以估计的出来 大一点一般。好就这样就能解决
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
能提供一下原理图吗?你的接收函数也有问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询