以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定

我知道我这个有问题,但至少应该能显示0-255的,可是结果只能显示一位,就是个位,十位和百位不停地闪动,请问问题在哪里?下面是我写的程序。。。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag,bai,shi,ge;
uint a;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void main()
{

TMOD=0X20;
TH1=0Xfd;
TL1=0Xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
bai=a/100;
shi=a%100/10;
ge=a%10;
display(bai,shi,ge);
SBUF=a;
while(!TI);
TI=0;
ES=1;

}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;

}void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;//消影
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;//消影
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;//消影
wela=1;
P0=0xfb;
wela=0;
delay(5);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

楼主的显示程序,放在了:if(flag==1) {......} ,语句中。
这样只有在收到数据后,才显示一遍,显示结束时,仅仅是显示个位,前两位,都消影了。
动态显示程序,必须不停的调用,才能看见各个位。
动态显示程序,应该放在条件语句的外面,如下:

while(1)
{
bai=a/100;
shi=a%100/10;
ge=a%10;
display(bai,shi,ge);//--放在这里,才能稳定的显示

if(flag==1)
{
ES=0;
flag=0;
bai=a/100;
shi=a%100/10;
ge=a%10;
display(bai,shi,ge);//放在这里,显示的机会太少了
SBUF=a;
while(!TI);
TI=0;
ES=1;
……
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-11
延时时间太短追问

应该不是吧,我把延长时间改成10,15结果都差不多啊,应该是程序哪里不对。。。

第2个回答  2012-04-10
实物还是仿真?追问

就是用这个程序来控制单片机实现啊。。。

追答

我用proteus仿真试过,不会闪。
但程序小改。实物你那样的消隐 应该没错
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
//P0=0xff;//消影
wela=1;
P0=0xfe;
wela=0;
delay(1);
P0=0x00;
dula=1;
P0=table[shi];
dula=0;
//P0=0xff;//消影
wela=1;
P0=0xfd;
wela=0;
delay(1);
P0=0x00;
dula=1;
P0=table[ge];
dula=0;
//P0=0xff;//消影
wela=1;
P0=0xfb;
wela=0;
delay(1);
P0=0x00;
}

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态...
估计是波特率的问题 12MHz晶振可以使用4800bsp的波特率 PCON=0x80;TH1 = 0xF3;TL1 = TH1;

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态...
while(!TI);TI=0;ES=1;……

题目:以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上...
以16进制发送一个0-65536之间的任一数:这题目本身是有问题的,因为超过255的数,要用两个字节了,就是需要发送两次。而你程序只接收一次,shu = SBUF;这是不可能的。发送两次,要分高8位和低8位,这还要确定是先发高8位,还是先发低8位。下一个问题是,看你的仿真图,是用虚拟终端发的,对...

以16进制发送一个0-255之间的任一数,当单片机收到后在数码管上动态显示...
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};\/\/共阳级数码管码表0-9uchar dat,bai,shi,ge,scan;void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);}void uart() interrupt 4{if(RI) { RI=0;

单片机串口通信问题,请求大侠帮忙!
以16进制发送一个0~65536之间的任意数,...--- 标准的串口,只能传输0~255之间的数。要想传送多字节的数据,就需要多次传送。这就必须制定通信协议。发送方,先向对方呼叫,待收到正确的回音后;再向对方发送“数据的字节数”;再向对方连续发送数据字节串,对方收到,存放到一个缓存空间;发送方...

...为什么数码管显示255。题目是以16进制数发送,数码管显示
就是不知道复位后,为什么数码管显示255。--你认为应该显示多少?是不是复位后,SBUF中的值变为255了?---你读出再显示一下看看。但是,复位后,SBUF中的值应该是随机的--怎么是随机?应该是0。这个程序,复位后,显示的是 num 的内容,和 SBUF 无关。只有当串口收到数据,发生串口中断之后...

请高手帮我解决一个51单片机程序 ,怎么达不到不到题目的要求
2、main()中:应接收2次后再调用init(),可以设定一个计数变量记录接收次数,计数到2后归0;3、单独再设一个uint变量或通过参数传递方式将两次计数得到的16位二进制数在init()函数中完成获取万千百十个的各位数字的运算。如果原来上位机连续发送0x55,0xAA而你的显示为170(0x55对应的85显示太快,...

为什么51单片机定时器计数值取出来之后会比初值还小
有两种可能会造成这种情况:1、定时计数器启动后会从初值开始每个机器周期+1,也就是从49806开始每个机器周期+1,等记到65535(0xFFFF)后下一个周期就会清零,即从0000H开始计数。所以工作方式1在定时中断响应函数中一开始都要重装初值,否则就从0开始了。你说的情况可能定时中断函数中没有重装初值或者...

现在的病毒和木马,有什么区别?
病毒与木马的区别 :1、病毒是当已感染的软件运行时,这些恶性程序向计算机软件添加代码,修改程序的工作方式,从而获取计算机的控制权。2、木马是指未经用户同意进行非授权操作的一种恶意程序。它们可能删除硬盘上的数据,使系统瘫痪,盗取用户资料等。木马程序不能独立侵入计算机,而是要依靠黑客来进行传播,...

...数码管显示电路。 设计要求:每隔2S显示数字加1,显示初值
void time1(void) interrupt 3 { TH1=(65536-5000)\/256; TL1=(65536-5000)%256; display(); } void init() { TMOD=0x11; EA=1; ET0=1; ET1=1; TR1=1; TR0=1; } main() { init(); while(1) { conv(shu); } } 本回答由提问者推荐 举报| 答案纠错 | 评论(4) 1 0 yying0907 ...

相似回答