利用51单片机,编写代码 设计一个具有闹铃功能的数字钟设计, 可以显示时分秒六位数字,可以调节时间和闹钟功能。
时间: 2024-03-26 21:38:20 浏览: 91
以下是一个简单的利用51单片机设计数字钟的代码,其中包括调节时间和闹钟功能:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管显示表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};
uchar Hour = 0, Minute = 0, Second = 0; // 初始时间为0时0分0秒
uchar SetHour = 0, SetMinute = 0, SetSecond = 0; // 调节时间的变量
uchar AlarmHour = 0, AlarmMinute = 0; // 闹钟的小时和分钟
sbit D1 = P2^0; // 数码管第1位
sbit D2 = P2^1; // 数码管第2位
sbit D3 = P2^2; // 数码管第3位
sbit D4 = P2^3; // 数码管第4位
sbit D5 = P2^4; // 数码管第5位
sbit D6 = P2^5; // 数码管第6位
void delay(uint i) { // 延时函数
while (i--);
}
void Display(uchar i, uchar j, uchar k, uchar l, uchar m, uchar n) { // 数码管显示函数
D1 = 0; P0 = table[i]; delay(5); D1 = 1;
D2 = 0; P0 = table[j]; delay(5); D2 = 1;
D3 = 0; P0 = table[k]; delay(5); D3 = 1;
D4 = 0; P0 = table[l]; delay(5); D4 = 1;
D5 = 0; P0 = table[m]; delay(5); D5 = 1;
D6 = 0; P0 = table[n]; delay(5); D6 = 1;
}
void InterruptTimer0() interrupt 1 { // 定时器0中断处理函数
TH0 = (65536 - 50000) / 256; // 50ms
TL0 = (65536 - 50000) % 256;
Second++;
if (Second == 60) { // 每增加60秒,分钟加1
Second = 0;
Minute++;
if (Minute == 60) { // 每增加60分钟,小时加1
Minute = 0;
Hour++;
if (Hour == 24) { // 每增加24小时,时间归0
Hour = 0;
}
}
}
}
void SetTime() { // 调节时间函数
while (1) {
if (P3 & 0x01) { // 按下S1,小时加1
delay(1000);
SetHour++;
if (SetHour == 24) {
SetHour = 0;
}
}
if (P3 & 0x02) { // 按下S2,分钟加1
delay(1000);
SetMinute++;
if (SetMinute == 60) {
SetMinute = 0;
}
}
if (P3 & 0x04) { // 按下S3,秒钟加1
delay(1000);
SetSecond++;
if (SetSecond == 60) {
SetSecond = 0;
}
}
if (P3 & 0x08) { // 按下S4,退出调节时间
delay(1000);
return;
}
Display(SetHour / 10, SetHour % 10, SetMinute / 10, SetMinute % 10, SetSecond / 10, SetSecond % 10);
}
}
void SetAlarm() { // 调节闹钟函数
while (1) {
if (P3 & 0x01) { // 按下S1,闹钟小时加1
delay(1000);
AlarmHour++;
if (AlarmHour == 24) {
AlarmHour = 0;
}
}
if (P3 & 0x02) { // 按下S2,闹钟分钟加1
delay(1000);
AlarmMinute++;
if (AlarmMinute == 60) {
AlarmMinute = 0;
}
}
if (P3 & 0x08) { // 按下S4,退出调节闹钟
delay(1000);
return;
}
Display(AlarmHour / 10, AlarmHour % 10, AlarmMinute / 10, AlarmMinute % 10, 0, 0);
}
}
void main() {
TMOD = 0x01; // 定时器0,模式1
TH0 = (65536 - 50000) / 256; // 50ms
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
while (1) {
if (!(P3 & 0x10)) { // 按下S5,调节时间
delay(1000);
SetTime();
}
if (!(P3 & 0x20)) { // 按下S6,调节闹钟
delay(1000);
SetAlarm();
}
Display(Hour / 10, Hour % 10, Minute / 10, Minute % 10, Second / 10, Second % 10);
if (AlarmHour == Hour && AlarmMinute == Minute && Second < 5) { // 闹钟响铃,持续5秒钟
P1 = 0xFF; // 发出蜂鸣器声音
delay(50000);
P1 = 0x00;
delay(50000);
}
}
}
```
以上代码只是一个简单的示例,实际上还可以进行更多的功能扩展和优化。
阅读全文