关于51单片机软件延时并用数码管显示的问题,请各位高手指教!

2025-03-22 11:43:25
推荐回答(4个)
回答(1):

显示一位后,要有一个延时,之后再显示下一位。

必要时,还要加上消隐,之后再显示下一位。

否则,显示必然混乱,总是在交换显示内容,看不清楚。

void main()
{
ENLED = 0; ADDR3 = 1; /*38译码器使能*/
uchar num = 0, i;

while(1) {
num++;
if(num > 60) num = 0;

ge = num% 10;
shi = num / 10 % 10;

ADDR1 = 0; ADDR2 = 0;

for (i = 0; i < 200; i++) {
ADDR0 = 0; P0 = table1[ge]; delay(10); /*调用前面的一个软件延时子函数*/
ADDR0 = 1; P0 = table1[shi]; delay(10); /*调用前面的一个软件延时子函数*/
}
}
}

回答(2):

原因在此:
ADDR0=1;ADDR1=0;ADDR2=0;P0=table1[shi]; /*使用动态显示在P0口显示十位*/
上一语句是:ADDR0=0;ADDR1=0;ADDR2=0;P0=table1[ge];/*使用动态显示在P0口显示个位*/
就相当于你刚把个位送去显示,接着就把十位送显示,是不是后面送去的十位显示就把前面的内容覆盖了,而且单片机的这个执行是很快的,所以,人眼看的话就像你说的出现一闪而过了,是显示了,只是速度太快,看不清楚,几乎看不到。

解决的办法:
1、如果IO口够用的话,可以把两次送显分开,P0口控制显示个位,P1口控制显示十位,这样就不会出现覆盖。
2、你用38译码器的话,一个IO口也够了,比如你的P0口,低四位控制显示个位,高四位控制显示十位。table做一个就可以(从0-60),对照38译码器真值表,还有你的数码管是共阳还是共阴,就可以编写程序了。

具体的还得看你的硬件电路,因为没有原理图,上述所讲,难免有不当之处,不当之处请见谅,大家共同学习,共同交流,共同进步。

回答(3):

数码管显示个位时电平保持时间太短,显示个位后加一个小延时。
unsinged char i;

for(i=0;i<50;i++)
{
ADDR0=0;ADDR1=0;ADDR2=0;P0=table1[ge];/*使用动态显示在P0口显示个位*/
delay(50);
ADDR0=1;ADDR1=0;ADDR2=0;P0=table1[shi]; /*使用动态显示在P0口显示十位*/
delay(50);
}

回答(4):

这两位回答挺好的,数码管显示主要是需要延时和消影