基于C51单片机用C语言写出一个满24小时清零的定时电子钟
时间: 2024-02-11 20:05:17 浏览: 75
基于c51单片机设计的电子秤,源码+仿真
5星 · 资源好评率100%
好的,下面是一份基于C51单片机用C语言编写的满24小时清零的定时电子钟的代码:
```c
#include <reg52.h>
// 定义数码管端口
sbit D1 = P2^0;
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
// 定义按键端口
sbit Key1 = P1^0; // 按键1
sbit Key2 = P1^1; // 按键2
// 定义全局变量
unsigned char code table[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
}; // 数码管显示表
unsigned char code hour_table[] = {
0x00, // 0小时
0x01, // 1小时
0x02, // 2小时
0x03, // 3小时
0x04, // 4小时
0x05, // 5小时
0x06, // 6小时
0x07, // 7小时
0x08, // 8小时
0x09, // 9小时
0x10, // 10小时
0x11, // 11小时
0x12, // 12小时
0x13, // 13小时
0x14, // 14小时
0x15, // 15小时
0x16, // 16小时
0x17, // 17小时
0x18, // 18小时
0x19, // 19小时
0x20, // 20小时
0x21, // 21小时
0x22, // 22小时
0x23 // 23小时
}; // 小时显示表
unsigned char code minute_second_table[] = {
0x00, // 0分或0秒
0x01, // 1分或1秒
0x02, // 2分或2秒
0x03, // 3分或3秒
0x04, // 4分或4秒
0x05, // 5分或5秒
0x06, // 6分或6秒
0x07, // 7分或7秒
0x08, // 8分或8秒
0x09, // 9分或9秒
0x10, // 10分或10秒
0x11, // 11分或11秒
0x12, // 12分或12秒
0x13, // 13分或13秒
0x14, // 14分或14秒
0x15, // 15分或15秒
0x16, // 16分或16秒
0x17, // 17分或17秒
0x18, // 18分或18秒
0x19, // 19分或19秒
0x20, // 20分或20秒
0x21, // 21分或21秒
0x22, // 22分或22秒
0x23, // 23分或23秒
0x24, // 24分或24秒
0x25, // 25分或25秒
0x26, // 26分或26秒
0x27, // 27分或27秒
0x28, // 28分或28秒
0x29, // 29分或29秒
0x30, // 30分或30秒
0x31, // 31分或31秒
0x32, // 32分或32秒
0x33, // 33分或33秒
0x34, // 34分或34秒
0x35, // 35分或35秒
0x36, // 36分或36秒
0x37, // 37分或37秒
0x38, // 38分或38秒
0x39 // 39分或39秒
}; // 分钟和秒钟显示表
unsigned char hour = 0; // 小时
unsigned char minute = 0; // 分钟
unsigned char second = 0; // 秒钟
// 延时函数
void Delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 120; j++);
}
}
// 数码管显示函数
void Display(unsigned char h, unsigned char m, unsigned char s) {
D1 = 1; // 第一位数码管
P0 = hour_table[h / 10]; // 显示小时的十位
Delay(5);
D1 = 0;
D2 = 1; // 第二位数码管
P0 = hour_table[h % 10]; // 显示小时的个位
Delay(5);
D2 = 0;
D3 = 1; // 第三位数码管
P0 = minute_second_table[m / 10]; // 显示分钟的十位或秒钟的十位
Delay(5);
D3 = 0;
D4 = 1; // 第四位数码管
P0 = minute_second_table[m % 10]; // 显示分钟的个位或秒钟的个位
Delay(5);
D4 = 0;
}
// 定时器0中断函数
void Timer0_ISR() interrupt 1 {
TH0 = (65536 - 1000) / 256; // 重新赋值TH0,实现1ms的定时
TL0 = (65536 - 1000) % 256;
second++; // 秒钟加1
if (second >= 60) { // 如果秒钟达到60,进位到分钟
second = 0;
minute++;
if (minute >= 60) { // 如果分钟达到60,进位到小时
minute = 0;
hour++;
if (hour >= 24) { // 如果小时达到24,清零
hour = 0;
}
}
}
if (Key1 == 0) { // 按键1按下,小时加1
Delay(10); // 延时10ms消除按键抖动
if (Key1 == 0) {
hour++;
if (hour >= 24) { // 如果小时达到24,清零
hour = 0;
}
}
}
if (Key2 == 0) { // 按键2按下,分钟加1
Delay(10); // 延时10ms消除按键抖动
if (Key2 == 0) {
minute++;
if (minute >= 60) { // 如果分钟达到60,进位到小时
minute = 0;
hour++;
if (hour >= 24) { // 如果小时达到24,清零
hour = 0;
}
}
}
}
Display(hour, minute, second); // 显示时间
}
// 主函数
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 1000) / 256; // 定时器初值
TL0 = (65536 - 1000) % 256;
IE = 0x82; // 开启定时器0中断和总中断
TR0 = 1; // 启动定时器0
while (1) {} // 主循环
}
```
这份代码使用了定时器0和两个按键,可以实现满24小时清零的定时电子钟功能。其中,定时器0每1ms产生一次中断,通过累加计时来更新时钟显示;按键1和按键2分别用来调整小时和分钟,实现时间的调整。
阅读全文