标题:
单片机多功能闹钟仿真加源程序
[打印本页]
作者:
51hei学习技术中
时间:
2017-3-17 22:52
标题:
单片机多功能闹钟仿真加源程序
1.时分秒的正常显示
2.可单独调整时钟的分十秒
3.闹钟功能
4,键功能说明
second--正常显示和闹钟状态时调整秒位
minute--正常显示和闹钟状态时调整分位
hour--正常显示和闹钟状态时调整分位
alarm--开启和关闭闹钟功能(变量alarm_is_ok,1为open,0为close)
stop-set-open-close
显示该单片机多功能闹钟的仿真原理图:
0.png
(27.65 KB, 下载次数: 71)
下载附件
2017-3-17 22:51 上传
部分源码预览:
#include "Key.h"
#include "led.h"
uchar timeSetBuff[8]={'0','0',LED_MODE_COUNT,'0','0',LED_MODE_COUNT,'0','0'};//时钟数据缓冲区
uchar alarmSetBuff[8]={'0','0',LED_MODE_ALARM,'0','0',LED_MODE_ALARM,'0','0'};//闹钟时间数据缓冲区
uchar timeDisMod=0x24; //00100100
uchar secondTemp,minuteTemp,hourTemp;
uchar secondAlarm,minuteAlarm,hourAlarm;
uchar timer0Temp;
uchar alarmKeyCount; //闹钟起停键计数
bit alarm_is_ok; //闹钟起停状态
bit time_is_ok; //时间是否到
bit interface_mod; // 显示界面模式,0为主时间界面,1为设置界面
/********************************************************************************************
* 函数名称:定时器0
* 功 能:定时器0初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void initTimer0(void) //定时10ms
{
TMOD |= 0x01; //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制
TH0 = 0xdc;
TL0 = 0x00;
TR0 = 1; //timer0 控制位,为1时启动timer0
ET0 = 1; //timer0 中断使能
}
/********************************************************************************************
* 函数名称:时钟比较
* 功 能:比较时钟和闹钟的时间缓冲区,只比较时和分
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void timeCompare(void)
{
if((minuteTemp == minuteAlarm) && (hourTemp == hourAlarm))
{
time_is_ok = 1;
alarm_is_ok = 0;
interface_mod = 1;
}
}
/********************************************************************************************
* 函数名称:主函数
* 功 能:调用并执行各个子函数
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void main()
{
uchar keyRead;
init_led();
init_key();
initTimer0();
timer0Temp = 0x00;
secondTemp = 0x00;
minuteTemp = 0x00;
hourTemp = 0x00;
secondAlarm = 0x00;
minuteAlarm = 0x00;
hourAlarm = 0x00;
alarmKeyCount = 0x02;
alarm_is_ok = 0; //默认状态停止
time_is_ok = 0; //默认时间未到
interface_mod = 0;
sei();
while(1)
{
if(interface_mod == 1)
ledSweepDisplay(alarmSetBuff,timeDisMod);
else
ledSweepDisplay(timeSetBuff,timeDisMod);
if(alarm_is_ok == 1)
timeCompare();
keyRead = get_key_value();
if(keyRead == KEY_ALARM)
{
if(alarm_is_ok == 1 || time_is_ok == 1)
{
alarm_is_ok = 0;
time_is_ok = 0;
interface_mod = 0;
alarmKeyCount = 0x00;
}
else
{
if(alarmKeyCount < 0x02)
alarmKeyCount++;
else
alarmKeyCount = 0x00;
if(alarmKeyCount == 0x01)
interface_mod = 1;
if(alarmKeyCount == 0x02)
{
alarm_is_ok = 1;
interface_mod = 0;
}
}
}
if(keyRead == KEY_SECOND)
{ if(interface_mod == 1)
{
if(secondAlarm < 59)
secondAlarm++;
else
secondAlarm = 0x00;
alarmSetBuff[S_L] = secondAlarm % 10 + '0';
alarmSetBuff[S_H] = secondAlarm / 10 + '0';
}
else
{
if(secondTemp < 59)
secondTemp += 1;
else
secondTemp = 0x00;
timeSetBuff[S_L] = secondTemp % 10 + '0';
timeSetBuff[S_H] = secondTemp / 10 + '0';
}
}
if(keyRead == KEY_MINUTE)
{ if(interface_mod == 1)
{
if(minuteAlarm < 59)
minuteAlarm++;
else
minuteAlarm=0x00;
alarmSetBuff[M_L]=minuteAlarm%10+'0';
alarmSetBuff[M_H]=minuteAlarm/10+'0';
}
else
{
if(minuteTemp < 59)
minuteTemp += 1;
else
minuteTemp = 0x00;
timeSetBuff[M_L] = minuteTemp % 10 + '0';
timeSetBuff[M_H] = minuteTemp / 10 + '0';
}
}
if(keyRead == KEY_HOUR)
{
if(interface_mod == 1)
{
if(hourAlarm < 23)
hourAlarm++;
else
hourAlarm = 0x00;
alarmSetBuff[H_L] = hourAlarm % 10 + '0';
alarmSetBuff[H_H] = hourAlarm / 10 + '0';
}
else
{
if(hourTemp < 23)
hourTemp += 1;
else
hourTemp = 0x00;
timeSetBuff[H_L] = hourTemp%10+'0';
timeSetBuff[H_H] = hourTemp/10+'0';
}
}
}
}
/*, */
/********************************************************************************************
* 函数名称:定时器0中断函数
* 功 能:定时器0溢出中断入口处,定时10ms
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void timer0_overflow(void) interrupt 1
{
TH0 = 0xdc;
TL0 = 0x00;
if(time_is_ok == 1) //报警
WARN_TRUMPET = ~WARN_TRUMPET;
if(timer0Temp < 99) //判断1s是否到
timer0Temp++;
else //进中断100次
{
timer0Temp = 0x00;
if(secondTemp < 59) //判断1min是否到
{
secondTemp++;
}
else
{
secondTemp = 0x00;
if(minuteTemp < 59) //判断1hour是否到
minuteTemp++;
else
{
minuteTemp = 0x00;
if(hourTemp < 23)
hourTemp++;
else
hourTemp = 0x00;
}
}
}
timeSetBuff[S_L] = secondTemp%10+'0';
timeSetBuff[S_H] = secondTemp/10+'0';
timeSetBuff[M_L] = minuteTemp%10+'0';
timeSetBuff[M_H] = minuteTemp/10+'0';
timeSetBuff[H_L] = hourTemp%10+'0';
timeSetBuff[H_H] = hourTemp/10+'0';
sei();
}
复制代码
0.png
(52.56 KB, 下载次数: 54)
下载附件
2017-3-17 22:49 上传
所有资料下载:
电子时钟系统.rar
(41.32 KB, 下载次数: 87)
2017-3-17 22:52 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qxdqx
时间:
2018-5-20 21:10
太好啦!谢谢分享!正好来学习。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1