使用模块:数码管,独立按键,定时器0,定时器1

芯片:STC89C52RC

整体功能说明:

按键K1实现时钟、闹钟、秒表、日期的切换;

在时钟,闹钟和日期修改模式下,按键K2控制时分秒(年月日)的选择,按键K3和K4控制加减;

在秒表模式下

K3按下是开始,按下K4停止,再次按下K3清零。

两个变量一个控制修改位的选择,一个控制选中位的加减。根据判断Select的值运行对应的代码。

闪烁功能。添加了一个变量FlashFlag,把FlashFlag放在定时器0里,每过一段时间FlashFlag取反,判断FlashFlag的值,用if else实现闪烁。

main函数如下:

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
#include "Nixie.h"
#include "key.h"
#include "Buzzer.h"
#include "Timer1.h"unsigned char TimeSelect[3][3]={{23,59,55},{0,0,10},{0,0,0}};//时间,闹钟时间,秒表初始化
unsigned char Date[]={22,12,31};//日期
unsigned char Mode=0,KeyNum,Flag=0,FlashFlag=0,Select=0,DateSelect=0,Tflag=0;
unsigned char a,b,c,d,e,f;void main()
{Timer0Init();Timer1Init();while(1){KeyNum=Key();//闹钟判断if(TimeSelect[0][0] == TimeSelect[1][0] && TimeSelect[0][1] == TimeSelect[1][1] &&TimeSelect[0][2] ==TimeSelect[1][2]){Buzzer_Time(300);}if(KeyNum==1)//模式选择{Mode++;Mode%=6;}if(Mode==0)//时间显示{Nixie(1,TimeSelect[0][0]/10);Nixie(2,TimeSelect[0][0]%10);Nixie(3,TimeSelect[0][1]/10);Nixie(4,TimeSelect[0][1]%10);Nixie(5,TimeSelect[0][2]/10);Nixie(6,TimeSelect[0][2]%10);Nixie(7,10);Nixie(8,10);  }if(Tflag==1){Date[2]++;Tflag=0;}//满一天加一if(Mode==1 || Mode==2)//调整显示的时间和闹钟时间{if(KeyNum==3){TimeSelect[Mode-1][Select]++;TimeSelect[Mode-1][0]%=24;TimeSelect[Mode-1][1]%=60;TimeSelect[Mode-1][2]%=60;}if(KeyNum==4){TimeSelect[Mode-1][Select]--;if(TimeSelect[Mode-1][0]==255){TimeSelect[Mode-1][0]=23;}if(TimeSelect[Mode-1][1]==255){TimeSelect[Mode-1][1]=59;}if(TimeSelect[Mode-1][2]==255){TimeSelect[Mode-1][2]=59;}}if(FlashFlag==1)//闪烁控制{Nixie(Select*2+1,12);Nixie(Select*2+2,12);}else{Nixie(Select*2+1,TimeSelect[Mode-1][Select]/10);Nixie(Select*2+2,TimeSelect[Mode-1][Select]%10);}if(KeyNum==2){Select++;Select%=3;}//根据Selsct的值协调其他位的显示if(Select==0){e=1,f=2,a=3,b=4,c=5,d=6;}else if(Select==1){e=2,f=0,a=5,b=6,c=1,d=2;}else if(Select==2){e=0,f=1,a=1,b=2,c=3,d=4;}Nixie(a,TimeSelect[Mode-1][e]/10);Nixie(b,TimeSelect[Mode-1][e]%10);Nixie(c,TimeSelect[Mode-1][f]/10);Nixie(d,TimeSelect[Mode-1][f]%10);Nixie(7,10);Nixie(8,10);}if(Mode == 3)//秒表显示{Nixie(7,11);Nixie(8,11);Nixie(1,TimeSelect[Mode-1][0]/10);Nixie(2,TimeSelect[Mode-1][0]%10);Nixie(3,TimeSelect[Mode-1][1]/10);Nixie(4,TimeSelect[Mode-1][1]%10);Nixie(5,TimeSelect[Mode-1][2]/10);Nixie(6,TimeSelect[Mode-1][2]%10);if(KeyNum==3 && Flag==0){TR1=1;}if(KeyNum==4){TR1=0;    Flag=1;}if(KeyNum==3 && Flag== 1){TimeSelect[Mode-1][0]=TimeSelect[Mode-1][1]=TimeSelect[Mode-1][2]=0;Flag=0;}}if(Mode==4){Nixie(1, Date[0]/10);Nixie(2, Date[0]%10);Nixie(3, Date[1]/10);Nixie(4, Date[1]%10);Nixie(5, Date[2]/10);Nixie(6, Date[2]%10);Nixie(7,10);Nixie(8,10);    }if(Mode==5)//日期显示与修改{if(KeyNum==2){DateSelect++;DateSelect%=3;}if(FlashFlag==1)//闪烁控制{Nixie(DateSelect*2+1,12);Nixie(DateSelect*2+2,12);}else{Nixie(DateSelect*2+1,Date[DateSelect]/10);Nixie(DateSelect*2+2,Date[DateSelect]%10);}if(DateSelect==0){e=1,f=2,a=3,b=4,c=5,d=6;}else if(DateSelect==1){e=2,f=0,a=5,b=6,c=1,d=2;}else if(DateSelect==2){e=0,f=1,a=1,b=2,c=3,d=4;}Nixie(a,Date[e]/10);Nixie(b,Date[e]%10);Nixie(c,Date[f]/10);Nixie(d,Date[f]%10);Nixie(7,10);Nixie(8,10);if(KeyNum==3)//按键3按下{Date[DateSelect]++;//时间设置位数值加1}if(KeyNum==4)//按键3按下{Date[DateSelect]--;//时间设置位数值减1               }}//日期判断越界if(Date[0]<0){Date[0]=99;}//年越界判断if(Date[1]<1){Date[1]=12;}//月越界判断if(Date[1]>12){Date[1]=1;Date[0]++;}//月越界判断if( Date[1]==1 || Date[1]==3 || Date[1]==5 || Date[1]==7 || Date[1]==8 || Date[1]==10 || Date[1]==12)//日越界判断{if(Date[2]<1){Date[2]=31;}//大月if(Date[2]>31){Date[2]=1;Date[1]++;}}else if(Date[1]==4 || Date[1]==6 || Date[1]==9 || Date[1]==11){if(Date[2]<1){Date[2]=30;}//小月if(Date[2]>30){Date[2]=1;Date[1]++;}}else if(Date[1]==2){if(Date[0]%4==0){if(Date[2]<1){Date[2]=29;}//闰年2月if(Date[2]>29){Date[2]=1;Date[1]++;}}else{if(Date[2]<1){Date[2]=28;}//平年2月if(Date[2]>28){Date[2]=1;Date[1]++;}}}  }
}//时分秒运行
void Timer0_Routine() interrupt 1
{static unsigned int T0Count,FlashCount;TL0 = 0x18;TH0 = 0xfc; //1msT0Count++;FlashCount++;if(FlashCount>=500){FlashCount=0;FlashFlag=!FlashFlag;//闪烁取反}if(T0Count>=1000){T0Count=0;TimeSelect[0][2]++;if(TimeSelect[0][2]>=60){TimeSelect[0][2]=0;TimeSelect[0][1]++;if(TimeSelect[0][1]>=60){TimeSelect[0][1]=0;TimeSelect[0][0]++;if(TimeSelect[0][0]>=24){TimeSelect[0][0]=0;if(Mode != 5){Tflag=1;}    }}}}
}//秒表
void Timer1_Routine() interrupt 3
{static unsigned int T1Count;//FlashCountTH1 = 0xd8; TL1 = 0xef;//10msT1Count++;if(T1Count>=1){T1Count=0;TimeSelect[2][2]++;if(TimeSelect[2][2]>=100){TimeSelect[2][2]=0;TimeSelect[2][1]++;if(TimeSelect[2][1]>=60){TimeSelect[2][1]=0;TimeSelect[2][0]++;TimeSelect[2][0]%=60;}}}
}

还存在

1.秒的增加将按键的减小抵消;

2.设置日期如果溢出对应日期会改变等问题。

基于51单片机实现闹钟功能相关推荐

  1. 如何在51单片机实现闹钟功能

    如何在51单片机实现闹钟功能 51单片机制作万年历过程中的闹钟部分,主要说明设计算法,软件特性可以在proteus上仿真.闹钟是人机交互的一部分,因此闹钟的实现与具体的人机交互方式息息相关,本系统采用 ...

  2. 基于51单片机的多功能智能语音循迹避障小车

    目录 一.功能介绍及硬件准备 二.电机控制及调速 三.小车循迹方案 四.跟随功能实现 五.测速功能实现 六.OLED显示车速 七.摇头避障功能实现 八.SU-03T语音模块介绍 九.语音切换小车模式+ ...

  3. 基于51单片机的多功能八路抢答器

    1.功能介绍 多功能八路抢答器是基于51单片机来设计的,除了可以实现最基本功能--8路抢答外,还具有自动处理犯规选手,抢答时间调整,还可以进行答题,计分,并且可以查询或修改分数. 2.硬件设计 该抢答 ...

  4. 95、基于51单片机智能闹钟万年历 农历阳历温度电子时钟闹钟定时语音播报系统

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.pcb图 六.Protues仿真 七.程序 八.资料包括 摘要 本文介绍了基于STC8 ...

  5. 基于51单片机实现计算器功能

    题目要求: 1.根据开发板设计10以内的加法计算器,用LED数码管显示数字和计算结果.(必做). 2.根据开发板设计100以内的计算器,用LED数码管显示数字和计算结果,要求可实现加法.减法.乘法和除 ...

  6. 基于51单片机实现红绿灯功能

    设计目标: 1.东西方向.南北方向均有红.黄.绿三种信号灯,初始红灯30秒,黄灯闪烁3秒,绿灯30秒,东西方向红灯时刻,南北方向绿灯,南北方向绿灯,东西方向红灯. 2.按键调节与控制功能,通过按键,可 ...

  7. 基于51单片机的多功能洗碗机(Protues仿真)

    本项目是以AT89C51最小系统为核心,外接DS18B20温度传感器.OVEN加热棒.LCD1604显示屏.ADC0832模数转换器模拟浊度传感器.L298和MOTOR当电机模块.电机模块用于模拟洗碗 ...

  8. 基于51单片机的多功能视力保护台灯

    目录 摘要. 1 1弓I言 1 1.1 选 题 背 景 1 2 视力保护器的现状 2 1.3 本文主要研究内容 3 2系统硬件 设计 3 1 89c52 单片机简介 4 2.2 超声波测距报警 电路 ...

  9. STC89C52 51单片机实现闹钟功能 #目前的时间倒计时 #选择位置闪烁 #计时 #清屏 #停止计时 #选择位置加减数字 #存储目前的数据 #读出目前的数据 #输入特定时间

    前言 下面是按键实现功能的解释 本次内容主要是实现一般闹钟的基本功能, #目前的时间倒计时 #选择位置闪烁 #计时 #清屏 #停止计时 #选择位置加减数字 #存储目前的数据 #读出目前的数据 #输入特 ...

最新文章

  1. js判断数据类型是哪种
  2. Intellij IDEA eclipse项目导入
  3. 关于final局部变量引用的研究
  4. ESXI使用记录---安装vSphere(VCSA)
  5. 模型评估——ROC、KS
  6. 用户在购买机器之后不知如何正确保养笔记本电脑
  7. 为什么每个邮件收到后都会有一个htm的附件_Python 发送邮件各种姿势
  8. 【效率】再见 Typora,这款 Markdown 编辑器开源又免费!
  9. matlab在一个坐标系画不同三维图,怎么用多个色标
  10. 帆软实现单元格可编辑内容并保存
  11. vba shell java_VBA中shell函数
  12. iphone(苹果)手机登陆Exchange 2013邮箱帐号的配置
  13. 2019年春PAT甲级考试
  14. 只显示 前100个字 java 实现截取字符串!使用! c:if test=${fn:length(onebeans.info)100 }${ fn:substri...
  15. C#百度OCR-身份证图片识别提取信息
  16. MVVM(维基百科搜索)
  17. nginx日志磁盘空间使用率100%
  18. Python爬取淘宝商品信息
  19. Transactional Client
  20. 石英晶振的频率稳定性和负载电容有什么关系?

热门文章

  1. ABAP 对内表的操作(增删改读及alv双击读取数据)
  2. spring 自定义标签 实现步骤 比如<wly:person address=“就是在这里“ age=“18“ name=“赵子龙“ id=“wly“></wly:person>
  3. linux 莫名其妙出现什么crawling and gvfs denied 错误
  4. Rotating Apache log files
  5. 马斯克:未来可将个人意识复制到特斯拉机器人上
  6. java中拼接xml方法_Java常用工具类,拼接XML格式的字符串,非常好用
  7. 线性插值法(linear interpolation)
  8. c 语言程序设计英文版教程,《C++大学教程(第7版)英文原版》(C++ How to Program, 7th Edition)[PDF]...
  9. 万彩动画大师难吗_制作动画不必那么难
  10. Vue + Element UI——大学课程表(包括普通课和实践课)解决方案