还是郭老师的那个题目:以16进制发送一个0-65536之间的任一数,当
单片机收到后在数码管上动态显示出来,波特率自定。我的问题是,我在串口助手上输入任何数,五个数码管只显示11366,代码如下:
#include<reg52.h>
#define uchar unsigned char
uchar flag;
int a,ge,shi,bai,qian,wan; //个位、十位、百位、千位、万位
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x06,0x5b,0x4f,
0x66,0x6d,0x7d};
void init()
{
EA=1;
ES=1;
TMOD=0x20;//定时器1工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
dula=0;
}
void delay(uchar y)
{
uchar i,j;
for(i=y;i>0;i--)
for(j=118;j>0;j--);
}
void display(int x)
{
wan=x/10000;
qian=x%10000/1000;
bai=x%10000%1000/100;
shi=x%100/10;
ge=x%10;
//从左到右,第1个数码管
dula=1;
P0=table[wan];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1; //第2个数码管
P0=table[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
//第3 个数码管
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(5);
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0 ;
SBUF=a; //向PC端返回要显示的值
while(!
ti);
TI=0;
display(a);
ES=1;
}
}
}
void serial() interrupt 4
{
RI=0;
a=SBUF; //将接受到的值给a
flag=1;
}
@一抹阳光 @爱我别走 麻烦你们了
-
其一:变量分配问题,flag只用到了0,1两个状态51可以定义成bit型节省空间,ge、shi……应该放在display()函数中定义成局部变量。
其二:段码数组不完整。0~9显示码不管共阴共阳有10个的(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07共阴)
其三:flag变量赋值以后没有清零,main函数不断执行if(flag)条件下的语句块。失去flag的意义了。display函数正常应该放在while(1)第一层下只做显示用。
其四:串口信息帧中,一次接受、发送一个字符。怎么能赋值给5位数呢?思路:定义一个接收缓冲区,buf[5]类似的,开拓出5个字节的空间保存你的5位数数据。当然你也可以简单的一个变量用算法把接受的二进制数据组合到两个字节的int型中。
其五:串口助手发送字符一般用字符型发送,接收的时候,buf=SBUF&0X0F;去低位,例如:发送2,数据形式为0x32;取低位,为2保存在缓存中,再进行处理。
有问题再交流。先解决以上的。
一周热门 更多>