写一个基于stc89c52单片机,DS1302芯片,LCD1602和buzzer的定时闹钟代码
时间: 2024-01-24 14:16:46 浏览: 33
很高兴为您提供一个基于stc89c52单片机,DS1302芯片,LCD1602和buzzer的定时闹钟代码。以下是代码:
```
#include <reg52.h>
#include "DS1302.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
uchar sec,min,hour,day,month,year,week;//时间信息
uchar alarm_sec,alarm_min,alarm_hour;//闹钟时间信息
uchar flag_alarm;//闹钟标志
uchar flag_buzz;//蜂鸣器标志
//延时函数
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
//检测按键
uchar Key_Scan(void)
{
uchar num=0;
if(KEY1==0)
{
Delay(10);
if(KEY1==0)
{
while(!KEY1);
num=1;
}
}
if(KEY2==0)
{
Delay(10);
if(KEY2==0)
{
while(!KEY2);
num=2;
}
}
if(KEY3==0)
{
Delay(10);
if(KEY3==0)
{
while(!KEY3);
num=3;
}
}
if(KEY4==0)
{
Delay(10);
if(KEY4==0)
{
while(!KEY4);
num=4;
}
}
return num;
}
//闹钟响铃函数
void alarm_buzz(void)
{
while(flag_buzz)
{
BUZZ=0;//蜂鸣器响
Delay(50);//延时50ms
BUZZ=1;//蜂鸣器不响
Delay(50);//延时50ms
}
}
//初始化函数
void init(void)
{
DS1302_init();//DS1302芯片初始化
LCD1602_init();//LCD1602液晶屏初始化
flag_alarm=0;//闹钟标志置0
flag_buzz=0;//蜂鸣器标志置0
}
//主函数
void main()
{
init();//初始化
while(1)
{
DS1302_get_time();//读取时间信息
sec=DS1302_data[0];
min=DS1302_data[1];
hour=DS1302_data[2];
day=DS1302_data[3];
month=DS1302_data[4];
year=DS1302_data[6];
week=DS1302_data[7];
LCD1602_display_time(hour,min,sec);//在LCD1602液晶屏上显示时间信息
if(flag_alarm==1)//闹钟标志为1,响铃
{
flag_buzz=1;//蜂鸣器标志置1
alarm_buzz();//闹钟响铃
flag_buzz=0;//蜂鸣器标志置0
flag_alarm=0;//闹钟标志置0
}
if(Key_Scan()==1)//设置闹钟
{
LCD1602_clear();//清空LCD1602液晶屏
LCD1602_write_string("Set Alarm:");//在LCD1602液晶屏上显示"Set Alarm:"
while(!KEY1)//等待KEY1按下
{
DS1302_get_time();//读取时间信息
sec=DS1302_data[0];
min=DS1302_data[1];
hour=DS1302_data[2];
LCD1602_display_time(hour,min,sec);//在LCD1602液晶屏上显示时间信息
if(Key_Scan()==2)//按下KEY2,设置闹钟秒
{
alarm_sec=sec;
LCD1602_set_cursor(0,1);//将光标移动到LCD1602液晶屏的第二行第一列
LCD1602_write_string("Set Sec:");//在LCD1602液晶屏上显示"Set Sec:"
while(!KEY2)//等待KEY2按下
{
DS1302_get_time();//读取时间信息
sec=DS1302_data[0];
LCD1602_display_time(hour,min,sec);//在LCD1602液晶屏上显示时间信息
if(Key_Scan()==3)//按下KEY3,闹钟秒数加1
{
alarm_sec++;
if(alarm_sec==60)
alarm_sec=0;
}
if(Key_Scan()==4)//按下KEY4,退出设置模式
break;
}
}
if(Key_Scan()==3)//按下KEY3,设置闹钟分
{
alarm_min=min;
LCD1602_set_cursor(0,1);//将光标移动到LCD1602液晶屏的第二行第一列
LCD1602_write_string("Set Min:");//在LCD1602液晶屏上显示"Set Min:"
while(!KEY3)//等待KEY3按下
{
DS1302_get_time();//读取时间信息
min=DS1302_data[1];
LCD1602_display_time(hour,min,sec);//在LCD1602液晶屏上显示时间信息
if(Key_Scan()==2)//按下KEY2,闹钟分钟数减1
{
alarm_min--;
if(alarm_min==255)
alarm_min=59;
}
if(Key_Scan()==4)//按下KEY4,退出设置模式
break;
}
}
if(Key_Scan()==4)//按下KEY4,退出设置模式
break;
}
}
if(hour==alarm_hour&&min==alarm_min&&sec==alarm_sec)//当前时间与闹钟时间相等,闹钟标志置1
{
flag_alarm=1;
}
alarm_hour=hour;//更新闹钟时间
alarm_min=min;
alarm_sec=sec;
}
}
```
注意:本代码中使用了DS1302.h和LCD1602.h头文件,需要在工程中引入这两个头文件。此外,需要将硬件连接好(如DS1302的引脚连接到单片机的P0口、P1口和P2口,LCD1602的引脚连接到单片机的P3口等)。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![](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)