蓝桥杯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