51单片机数码管倒计时!自己写的程序但输入后怎么都亮!#include<reg52.h>#d

51单片机数码管倒计时!自己写的程序但输入后怎么都亮!#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,numwe,numdu;uchar code table[]={0xf5,0x41,0xd6,0xcf,0x63,0xa7,0xb7,0x45,0xf3,0xe7};uchar code tablewe[]={0xbf,0xdf};void main(){ numdu=0; numwe=0; aa=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; while(1) { if(aa==20) { aa=0; numdu++; if(numdu==9) numdu=1; P1=table[numdu]; P0=tablewe[numwe]; numwe++; if(numwe==2) numwe=0; } } }void timer0() interrupt 1 { TH0=(65536-5000)/256; TL0=(65536-5000)%256; aa++; }

首先指出程序中明显的问题:
1.数字只能显示1~8,下面修改后显示0~9;当然这个不是问题;
2.主要问题:混淆了两位数码管动态显示的时间逻辑;显示的数字变化没有单独设置时间,以至于数字变化和数码管的短时间动态显示混淆了。
也就是数码管动态显示是根据人眼视觉效应原理,快速改变点亮第一个和点亮第二个数码管,实现看不到熄灭时候的那个数码管的效果,那么在这个时间值里面不可以加入改变显示内容的语句,也就是把显示数字0~9的语句从中提出来,例如延长变化的时间到0.5秒。
具体修改:在原来定义变量的语句里面增加bb函数;然后如下修改:
bb = 0;
P1=table[numdu];
while (1)
{
  if (aa==20)
  {
  aa=0;
  if (bb++ == 50) //10ms*50=500ms,半秒变化一次,改成100就是1秒
  {
  bb = 0;
  numdu++;
  if (numdu==10) numdu=0;
  P1=table[numdu];

  }

  P0=tablewe[numwe];
  numwe++;
  if (numwe==2) numwe=0;
  }
}
这样修改后的结果是:首先显示00,0.5秒后显示11,...
温馨提示:答案为网友推荐,仅供参考