C51电子时钟,闹钟,包含蜂鸣器,年月日星期时间,起码达到根据时间响铃的效果
时间: 2023-09-23 11:11:07 浏览: 198
要实现C51电子时钟和闹钟,我们可以采用以下步骤:
1. 硬件设计:将C51单片机与LCD液晶屏、蜂鸣器、DS1302时钟芯片等外设连接起来。
2. 软件设计:编写C语言程序,实现时钟显示、闹钟设置、闹钟响铃等功能。
其中,要实现根据时间响铃的效果,可以在闹钟设置时,读取当前时间并设置闹钟时间。然后在主函数中,循环读取当前时间,并与设置的闹钟时间进行比较。当时间到达闹钟时间时,触发蜂鸣器响铃。
下面是一个简单的C51电子时钟和闹钟的代码示例:
```
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
// DS1302时钟芯片相关声明
#define DS1302_SCLK P3_4
#define DS1302_IO P3_5
#define DS1302_RST P3_6
// LCD液晶屏相关声明
#define LCD_RS P2_7
#define LCD_RW P2_6
#define LCD_EN P2_5
#define LCD_DATAPINS P0
// 蜂鸣器相关声明
#define BUZZER P1_7
uchar code table[] = "0123456789"; // 数字表
// DS1302时钟芯片相关函数
void DS1302_WriteByte(uchar dat, uchar cmd);
uchar DS1302_ReadByte(uchar cmd);
void DS1302_Init();
void DS1302_SetTime();
void DS1302_GetTime(uchar *time);
// LCD液晶屏相关函数
void LCD_WriteCmd(uchar cmd);
void LCD_WriteData(uchar dat);
void LCD_Init();
void LCD_Clear();
void LCD_ShowStr(uchar x, uchar y, uchar *str);
// 蜂鸣器相关函数
void Buzzer_On();
void Buzzer_Off();
void main()
{
uchar time[8], alarm[8];
uchar buf[16];
// 初始化DS1302时钟芯片
DS1302_Init();
// 初始化LCD液晶屏
LCD_Init();
while (1) {
// 获取当前时间
DS1302_GetTime(time);
// 显示当前时间
sprintf(buf, "%02d:%02d:%02d", time[2], time[1], time[0]);
LCD_ShowStr(0, 0, buf);
// 获取闹钟时间
alarm[0] = 0; // 秒
alarm[1] = 0; // 分
alarm[2] = 7; // 时,这里设置为7点
alarm[3] = 0; // 日
alarm[4] = 0; // 月
alarm[5] = 0; // 年
// 判断是否到达闹钟时间
if (memcmp(time, alarm, sizeof(time)) == 0) {
Buzzer_On();
} else {
Buzzer_Off();
}
}
}
// DS1302时钟芯片相关函数
// 向DS1302写入1字节数据,cmd为命令字节,dat为数据字节
void DS1302_WriteByte(uchar dat, uchar cmd)
{
uchar i;
DS1302_RST = 0;
DS1302_SCLK = 0;
for (i = 0; i < 8; i++) {
DS1302_IO = (dat & 0x01);
dat >>= 1;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
DS1302_RST = 1;
DS1302_IO = cmd;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
// 从DS1302读取1字节数据,cmd为命令字节
uchar DS1302_ReadByte(uchar cmd)
{
uchar i, dat = 0;
DS1302_RST = 0;
DS1302_SCLK = 0;
for (i = 0; i < 8; i++) {
dat >>= 1;
if (DS1302_IO) dat |= 0x80;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
DS1302_RST = 1;
DS1302_IO = cmd;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
return dat;
}
// 初始化DS1302时钟芯片
void DS1302_Init()
{
DS1302_WriteByte(0x8e, 0x00); // 写入允许写入指令
DS1302_WriteByte(0x80, 0x80); // 关闭写保护
DS1302_WriteByte(0x90, 0x80); // 启动时钟芯片
}
// 设置DS1302时钟芯片的时间
void DS1302_SetTime()
{
uchar time[7];
time[0] = 0; // 秒
time[1] = 30; // 分
time[2] = 12; // 时
time[3] = 5; // 日
time[4] = 6; // 月
time[5] = 21; // 年
time[6] = 0; // 星期,这里不用设置,DS1302会自动计算
DS1302_WriteByte(0x8e, 0x00); // 写入允许写入指令
DS1302_WriteByte(table[time[0] % 10], 0x80); // 秒的个位
DS1302_WriteByte(table[time[0] / 10], 0x82); // 秒的十位
DS1302_WriteByte(table[time[1] % 10], 0x84); // 分的个位
DS1302_WriteByte(table[time[1] / 10], 0x86); // 分的十位
DS1302_WriteByte(table[time[2] % 10], 0x88); // 时的个位
DS1302_WriteByte(table[time[2] / 10], 0x8a); // 时的十位
DS1302_WriteByte(table[time[3] % 10], 0x8c); // 日的个位
DS1302_WriteByte(table[time[3] / 10], 0x8e); // 日的十位
DS1302_WriteByte(table[time[4] % 10], 0x90); // 月的个位
DS1302_WriteByte(table[time[4] / 10], 0x92); // 月的十位
DS1302_WriteByte(table[time[5] % 10], 0x94); // 年的个位
DS1302_WriteByte(table[time[5] / 10], 0x96); // 年的十位
DS1302_WriteByte(0x80, 0x80); // 关闭写保护
}
// 获取DS1302时钟芯片的时间
void DS1302_GetTime(uchar *time)
{
uchar i;
for (i = 0; i < 7; i++) {
*(time + i) = DS1302_ReadByte(0x81 + i * 2);
*(time + i) = ((*(time + i) >> 4) * 10 + (*(time + i) & 0x0f));
}
}
// LCD液晶屏相关函数
// 向LCD液晶屏写入命令
void LCD_WriteCmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATAPINS = cmd;
LCD_EN = 1;
LCD_EN = 0;
}
// 向LCD液晶屏写入数据
void LCD_WriteData(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATAPINS = dat;
LCD_EN = 1;
LCD_EN = 0;
}
// 初始化LCD液晶屏
void LCD_Init()
{
LCD_WriteCmd(0x38); // 8位数据总线,2行显示,5×7点阵字符
LCD_WriteCmd(0x0c); // 显示开,光标关,光标闪烁关
LCD_WriteCmd(0x06); // 光标右移,字符不移动
LCD_WriteCmd(0x01); // 清屏
}
// 清除LCD液晶屏上的内容
void LCD_Clear()
{
LCD_WriteCmd(0x01); // 清屏
}
// 在LCD液晶屏上显示字符串
void LCD_ShowStr(uchar x, uchar y, uchar *str)
{
uchar i;
if (y == 0) {
LCD_WriteCmd(0x80 + x); // 第一行
} else {
LCD_WriteCmd(0xc0 + x); // 第二行
}
for (i = 0; i < strlen(str); i++) {
LCD_WriteData(*(str + i));
}
}
// 蜂鸣器相关函数
// 打开蜂鸣器
void Buzzer_On()
{
BUZZER = 1;
}
// 关闭蜂鸣器
void Buzzer_Off()
{
BUZZER = 0;
}
```
这个代码示例可以实现基本的电子时钟和闹钟功能,你可以根据自己的实际需求进行修改和完善。
阅读全文