89c52数码管电子时钟
时间: 2024-01-19 14:16:14 浏览: 24
这是一个基于89c52单片机的数码管电子时钟,使用ds1302计时器。以下是该电子时钟的主要功能和实现方法:
1. 显示时间:使用数码管显示当前时间,包括小时、分钟和秒。
2. 显示日期:使用数码管显示当前日期,包括年、月和日。
3. 调整时间:通过按键调整当前时间和日期。
4. 闹钟功能:设置闹钟时间,到达闹钟时间后会有提示音。
5. 温度显示:使用数码管显示当前温度。
以下是该电子时钟的部分代码实现:
```c
#include "reg52.h"
#include "ds1302.h"
#include "key.h"
#include "smguan.h"
// 定义全局变量
unsigned char year, month, day, hour, minute, second;
unsigned char alarm_hour, alarm_minute;
unsigned char temperature;
// 主函数
void main()
{
// 初始化ds1302
ds1302_init();
// 初始化按键
key_init();
// 循环显示时间和日期
while (1)
{
// 读取时间和日期
ds1302_read_time(&year, &month, &day, &hour, &minute, &second);
// 显示时间和日期
DigDisplay();
datapros();
datayears();
// 延时1秒
delay(1000);
// 读取温度
temperature = ds18b20_read();
// 显示温度
DigDisplay();
display_temp(temperature);
// 延时1秒
delay(1000);
// 判断是否到达闹钟时间
if (hour == alarm_hour && minute == alarm_minute)
{
// 播放提示音
beep_on();
delay(1000);
beep_off();
}
// 调整时间和日期
if (key_scan() == 1)
{
// 调整小时
hour++;
if (hour >= 24)
{
hour = 0;
}
ds1302_write_time(year, month, day, hour, minute, second);
}
else if (key_scan() == 2)
{
// 调整分钟
minute++;
if (minute >= 60)
{
minute = 0;
}
ds1302_write_time(year, month, day, hour, minute, second);
}
else if (key_scan() == 3)
{
// 调整年份
year++;
if (year >= 100)
{
year = 0;
}
ds1302_write_time(year, month, day, hour, minute, second);
}
else if (key_scan() == 4)
{
// 调整月份
month++;
if (month >= 13)
{
month = 1;
}
ds1302_write_time(year, month, day, hour, minute, second);
}
else if (key_scan() == 5)
{
// 调整日期
day++;
if (day >= 32)
{
day = 1;
}
ds1302_write_time(year, month, day, hour, minute, second);
}
else if (key_scan() == 6)
{
// 设置闹钟时间
alarm_hour = hour;
alarm_minute = minute;
}
}
}
// 显示时间
void datapros()
{
unsigned char shi, ge;
shi = hour / 10;
ge = hour % 10;
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
shi = minute / 10;
ge = minute % 10;
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
}
// 显示日期
void datayears()
{
unsigned char shi, ge;
shi = year / 10;
ge = year % 10;
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
shi = month / 10;
ge = month % 10;
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
shi = day / 10;
ge = day % 10;
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
}
// 数码管显示函数
void DigDisplay()
{
unsigned char i;
for (i = 0; i < 8; i++)
{
P0 = 0x7f;
P2 = i;
P0 = smgduan[i];
delay(1);
}
}
// 闹钟函数
void clockpros()
{
unsigned char shi, ge;
shi = alarm_hour / 10;
ge = alarm_hour % 10;
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
shi = alarm_minute / 10;
ge = alarm_minute % 10;
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
}
// 温度显示函数
void display_temp(unsigned char temp)
{
unsigned char shi, ge;
shi = temp / 10;
ge = temp % 10;
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
display(shi);
display(ge);
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
DigDisplay();
}
// 声音提示函数
void beep_on()
{
P1 = 0x00;
}
void beep_off()
{
P1 = 0xff;
}
// 将BCD码转换为十进制数
unsigned char BCD_shi(unsigned char bcd)
{
unsigned char shi;
shi = bcd >> 4;
shi = shi * 10;
return shi;
}
// 将十进制数转换为BCD码
unsigned char shi_BCD(unsigned char shi)
{
unsigned char bcd;
bcd = shi / 10;
bcd = bcd << 4;
bcd = bcd | (shi % 10);
return bcd;
}
```