基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间

基于51单片机定时器计数+2片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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "at89x52.h"
/\*\*74hc595引脚定义\*\*/
sbit SHCP =P0^1; // 移位寄存器的时钟输入
sbit STCP =P0^2 ; // 存储寄存器的时钟输入
sbit DS =P0^0;
//按键定义
sbit key_stop = P1^0;
sbit key_star = P1^1;
sbit key_fen = P1^2;
sbit key_shi = P1^3;
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 keyscan(); //按键函数
void key\_delay(int xms); //按键延时函数 x ms
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;
}
// display();
}

void main(void)
{
TimerInit();

while(1){
update(DBuf,shi,fen,miao);
Display(DBuf);
keyscan(); //按键函数
}
}

void keyscan(){ //按键函数

if(key_stop == 0){
key\_delay(10);
if(key_stop == 0){
EA = 0; //关总中断,即停止
while(!key_stop);
}
}//key\_stop

if(key_star == 0){
key\_delay(10);
if(key_star == 0){
EA = 1; //开总中断
while(!key_star);
}
}//key\_star

if(key_fen == 0){
key\_delay(10);
if(key_fen == 0){
fen++;
while(!key_fen);
}
}//key\_fen++

if(key_shi == 0){
key\_delay(10);
if(key_shi == 0){
shi++;
while(!key_shi);
}
}//key\_shi++
}
void key\_delay(int xms){ //按键延时函数 x ms
unsigned int i, j;
for(i=0; i<xms; ++i)
for(j=0; j<110; ++j)
;
}//key\_delay