基于51单片机定时器计数+74HC595移位寄存器+8位数码管时钟

基于51单片机+74HC595移位寄存器+8位数码管时钟


  • 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <REGX52.H>
sbit SHCP = P0^1; // 移位寄存器的时钟输入
sbit STCP = P0^2; //存储寄存器的时钟输入
sbit DS = P0^0;
code unsigned char SegTab[17]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴数码管段码表
code unsigned char BitTab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选
data unsigned char DBuf[8]={0x00};
unsigned char miao=12,fen=26,shi=8;
//秒、分、时高位低位
unsigned char miao_L, miao_H, fen_L, fen_H, shi_L, shi_H;

void DelayXms(unsigned char ms){unsigned int dly;
while(ms--)
{dly = 100;
while(dly--){;}
}
}
void Driver595 (unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SHCP=0;
if(dat & 0x80)DS=1;
else DS=0;
SHCP=1;
dat <<=1;}
}
void Display(unsigned char\* ptr){
unsigned char i;
STCP=0;
for(i = 0;i < 8;i++)
{
Driver595(BitTab[i]);
Driver595(ptr[i]);
STCP=1;DelayXms(2);
STCP=0;}}
void update(unsigned char \*dst,unsigned char shi,unsigned char fen,unsigned char miao)
{
\*dst++ = SegTab[shi/10];
\*dst++ = SegTab[shi%10];
\*dst++ = 0x40;
\*dst++ = SegTab[fen/10];
\*dst++ = SegTab[fen%10];
\*dst++ = 0x40;
\*dst++ = SegTab[miao/10];
\*dst++ = SegTab[miao%10];
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名 : TimerInit
\* 函数功能 : 定时器0初始化
\* 参数 :无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void TimerInit()
{
TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0X3c; //给定时器赋初值,定时50ms 3CB0
TL0=0Xb0; //0X3CB0的十进制是15536 从15536计数到65536计数50000次 即50000us=50ms
ET0=1; //打开定时器0中断允许
EA=1; //打开总中断
TR0=1; //打开定时器

}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名 : Timer0()
\* 函数功能 : 定时器0中断函数
\* 参数 :无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Timer0() interrupt 1
{
unsigned char i;
TL0 =(65536-50000)%256;//50ms预装载值
TH0 =(65536-50000)/256;
i++;
if(i==20)//20个50毫秒即一秒
{
i=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)//定时一小时自动清零
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
fen =0;
miao = 0;
}
}
}
miao_L = miao%10;
miao_H = miao/10;

fen_L = fen%10;
fen_H = fen/10;

shi_L = shi%10;
shi_H = shi/10;
}
}

void main(void)
{
TimerInit();
while(1){
update(DBuf,shi,fen,miao);
Display(DBuf);}
}



📚程序源码和仿真资源

✨本示例基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1bLACqX6FliC-48lreZG0Iw 
提取码:gjze