标题:
基于单片机的定时闹钟代码 无原理图
[打印本页]
作者:
白羊leo
时间:
2023-6-9 16:08
标题:
基于单片机的定时闹钟代码 无原理图
这是基于单片机的定时闹钟设计,用的是ATC89C52RC,文件包括了代码。
单片机源程序如下:
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"
#include "Delay.h"
#include "Buzzer.h"
//#include "Clock.h"
unsigned char Key_Get,MODE; //MODE用作闹钟开关
unsigned char i,Tmp_Status,Tmp,Tmp_Set,Count,Tmp_Getin,Key_Set,Clk_Stop;
unsigned char Clk_Flag=0; //默认关闭闹钟 unused
/**
* @brief 显示实时时间
* @param 无
* @retval 无
*/
void TimeShow(void)
{
DS1302_ReadTime();//读取时间
LCD_ShowString(1,1,"RealTime: ");
LCD_ShowNum(2,1,DS1302_Time[0],2);//显示时
LCD_ShowNum(2,4,DS1302_Time[1],2);//显示分
LCD_ShowNum(2,7,DS1302_Time[2],2);//显示秒
}
/**
* @brief 闹钟开启,到达闹钟设置时间响铃
* @param 无
* @retval 无
*/
void Clock_Time_Open(void)
{
if(Clock_Time[0]==DS1302_Time[0] && Clock_Time[1]==DS1302_Time[1])
{
while(i!=1)
{
Buzzer_Timems(1000);
Tmp_Status=1;
}
Tmp_Status=0;
i=0;
MODE=0;
//此程序为不使用外部中断关闭闹钟
/* while(i==0)
{
Buzzer_Timems(1000);
// Tmp_Status=1;
if(Buzzer_Key()==4)
{
Clk_Flag=0;
i=4;
}
}
// Tmp_Status=0;
i=0;
MODE=0;
*/
}
}
/**
* @brief 菜单设置 时钟/闹钟的时、分设置;显示闹钟时间;开启关闭闹钟
* @param 无
* @retval 无
*/
void Time_Set(unsigned char Tmp1)
{
if(Tmp1==1)
{
LCD_ShowString(1,1,"RT Setting: ");
Tmp_Getin=Key();
Key_Set=1;
if(Tmp_Getin==1)
{
P2_2=!P2_2;
Key_Set=1;
DS1302_Time[0]++;//时间设置位数值加1
if(DS1302_Time[0]>23){DS1302_Time[0]=0;}//时越界判断
}
if(Tmp_Getin==2)
{
Key_Set=1;
DS1302_Time[1]++;//时间设置位数值加1
if(DS1302_Time[1]>59){DS1302_Time[1]=0;}//分越界判断
}
if(Tmp_Getin==3)
{
DS1302_SetTime();
TimeShow();
Tmp=0;
Key_Set=0;
}
//实时更新显示
LCD_ShowNum(2,1,DS1302_Time[0],2);
LCD_ShowNum(2,4,DS1302_Time[1],2);
LCD_ShowNum(2,7,DS1302_Time[2],2);//显示秒
}
else if(Tmp1==3)
{
Key_Set=1;
LCD_ShowString(1,1,"CLK Setting: ");
Tmp_Getin=Key();
if(Tmp_Getin==1)
{
Key_Set=1;
Clock_Time[0]++;//时间设置位数值加1
if(Clock_Time[0]>23){Clock_Time[0]=0;}//时越界判断
}
if(Tmp_Getin==2)
{
Key_Set=1;
Clock_Time[1]++;//时间设置位数值加1
if(Clock_Time[1]>59){Clock_Time[1]=0;}//分越界判断
}
if(Tmp_Getin==3)
{
DS1302_SetTime();
LCD_ShowString(1,1,"CLK Setting Ok");
Delay(1000);
Tmp=0;
Key_Set=0;
}
//实时更新显示
LCD_ShowNum(2,1,Clock_Time[0],2);
LCD_ShowNum(2,4,Clock_Time[1],2);
}
else if(Tmp1==2)
{
Key_Set=1;
LCD_ShowString(1,1,"CLK TIM: ");
LCD_ShowNum(2,1,Clock_Time[0],2);
LCD_ShowNum(2,4,Clock_Time[1],2);
Tmp_Getin=Key();
if(Tmp_Getin==2)
{
TimeShow();
Tmp=0;
Key_Set=0;
}
}
else if(Tmp1==4)
{
Key_Set=1;
//开关闹钟
if(MODE==0) //ON
{
MODE=1;
Clk_Flag=MODE;
for(i=0;i<3;i++)
{
Delay(500);
Buzzer_Times(250);
}
}
else
{
MODE=0;
Clk_Flag=MODE;
Delay(1000);
Buzzer_Times(500);
}
Tmp=0;
Key_Set=0;
}
}
/**
* @brief 按键检测
* @param 无
* @retval 无
*/
void Key_Select(void)
{
Key_Get=Key();//读取键码
if(Key_Get==1)
Tmp=1;
else if(Key_Get==2)
Tmp=2;
else if(Key_Get==3)
Tmp=3;
else if(Key_Get==4)
Tmp=4;
else
Tmp=0;
}
void main()
{
//初始化操作
LCD_Init();
DS1302_Init();
Timer0Init();
LCD_ShowString(2,1," : ");
//设置时间
DS1302_SetTime();
while(1)
{
//按键检测
Key_Select();
//目的是进入菜单设置后按键不冲突,比如按k1就卡在时钟设置程序内
if(Key_Set==0)
Tmp_Set=Tmp;
//菜单页
if(Tmp_Set)
{
Time_Set(Tmp_Set);
}
else
{
TimeShow();
}
//开启闹钟
if(MODE==1)
{
Clock_Time_Open();
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int Toggle;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
Toggle++;
if(Toggle>=1000) //每1秒P2_0闪烁一次
{
Toggle=0;
P2_0=!P2_0;
}
}
void INIT1() interrupt 2
{
//闹钟响铃则程序将Tmp_Status置1,由此使用KEY4触发外部中断1关闭闹钟
if(Tmp_Status==1)
{
P2_3=!P2_3;
i=1;
}
}
复制代码
Keil代码下载:
代码.7z
(42.93 KB, 下载次数: 5)
2023-6-10 00:25 上传
点击文件名下载附件
定时闹钟
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1