LED数码管的显示和驱动原理是电子工程师必需熟练撑握的,对于单个数码管来说,点亮不同的LED段,就能形成相对应的数字,比如下图中,点亮BC两个段就是显示的数字1,点亮abdeg这几个段就是显示数字2,这个很容易理解。
7段数码管

而对于两位一体的数码管有共阴和共阳之分,共阳的内部电路结构如下图所示,这种就需要控制器对这两个数码管进行不同时间段的轮流显示,而轮流显示的频率要大于人眼能感觉到的闪烁频率。

下图是proteus的电路原理图

下面是C语言程序源代码
  1. //用AT89C52实现的两位共阳数码管显示程序
  2. #include <reg52.h>
  3. #include <type_def.h>
  4. #include <intrins.h>
  5. extern void Delay10ms(void);
  6. extern void display(UINT8 number);
  7. sbit SW                 = P1^7;
  8. sbit LED_GREEN         = P2^3;
  9. sbit BUZZER         = P2^4;
  10. sbit WEI_SHI    = P2^5;
  11. sbit WEI_GE     = P2^6;
  12.   
  13. int tcount = 0;//记录经过的10ms区间段个数
  14. UINT8 add_cnt = 0;
  15. UINT8 num = 0;
  16. UINT8 code num_table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  
  17. void T0_INT() interrupt 1 //timer0中断, 每10ms触发一次
  18. {
  19.     TR0 = 0;//关闭timer0
  20.     TH0 = 0xD8;
  21.     TL0 = 0xF0;//65536 - 10000 = 55536
  22.     if(tcount > 0)
  23.     {
  24.         tcount ++;
  25.     }
  26.     if(tcount > 11) //10ms * 10 = 100ms
  27.     {
  28.         tcount = 0;
  29.                 BUZZER = 1;
  30.                 LED_GREEN = 1;
  31.     }
  32.     display(num);
  33.     TR0 = 1;//重新开启timer0
  34. }
  35. void display(UINT8 num)
  36. {
  37.     if (!add_cnt)
  38.     {
  39.         P0 = 0xff;                  //关8个段码
  40.         WEI_SHI = 1;                //打开十位的数码管共阳极公共端
  41.         WEI_GE = 0;
  42.         P0 = num_table[num/10];     //显示的十位数字
  43.         add_cnt = 1;
  44.     }
  45.     else
  46.     {
  47.         P0 = 0xff;                  //关8个段码
  48.         WEI_SHI = 0;                //关十位的数码管
  49.         WEI_GE = 1;                 //打开个位的数码管共阳极公共端
  50.         P0 = num_table[num%10];     //显示的个位数字
  51.         add_cnt = 0;
  52.     }
  53. }
  54. void Delay10ms(void)                    //@12.000MHz
  55. {
  56.         unsigned char i, j;
  57.         i = 20;
  58.         j = 113;
  59.         do
  60.         {
  61.                 while (--j);
  62.         } while (--i);
  63. }
  64. main()
  65. {
  66.         BUZZER = 1;
  67.         LED_GREEN = 1;
  68.     TMOD = 0x01;
  69.     TH0 = 0xD8;
  70.     TL0 = 0xF0;     //65536 - 10000 = 55536
  71.     IE = 0x82;      //EA + ET0 --> 1000 0010
  72.     TR0 = 1;        //开启timer0
  73.    
  74.     while(1){
  75.         if(0 == SW){
  76.             Delay10ms();
  77.             if(0 == SW){
  78.                while(0 == SW){}
  79.                            BUZZER = 0;
  80.                            LED_GREEN = 0;
  81.                tcount = 1;
  82.                num++;
  83.                if (num > 99)
  84.                {
  85.                    num = 0;
  86.                }
  87.             }
  88.         }
  89.     }
  90.     return 1;
  91. }
来源:魔道电子