蓝桥杯51单片机定时器计时1秒数码管静态循环显示0到F+Proteus仿真
蓝桥杯51单片机定时器计时1秒数码管静态循环显示0到F+Proteus仿真
- Proteus仿真

实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| //数码管静态显示,0到F
#include<reg52.h>
typedef unsigned char u8;
unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f}; //共阳极数码管从0到F的真值
void TimeInit(); //定时器初始化函数 void HC138(u8 channel); //138译码器通道选择函数 void ShowSMG\_Bit(u8 date,u8 pos); //数码管显示函数
void main() { u8 cnt = 0; //记录T0中断次数 u8 sec =0; //记录经过的秒数
TimeInit(); //定时器初始化
while(1) { if(TF0 == 1) //判断T0是否溢出 { TF0 = 0; //T0溢出后,清楚中断标志 TH0 = (65536-2\*110592/12)/256; //重新加载初值 TL0 = (65536-2\*110592/12)%256; cnt++; if(cnt>=50) //判断是否达到50次,即一秒钟 { cnt = 0; //清零 ShowSMG\_Bit(LEDchar[sec],7); //数码管显示对应的秒数 sec++; //秒数记录加1 if(sec>=16) //秒数达到0x0F后,重新从0开始 { sec = 0; } } } } }
void HC138(u8 channel) { switch(channel) { case 4: P2 = (P2&0x1f)|0x80; //选择Y4对应模块(LED小灯) ,运算结果为P2高三位为100 break; case 5: P2 = (P2&0x1f)|0xa0; //选择Y5对应模块(蜂鸣器),运算结果为P2高三位为101 break; case 6: P2 = (P2&0x1f)|0xc0; //选择Y6对应模块(数码管的位选),运算结果为P2高三位为110 break; case 7: P2 = (P2&0x1f)|0xe0; //选择Y7对应模块(数码管的段选),运算结果为P2高三位为111 break; } }
void ShowSMG\_Bit(u8 date,u8 pos) { HC138(6); //Y6模块工作,数码管进行位选 P0 = 0x01<<pos; //数码管的位选传到P0口 HC138(7); //Y7模块工作,数码管进行段选 P0 = date; //当前数码管要显示数值对应的真值传到P0口 }
void TimeInit() { TMOD = (TMOD & 0xf0)|0x01; //设置定时器工作在模式1 TH0 = (65536-2\*110592/12)/256; //0xB8,定时20ms 0.02秒\*11059200 TL0 = (65536-2\*110592/12)%256; //0x00 TR0 = 1; //允许定时器T0工作 }
|
仿真资源和程序代码
1 2 3
| 链接:https://pan.baidu.com/s/1GZeJkoSzPbHhbR3kzo4Q8A 提取码:i4az
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!