51单片机的程序(c语言版),用数码管进行倒计时。

#include<reg51.h>
unsigned char led_table[]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0,0x10};
sbit led_ten=P3^0;
sbit led_single=P3^1;

main()
{
char count;
unsigned char ten,single;
int displaycount;
count=30;
led_ten=0;
led_single=0;
while(1)
{
while(count>=0)
{
count--;

ten=count/10;
single=count%10;
for(displaycount=20000;displaycount>0;displaycount--)
{
P2=led_table[ten];
led_ten=1;
led_ten=0;
P2=led_table[single];
led_single=1;
led_single=0;
}
}
count=30;
}
}

for(displaycount=20000;displaycount>0;displaycount--)
{
P2=led_table[ten];
led_ten=1;
led_ten=0;
P2=led_table[single];
led_single=1;
led_single=0;
}
这一段表示什么意思?

第1个回答  2013-03-23
你是不是用2了锁存器啊。
P2=led_table[ten];
led_ten=1;//打开锁存器
led_ten=0;//关闭锁存期

存储10位
P2=led_table[single];
led_single=1;//打开锁存器
led_single=0;//关闭锁存器

存储个位
另外led_ten,led_single 你要先定义一下吧追问

模拟一个红绿灯路口的交替通行功能,每个路口通行30秒。
即:红数码管从30秒开始,逐一减到0,红数码管停止显示。蓝色数码管从30秒开始逐一减到0,蓝色数码管停止显示,红色数码管重新开始,并交替轮流
这个我弄不懂让数码管停止显示,display不是显示数据的意思么?我在想怎么让数码管30秒不显示?所以看不懂那段。

追答

错了 刚看到图 不是锁存器,你的那个液晶在Proteus名字是什么?

追问

数码管,7seg

追答

我搭建了一下试试,一直是乱码,因为两个数码管之前转换太快,所以不可能正常显示,建议加2个锁存器,或者用真实的硬件模拟一下,仿真软件在时间控制上真的不怎么好用。
你说的关闭,直接将那2个引脚拉低就好了。
还有就是数组好像不对
共阴0~9
unsigned char led_table[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};

追问

真心谢谢你,我已经知道了。非常感谢

追答

不客气

本回答被提问者采纳
第2个回答  2013-03-23
这个很简单,就是循环扫描两万次,要是扫描的次数少了,你的眼睛是看不到亮的,
led_single=1;//
led_single=0;//
这两句就是控制显示的=1者亮,0者关
显示两万次,
30的减一计数器,每减一就显示两万次,这个两万次也可能就一秒或几秒,看你单片机的时钟频率。追问

哦,明白了,谢谢。不过,我发现扫描的次数少,眼睛仍然看到亮啊,不过数字显示不规则。怎样才能让他不显示啊?

第3个回答  2013-03-23
数码管显示2个数字,共显示2万次。
第4个回答  2013-03-23
Led_ten ,Led_single 你要设置用来控制谁的信号?追问

模拟一个红绿灯路口的交替通行功能,每个路口通行30秒。
即:红数码管从30秒开始,逐一减到0,红数码管停止显示。蓝色数码管从30秒开始逐一减到0,蓝色数码管停止显示,红色数码管重新开始,并交替轮流

这个我弄不懂让数码管停止显示,display不是显示数据的意思么?我在想怎么让数码管30秒不显示?所以看不懂那段。