功能介绍:采用51单片机作为主控CPU,采用ISD1820语音模块播放提示音,采用ds1302时间模块提供校时,通过按键设置闹钟时间,LCD1602显示相关数据,当定时时间到达,语音模块自动播放提示音,文末有资料分享:
51-基于51单片机定时语音闹钟闹铃(程序+原理图+元件清单全套资料)
程序打开办法:特别注意:下载资料包以后一定要先解压!!!(建议解压到桌面上,文件路径太深会导致程序打开异常),解压后再用keil5打开。
void key()//按键函数 识别当前的按键动作
{
if(k2==0)//设置时
{
while(k2!=1);
shi++;
if(shi>23) shi=0;
}
if(k1==0) //设置分
{
while(k1!=1);
fen++;
if(fen>59) fen=0;
}
}
/*******************************************************************************
* 函数名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
LcdInit();//初始化
yuyin=0;
// Ds1302Init();
Timer0Init(); //定时器0初始化
while(1)
{
Ds1302ReadTime(); //读取时间
key(); //按键函数
LcdDisplay(); //LCD显示函数
}
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函数名 : LcdDisplay()
* 函数功能 : 显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void LcdDisplay()
{
writecom(0xc0);
writedata('0'+TIME[2]/16); //时
writedata('0'+(TIME[2]&0x0f));
writedata('-');
writedata('0'+TIME[1]/16); //分
writedata('0'+(TIME[1]&0x0f));
writedata('-');
writedata('0'+TIME[0]/16); //秒
writedata('0'+(TIME[0]&0x0f));
writedata(' ');
writedata(' ');
writedata(' ');
writedata('0'+shi/10);
writedata('0'+shi%10);
writedata('-');
writedata('0'+fen/10);
writedata('0'+fen%10);
writecom(0x80);
writedata('2');
writedata('0');
writedata('0'+TIME[6]/16); //年
writedata('0'+(TIME[6]&0x0f));
writedata('-');
writedata('0'+TIME[4]/16); //月
writedata('0'+(TIME[4]&0x0f));
writedata('-');
writedata('0'+TIME[3]/16); //日
writedata('0'+(TIME[3]&0x0f));
writedata(0x8D);
writedata('0'+(TIME[5]&0x07)); //星期
writedata(' ');
if((shi/10==TIME[2]/16)&&(shi%10==TIME[2]%16)&&(fen/10==TIME[1]/16)&&(fen%10==TIME[1]%16))
{
writedata(' ');
writedata('O');
writedata('N');
yuyin=1;