89c52数码管电子闹钟
时间: 2024-01-08 19:19:16 浏览: 29
以下是89c52数码管电子闹钟的介绍:
这个电子闹钟可以显示时分秒和年月日,并且可以调节闹钟时间。它还有整点报时功能,程序简单易懂,所用器件为LCD1602和89c52。
不过,根据引用所述,这个电子闹钟存在一些问题。按键控制的功能太多导致时钟和闹铃转换的时候进行加加或者减减的时候容易跳模式。如果去掉闹钟功能剩下的其他功能都正常的。
因此,如果你想制作89c52数码管电子闹钟,需要注意按键控制的功能设计,以避免出现上述问题。
相关问题
89c52数码管电子时钟
这是一个基于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;
}
```
89c52数码管显示日历代码
89C52是一种常见的单片机芯片,它具有8位数据总线和52KB的闪存。如果你想要编写89C52数码管显示日历的代码,你可以按照以下步骤进行:
1. 首先,你需要连接数码管到89C52芯片的输出引脚。具体的引脚连接方式可以参考数码管的数据手册。
2. 在编写代码之前,你需要了解数码管的工作原理和显示方式。通常,数码管是通过依次点亮不同的段来显示数字或字符。
3. 在89C52芯片上,你需要使用GPIO(通用输入输出)引脚来控制数码管的段选和位选。你可以通过设置相应的引脚为输出模式,并将其输出高低电平来控制数码管的显示。
4. 接下来,你需要编写代码来实现日历的功能。你可以使用89C52芯片的定时器来获取当前的时间和日期,并将其转换为数码管可以显示的格式。
5. 在代码中,你需要定义一个数组或者字符串来存储数码管显示的内容。根据当前的时间和日期,你可以将相应的数字或字符存储到数组中。
6. 最后,你需要编写一个循环来不断更新数码管的显示内容。在每次循环中,你可以根据当前的时间和日期从数组中读取相应的内容,并将其输出到数码管上。
这只是一个简单的概述,实际编写代码时可能还需要考虑其他因素,如按键输入、闹钟功能等。具体的代码实现可能会因个人需求和硬件连接方式而有所不同。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)