本帖最后由 骆海洋 于 2017-2-1 15:44 编辑
六位数码管动态扫描
- 我们的板子上的74HC138芯片不能一次输出六个低电平,要想同是用到六个数码管就要用到动态扫描(即使能同时打开数码管显示的也是一样的),单片机能够承受的电流是50mA左右,但是一位数码管正常的电流就达到60多mA,超出了单片机的安全电流,我们的板子上用到了74HC245来驱动,这样就能安全的点亮我们的数码管。
- 我们的数码管用的是共阳意思就是为低电平是点亮。
- 数码管动态扫描用到了视觉暂留现象原理,即:刷新频率在100Hz(10ms)以上就感觉不到闪烁,这次程序6ms刷新一遍。
- 真值表
数字或字母 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 对应的十六进制 | 0xC0 | 0xF9 | 0xA4 | 0xB0 | 0x99 | 0x92 | 0x82 | 0xF8 | 0x80 | 0x90 | 0x88 | 0x83 | 0xC6 | 0xA1 | 0x86 | 0x8E |
- 程序如下:
- #include <STC12C5A60S2.H>
- 定义引脚
- sbit ADDR0 = P2^0;
- sbit ADDR1 = P2^1;
- sbit ADDR2 = P2^2;
- sbit ENLED = P1^1;
- 初始化数组
- unsigned char code LedChar[] =
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- 数码管显示缓存区,0xff保证刚开始是熄灭状态
- unsigned char LedBuff[6] =
- {0xff,0xff,0xff,0xff,0xff,0xff};
- void main () 主函数
- {
- unsigned char i = 0;
- unsigned int cnt = 0;
- unsigned long sec = 0;
-
- ENLED = 0;
- TMOD = 0x01; 选择定时器模式
- TH0 = 0xf5; 定时1ms
- TL0 = 0x96;
- TR0 = 1; 打开定时器1
-
- while(1) 无限循环
- {
- if(TF0 == 1)
- {
- TF0 = 0;
- TH0 = 0xf5;
- TL0 = 0x96;
- cnt++;
- if (cnt >= 1000)
- {
- cnt = 0;
- sec++; 一秒钟sec加1
- 给LedBuff显示缓存区赋值
- LedBuff[0] = LedChar[sec%10];
- LedBuff[1] = LedChar[sec/10%10];
- LedBuff[2] = LedChar[sec/100%10];
- LedBuff[3] = LedChar[sec/1000%10];
- LedBuff[4] = LedChar[sec/10000%10];
- LedBuff[5] = LedChar[sec/100000%10];
- }
- 数码管一秒钟刷新一位,六秒刷新一遍
- if(i == 0)
- {ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;i++; P0 = LedBuff[0];}
- else if(i == 1)
- {ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;i++; P0 = LedBuff[1];}
- else if(i == 2)
- {ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;i++; P0 = LedBuff[2];}
- else if(i == 3)
- {ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;i++; P0 = LedBuff[3];}
- else if(i == 4)
- {ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;i++; P0 = LedBuff[4];}
- else if(i == 5)
- {ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;i = 0; P0 = LedBuff[5];}
- }
- }
- }
- 本程序借鉴《手把手教你学51单片机》
- 如果有错误的地方还请大神指正。
|