基于51单片机的8位数码管时钟设计—按键修改时间

基于51单片机的8位数码管时钟设计—按键修改时间


  • 🎞仿真图演示
    在这里插入图片描述

📝共阳极数码管程序源码

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
169
170
#include <reg51.h>

typedef unsigned char uchar;
typedef unsigned int uint;

//按键定义
sbit key_stop = P2^0;
sbit key_star = P2^1;
sbit key_fen = P2^2;
sbit key_shi = P2^3;

//0~9的十六进制数码
uchar code num[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0~9 7SegCA共阳数码管
//unsigned char code num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴0-F段码,加code是存在rom里面
//秒、分、时标志
uchar miao = 0, fen = 0, shi = 0;

//秒、分、时高位低位
uchar miao_L, miao_H, fen_L, fen_H, shi_L, shi_H;

//计数
uint counter = 0;

void delay(uint x){ //毫秒延时函数
unsigned int i=0,j=0;
for(i=0;i<x;i++)
for(j=0;j<123;j++);
;
}//delay

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

void T0\_Init(){ //定时器0初始化

TMOD = 0x01;
TH0 = 0x3c;
TL0 = 0xb0;
EA = 1; //开总中断
ET0 = 1;
TR0 = 1;
}

void display(){ //显示函数

P1 = 0x20; //0010 0000
P0 = 0xbf;
delay(5);

P1 = 0x04; //0100
P0 = 0xbf;
delay(5);

P1 = 0x80; // 1000 0000
P0 = num[miao_L];
delay(5);

P1 = 0x40; // 0100 0000
P0 = num[miao_H];
delay(5);

P1 = 0x10; // 0001 0000
P0 = num[fen_L];
delay(5);

P1 = 0x08; // 0000 1000
P0 = num[fen_H];
delay(5);

P1 = 0x02; // 0000 0010
P0 = num[shi_L];
delay(5);

P1 = 0x01; // 0000 0001
P0 = num[shi_H];
delay(5);

}

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 main(){

T0\_Init();

while(1){

display(); //数码管显示
keyscan(); //按键扫描
}

}

void timer0\_Init() interrupt 1{ //定时器0中断函数

TL0 =(65536-50000)%256;//50ms预装载值
TH0 =(65536-50000)/256;
counter++;
//1秒钟=50ms\*20=1000ms,20次计数为1秒钟
if(counter == 20){
counter = 0;
miao++; //i = 100

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;

}
}


  • 📚共阳数码管程序和仿真文件
1
2
3
4

链接: https://pan.baidu.com/s/1CvmmmtlBHaVUSMrEtdJx-Q
提取码: nsrz

📝共阴极数码管程序代码

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
169
170
171
172
173
174
175
176
177
178
179
180
#include <reg51.h>

typedef unsigned char uchar;
typedef unsigned int uint;

//按键定义
sbit key_stop = P2^0;
sbit key_star = P2^1;
sbit key_fen = P2^2;
sbit key_shi = P2^3;

//0~9的十六进制数码
//uchar code num[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0~9 7SegCA共阳数码管
//1100 0000,1001 1111,
unsigned char code num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴0-F段码,加code是存在rom里面
//秒、分、时标志
uchar miao = 0, fen = 0, shi = 0;

//秒、分、时高位低位
uchar miao_L, miao_H, fen_L, fen_H, shi_L, shi_H;

//计数
uint counter = 0;


void delay(uint x){ //毫秒延时函数
unsigned int i=0,j=0;
for(i=0;i<x;i++)
for(j=0;j<123;j++);
;
}//delay

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

void T0\_Init(){ //定时器初始化

TMOD = 0x01;
TH0 = 0x3c;
TL0 = 0xb0;
EA = 1; //开总中断
ET0 = 1;
TR0 = 1;
}//T0\_Init

void display(){ //显示函数

//P1 = 0x20; //0010 0000
P1 =0xdf;
P0 = 0x40; //段选显示-
delay(2);

// P1 = 0x04; //位选0000 0100
P1 =0xfb;
P0 = 0x40;//段选显示-
delay(2);

//P1 = 0x40; // 1000 0000
P1=0X7F;
P0 = num[miao_L];
delay(2);

// P1 = 0x80; // 0100 0000
P1=0XBF;
P0 = num[miao_H];
delay(2);

// P1 = 0x08; // 0001 0000
P1=0XEF;
P0 = num[fen_L];
delay(2);

// P1 = 0x10; // 0000 1000
P1=0XF7;
P0 = num[fen_H];
delay(2);

// P1 = 0x01; // 0000 0010
P1=0XFD;
P0 = num[shi_L];
delay(5);

// P1 = 0x02; // 0000 0001
P1=0XFE;
P0 = num[shi_H];
delay(5);

}//display

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 main(){

T0\_Init();

while(1){

display();
keyscan();
}

}

void timer0\_Init() interrupt 1{ //中断函数

TL0 =(65536-50000)%256;//50ms预装载值
TH0 =(65536-50000)/256;
counter++;
//1秒钟=50ms\*20=1000ms,20次计数为1秒钟
if(counter == 20){
counter = 0;
miao++; //i = 100

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;

}
}//timer0\_Init