通过串口助手用PC向单片机发送1234,5689,4569。通过数码管显示?
时间:10-02
整理:3721RD
点击:
目前本人能做到让两位数码管正常显示,例如发送1234,数码管正常显示xx34。但是无法做到让4位数码管显示。
所以想请教下怎么做到,甚至输入任意8位数都能在数码管显示。下面附代码。
#include<reg52.h>
#define uc unsigned char
#define ui unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
uc code table[]= //代码表
{
/*0 1 2 3*/
0x3f,0x06,0x5b,0x4f,
/*4 5 6 7*/
0x66,0x6d,0x7d,0x07,
/*8 9 A B*/
0x7f,0x6f,0x77,0x7c,
/*C D E F 不显示*/
0x39,0x5e,0x79,0x71,0
};
ui a;
uc qian,bai,shi,ge;
void delay(uc z)
{
uc x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void init()
{
TMOD=0x20; //设置定时器1 工作方式2:八位自动重装
TH1=0xfd; //波特率9600bps/s
TL1=0xfd; //
TR1=1;
REN=1; //允许接收
SM1=1; //设置串口工作方式1:10位异步通信
SM0=0; //
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
qian=a/0x1000;
bai=a%0x1000/0x100;
shi=a%0x1000%0x100/0x10;
ge=a%0x1000%0x100%0x10;
P0=0xff;
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=table[qian];
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=table[bai];
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=0xfb;
wei=0;
duan=1;
P0=table[shi];
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=0xf7;
wei=0;
duan=1;
P0=table[ge];
duan=0;
delay(5);
}
}
void uart() interrupt 4
{
if(RI)
{
a=SBUF; //单片机从缓冲区取出接收到的数据a
RI=0;
SBUF=a; //单片机把数据a送到缓冲区 即发送数据给上位机
while(!TI);
TI=0;
}
}
所以想请教下怎么做到,甚至输入任意8位数都能在数码管显示。下面附代码。
#include<reg52.h>
#define uc unsigned char
#define ui unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
uc code table[]= //代码表
{
/*0 1 2 3*/
0x3f,0x06,0x5b,0x4f,
/*4 5 6 7*/
0x66,0x6d,0x7d,0x07,
/*8 9 A B*/
0x7f,0x6f,0x77,0x7c,
/*C D E F 不显示*/
0x39,0x5e,0x79,0x71,0
};
ui a;
uc qian,bai,shi,ge;
void delay(uc z)
{
uc x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void init()
{
TMOD=0x20; //设置定时器1 工作方式2:八位自动重装
TH1=0xfd; //波特率9600bps/s
TL1=0xfd; //
TR1=1;
REN=1; //允许接收
SM1=1; //设置串口工作方式1:10位异步通信
SM0=0; //
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
qian=a/0x1000;
bai=a%0x1000/0x100;
shi=a%0x1000%0x100/0x10;
ge=a%0x1000%0x100%0x10;
P0=0xff;
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=table[qian];
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=table[bai];
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=0xfb;
wei=0;
duan=1;
P0=table[shi];
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=0xf7;
wei=0;
duan=1;
P0=table[ge];
duan=0;
delay(5);
}
}
void uart() interrupt 4
{
if(RI)
{
a=SBUF; //单片机从缓冲区取出接收到的数据a
RI=0;
SBUF=a; //单片机把数据a送到缓冲区 即发送数据给上位机
while(!TI);
TI=0;
}
}
PS手机回复,有错字包含,高手可以略过。
qian,bai,shi,ge的除法应该不对
消隐时间设定的可以加长试试。
初学者可以用,这种程序上不了产品
你那个除法运算里面不用带0x,0x是十六进制
可以的,我试过,问题应该不在这。我认为自己问题是不会发送接收多帧数据,希望得到这方面的支持。
就是初学..请问你有办法能解决问题么?
不是这个问题。问题在于目前我无法正确显示千位跟百位,而十位跟个位是正确的。
可能你没有理解我的意思。我想向单片机串口发送16进制数(这个数实际是我要在数码管上显示的),所以才这样操作。为的是将输入的数字分离,利用数码换的数字表输出。
高手帮帮忙。
给图啊 有图方便别人理解啊
这个问题主要在串口接收程序里~
能说的详细些么
其实目的不复杂额 补充下我的硬件信息:数码管是8位共阴的 单片机是STC89C52的
需要将数据一位一位的发送
我只是路过打酱油的,嘿嘿