可设置八个闹钟的智能时钟程序
- 格式:doc
- 大小:111.00 KB
- 文档页数:10
康巴丝compas电子闹钟说明书产品参数:•品牌:康巴丝(Compas)•商品名称:康巴丝电子闹钟•商品毛重:185.00g•材质:塑料•机芯:电子产品功能:1、正常时间功能:显示时间、日期(从2000年至2099年)、星期、温度,并可实现12/24小时制的转换。
2、闹钟和贪睡功能:闹钟音乐有8首可选,同时可开启贪睡功能。
3、环境温度显示功能:环境温度显示0-500℃或320-1220℉并可进行摄氏/华氏温度转换。
4、七彩灯功能:可发出七种颜色的光,循环变色。
操作方法:1、时间日期设置:★按 SET 键进入时间、日期的设置,并以下列顺序分别设置小时分钟、年、月、日、星期等,通过 UP / DOWN 键配合来完成设置。
★设置范围:时为1-12或0-23,分为0-59,年为2000-2099,月为1-12,日为1-31;在日期设置的同时,星期相应的自动改变。
★在设置状态,也可按 AL 键或无按键1分钟退出设置,并显示当前所设置的时间。
★在正常状态,按 UP 键进行12和24小时转换。
2、闹钟和贪睡设置:★在正常状态,按 AL 键一次进入闹钟模式。
★在闹钟状态,按 SET 键进入闹铃设定状态,以下列顺序分别设置小时、分钟、贪睡、音乐,通过 UP /0OWN键配合来完成其设置。
★在设置状态,如果无按键1分钟或按 MODE 键退出设置,并显示当前所设置的时间。
★在闹钟状态,通过 UP 键开启闹铃的标志,按第二次 UP 键开启贪睡功能。
★当闹钟到达设定时间,响闹1分钟;当贪睡时间到,按 SET 键取消响闹或按任意键停止响闹。
★贪睡的间隔延续时间范围设定:1-60分钟。
★当闹铃及贪睡的标志未开启时,即闹铃和贪睡同时关闭,只有在闹钟标志开启时,重按 UP 键,贪睡功能才有效。
3、温度转换在正常状态,技 DOWN 键可以进行摄氏1华氏温度间的相互转换。
4、按 TAP 可开启夜灯,5秒钟自动熄灭。
5、把开关置 ON 或 DEMO 位置开启七彩灯。
智能闹钟操作方法步骤
智能闹钟的操作方法步骤如下:
1. 将智能闹钟插入电源,确保它有足够的电量。
2. 打开智能闹钟的启动按钮或使用遥控器打开电源。
3. 在智能闹钟的显示屏上会显示当前的时间。
如果时间不准确,您可以根据需要进行调整。
4. 设置闹钟时间。
在闹钟设置菜单中,选择设置时间的选项。
您可以使用按钮或遥控器进行时间的增加或减少,然后按确认按钮来保存设置。
5. 设置闹铃音乐或铃声。
在闹钟设置菜单中,选择设置铃声的选项。
您可以选择预设的音乐或铃声,也可以连接蓝牙设备或USB设备来播放您喜欢的音乐。
6. 设置闹铃模式。
在闹钟设置菜单中,选择设置闹铃模式的选项。
您可以选择单次闹铃或重复闹铃,以及设定每天或特定日期的闹铃。
7. 设置其他功能。
如果您的智能闹钟具有其他功能,例如天气预报、电台或语音控制等,您可以在相应的设置菜单中进行设置。
8. 确认设置。
在完成所有设置后,按确认按钮来保存设置。
9. 关闭智能闹钟。
如果您不需要使用闹钟功能,可以选择关闭智能闹钟的选项。
您可以设定定时关闭或手动关闭闹钟。
10. 如果需要,您还可以随时对闹钟进行调整或重新设置。
请注意,以上步骤只是一个一般的操作流程示例,实际操作可能因不同的智能闹钟品牌和型号而略有不同。
建议您在使用前详细阅读使用手册或参考相关说明。
毕业设计<论文)题目:八位数显示时钟的设计与制作2018年8月28日毕业设计任务书1.毕业设计题目:八位数显时钟题目类型实验研究题目来源教师科研题毕业设计内容要求:<一)设计任务:1、用单片机设计8位数显电子时钟;2、走时,误差精度控制在1s/天;3、调时,小时、分钟加减调整及闪烁显示;4、闹铃,可以设置三组闹铃,默认闹铃时间为1分钟,可按任意键推出闹铃。
<二)涉及要求:1、总体方案设计及框图;2、设计原理电路图及分析;3、独立编写程序;4、完成protues仿真设计;5、使用protel设计pcb并制作、调试电路。
2.主要参考资料[1]电子工业出版社[51单片机典型系统开发实例精讲]白延敏;[2]复旦大学出版社[单片微型机原理、应用和实验] 张友德;[3]海纳电子资讯网[IC中文资料];摘要时间是现代社会中不可缺少的一项参数,无论是平时生活还是社会生产都需要对时间进行控制,有的场合对其精确性还有很高的要求.采用单片机进行计时,对于社会生产有着十分重要的作用。
本文首先介绍了电子时钟的特点和功能,然后对单片机和LCD 显示做了详细的介绍,提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,再用Protues软件进行了仿真和调试,结果证明了该设计系统的可行性。
由于AT89S52系列单片机的控制器运算能力强,处理速度快,可以精确计时,很好地解决了实际生产生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的适用性。
关键字:单片机;LCD1602液晶显示器;C程序设计目录第一章系统设计要求及功能51.1设计本电子定时闹钟的目的和意义51.2本LCD电子闹钟的特点和功能介绍51.2.1本电子钟设计特点51.2.2本电子钟的主要功能5第二章方案设计与比较62.1数字时钟方案62.2显示方案7第三章系统硬件的设计83.1单片机的选择及管脚介绍83.1.1单片机的选择及主要性能83.1.2单片机管脚介绍93.2LCD1602的管脚及功能介绍113.2.1引脚说明113.2.2控制器接口说明123.3总体设计133.3.1系统说明133.3.2整体系统框图133.4各部分功能实现143.5元件清单143.6电子钟电路原理图153.7时钟仿真各功能分析及图解16第四章软件总体设计方案204.1主程序流程图:204.2、闹钟的实现22第五章课程设计结果分析23致谢24参考文献25附录26<1)控制电路的C语言源程序26<2)8位数显时钟成品展示图35第一章系统设计要求及功能1.1 设计本电子定时闹钟的目的和意义1、复习和巩固所学过的知识,利用此毕业设计正好可以对所学过的知识进行系统的回顾和总结。
说明书一、主程序、子模块流程图电子闹钟主流程图:调时、调日期、调星期流程图:倒计时结束流程图:音乐播放流程图:闹铃功能流程图:二、功能介绍:有计时,计日期,计星期,调时、调日期、调星期、闹钟、调闹钟、音乐闹铃、秒表、99秒倒计时、60秒倒计时、5秒倒计时、倒计时结束播放提醒音乐、直接按键播放音乐共计15个小的功能,分为四个功能模块,用四个按键来实现1.调时,查看日期以及调日期,查看星期以及调星期按键1进入该模块后,显示该模块的界面“1234”,分别代表在该界面中要用到的按键编号。
此时按1即进入调时界面,显示当前时间,按1秒加1,按2分加1,按3时加1,按4退出该界面而回到模块界面。
此时按2即进入查看日期以及调日期的界面,显示当前日期,按1天加1,按2月加1,按3年加1,按4退出该界面而回到模块界面。
此时按3即进入查看星期以及调星期的界面,显示当前星期,按1星期加1,按4退出该界面而回到模块界面。
此时按4则退出功能模块1而回到主界面。
2.调闹钟进入该模块时,显示闹钟时间,按1秒加1,按2分加1,按3时加1,按4退出调闹钟模块而回到主界面3.秒表,倒计时进入该模块后,显示界面“12 4”,分别代表在该界面中要用到的按键编号。
此时按1进入秒表计时状态,按4退出,回到模块界面。
此时按2进入99秒倒计时状态,按1切换到60秒倒计时,按1切换到5秒倒计时,在倒计时进行中,按4可以回到模块界面。
此时按4,可以回到主界面4.音乐进入该界面后,显示界面“00-00-00”,按1播放歌曲1,按2播放歌曲2,按3播放歌曲3,按4播放歌曲4,在播放歌曲时,按4可以结束播放音乐并且回到主界面。
八道计时器
设置倒计时器的时钟、分钟和秒钟,并启动它。
或者,您可以设置日期和时间来计算事件(或过去)的天数、小时数和秒数。
在设定的时间会显示一个计时器来触发提醒,并播放预先选择的声音。
在设置计时器时,您可以单击“测试”按钮以预览提醒并检查声音大小。
单击“重置”按钮可以通过初始值启动计时器。
单击“停止”(“开始”)按钮可以停止(启动)计时器。
您可以将不同时间设置的在线计时器的链接添加到浏览器的收藏夹中。
打开这样的链接会将该计时器设置为预定义的时间。
在假日列表中,您可以为列表中的任何假日启动倒计时定时器,或者为您自己的活动或假日创建新的定时器。
请确保与您的朋友分享您的计时器。
2023年智能闹钟使用手册智能闹钟是一种智能家居设备,它不仅能显示时间,还能提供多种实用功能。
2023年的智能闹钟新升级了一系列功能,为用户带来更便捷的生活体验。
本使用手册将详细介绍2023年智能闹钟的功能和使用方法,帮助用户快速上手并充分发挥智能闹钟的潜力。
1. 基本设置在使用智能闹钟之前,首先需要进行基本设置。
请按照以下步骤进行:1.1 插电源:将智能闹钟插入电源插座,确保正常供电。
1.2 连接网络:智能闹钟支持Wi-Fi连接,通过设置菜单中的网络选项,输入Wi-Fi密码即可连接。
1.3 时间调整:智能闹钟将自动与网络同步时间,若需手动调整,请进入设置菜单进行修改。
2. 闹钟功能智能闹钟最常用的功能之一就是闹钟功能。
为了更好地使用闹钟功能,请按照以下步骤进行操作:2.1 设置闹钟时间:点击主屏幕上的“闹钟”图标,进入闹钟设置界面,选择添加新闹钟并设置闹钟时间。
2.2 闹铃音调:选择合适的闹铃音调,可通过预设音调或者自定义音乐作为闹铃声音。
2.3 重复设置:根据个人需求,设置是否重复闹钟。
可以选择按天、工作日、周末或特定日期重复。
2.4 其他设置:根据需求,可以进一步设置闹钟振动、渐增音量等功能。
3. 语音助手2023年智能闹钟升级了全新的语音助手,使用户能够通过语音与闹钟进行交互。
以下是一些常用的语音指令示例:3.1 设置闹钟:用户可以通过语音命令告诉智能闹钟设定指定时间的闹钟,例如:“设置明天早上7点的闹钟”。
3.2 查询天气:用户可以通过语音命令获取当日或未来几天的天气情况,例如:“今天天气怎么样?”。
3.3 播放音乐:用户可以通过语音命令让智能闹钟为其播放喜欢的音乐,例如:“播放一首轻音乐”。
4. 应用推送智能闹钟还支持应用推送功能,将手机上的应用推送至闹钟显示屏幕上,提供更便捷的信息查看。
以下是如何使用应用推送的步骤:4.1 连接手机:通过智能闹钟的设置菜单中的“添加手机”选项,将手机与闹钟绑定,确保连接成功。
可设置8个闹钟时间的智能时钟广东珠海曾向文普通的家用时钟一般只能设置一个闹钟时间,但很多人均需为工作日、周末、早晨、午休等不同时段设置不同的闹钟时间。
如果是使用普通的闹钟,只好每次休息前重新设置,很不方便,有时甚至会出现忘记更改闹钟设置而睡过头的情况。
针对这种情况,本人利用89C51单片机设计了一款有8种闹钟设置的时钟,通过一段时间的使用,情况良好。
1、元件清单共阴极数码管8个4511七段译码芯片1片A TMEL89C51单片机1片24C08EEPROM 1片24M晶振1个9V变压器(3V A)1个LM317输出可调稳压IC 1个整流桥堆1个470uF电容1个100uF电容1个10uF电容1个0.1uF电容1个33pF电容2个蜂鸣器1个9014(或其它NPN管)8个ksp92(或其它PNP管)1个二极管2个1K欧电阻16个470欧电阻1个10K欧可调电阻1个10K欧电阻4个按钮开关4个可装四节电池的电池盒1个万能板(约12CM*17CM)1块所有元件按以下的电路图焊接在一块万能板上。
注意LM317的输出应由低调高,以免烧IC。
2、电路图3、功能简介该时钟以24小时制显示时间,并可显示2000年至2049年之间的任何日期及星期,日期与时间经按键可相互切换,可输入8个闹钟时间设置,每个闹钟设置包括响铃的时间(小时与分钟)、对工作日有效还是对周末有效的标志,以及本项设置是否启用的标志等三部分。
这8个闹钟设置均保存在EEPROM中,即使掉电也不用重新输入。
当然使用者可通过按钮对任何一个设置作修改。
数码管可经按钮关闭显示,避免夜间刺眼、影响睡眠。
调节LM317输出电压,可改变数码管亮度,但电压不能低于后备电池的电压,否则后备电池供电。
用四节1.25V电池串联作后备电源,保证市电停电时时钟继续走时。
时钟的精度取决于晶振频率的精度。
4、程序清单本程序用C语言编写,经Keil C51编译成二进制码后写入89C51内的EPROM内即可。
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
可设置8个闹钟时间的智能时钟普通的家用时钟一般只能设置一个闹钟时间,但很多人均需为工作日、周末、早晨、午休等不同时段设置不同的闹钟时间。
如果是使用普通的闹钟,只好每次休息前重新设置,很不方便,有时甚至会出现忘记更改闹钟设置而睡过头的情况。
针对这种情况,本人利用89C51单片机设计了一款有8种闹钟设置的时钟,通过一段时间的使用,情况良好。
1、元件清单共阴极数码管8个4511七段译码芯片1片ATMEL89C51单片机1片24C08EEPROM 1片24M晶振1个9V变压器(3V A)1个LM317输出可调稳压IC 1个整流桥堆1个470uF电容1个100uF电容1个10uF电容1个0.1uF电容1个33pF电容2个蜂鸣器1个9014(或其它NPN管)8个ksp92(或其它PNP管)1个二极管2个1K欧电阻16个470欧电阻1个10K欧可调电阻1个10K欧电阻4个按钮开关4个可装四节电池的电池盒1个万能板(约12CM*17CM)1块所有元件按以下的电路图焊接在一块万能板上。
注意LM317的输出应由低调高,以免烧IC。
2、电路图该时钟以24小时制显示时间,并可显示2000年至2049年之间的任何日期及星期,日期与时间经按键可相互切换,可输入8个闹钟时间设置,每个闹钟设置包括响铃的时间(小时与分钟)、对工作日有效还是对周末有效的标志,以及本项设置是否启用的标志等三部分。
这8个闹钟设置均保存在EEPROM中,即使掉电也不用重新输入。
当然使用者可通过按钮对任何一个设置作修改。
数码管可经按钮关闭显示,避免夜间刺眼、影响睡眠。
调节LM317输出电压,可改变数码管亮度,但电压不能低于后备电池的电压,否则后备电池供电。
用四节1.5V电池串联作后备电源,保证市电停电时时钟继续走时。
时钟的精度取决于晶振频率的精度。
4、程序清单本程序用C语言编写,经Keil C51编译成二进制码后写入89C51内的EPROM内即可。
#include "atmel\at89x51.h"#include "intrins.h"unsigned char hour,min,sec,year,month,day,weekday; //当前时间、日期、星期unsigned int count_down; //1秒钟计时用bit led_on; //数码管是否点亮的标志unsigned char display[8]; //8位数码管要显示的数据unsigned char attr; //八个数码管的闪烁控制字节,当为0时,对应数码管闪bit flash; //LED 闪烁开关,与attr共同决定数码管是否闪烁unsigned char show_status; //LED 显示状态标志// 0:设置闹钟数据// 1:显示当前日期及星期// 2:显示当前时间// 3:设置当前日期// 4:设置当前时间bit km; //按键已去抖动标志bit kp; //按键已处理标志bit sound; //蜂鸣器响标志bit alarm_stop; //蜂鸣器响后用户手工按停标志struct { unsigned char h; //小时unsigned char m; //分钟} alarm[8]; //8个闹钟项unsigned char alarm_en; //闹钟项启用标志unsigned char alarm_wk; //闹钟项周末启用标志unsigned char cur_alarm_set; //当前设置的闹钟项unsigned char cur_alarm_active; //当前到点的闹钟项bit new_alarm_info; //闹钟项内容已修改标志sbit sound_output = P1^5; //蜂鸣器驱动端口,输出0时蜂鸣器响sbit SDA_PIN = P1^6; //EEPROM数据线端口sbit SCL_PIN = P1^7; //EEPROM时钟线端口{ _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();}void DelayX1ms(unsigned char count) //延迟函数,参数为毫秒数{unsigned char i,j;for(i=0;i<count;i++)for(j=0;j<240;j++) ;}void Start() //I2C启动,24C08使用I2C方式{ SDA_PIN=1; I2cDelay();SCL_PIN=1; I2cDelay();SDA_PIN=0; I2cDelay();SCL_PIN=0;}void Stop() //I2C停止{ I2cDelay(); SDA_PIN=0;I2cDelay(); SCL_PIN=1;I2cDelay(); SDA_PIN=1;I2cDelay();}bit SendByte(unsigned char value) //发送1字节数据给EEPROM {unsigned char i;bit no_ack=0;for(i=0;i<8;i++) //发送8位数据{ I2cDelay();if(value&0x80) SDA_PIN=1;else SDA_PIN=0;value=value<<1;I2cDelay(); SCL_PIN=1;I2cDelay();I2cDelay(); SCL_PIN=0;}I2cDelay(); SDA_PIN=1; //确认脉冲周期,等待EEPROM的确认I2cDelay(); SCL_PIN=1;I2cDelay();if(SDA_PIN==1) no_ack=1;I2cDelay(); SCL_PIN=0;return no_ack;void mywrite(unsigned char address,unsigned char value) //向EEPROM写1字节{ Start(); SendByte(0xa0); SendByte(address);SendByte(value); Stop(); DelayX1ms(10);}unsigned char ReadByte() //从EEPROM接收1字节{unsigned char i,bval;bval=0;for(i=0;i<8;i++) //接收8位数据{ I2cDelay();SDA_PIN=1; //从P1输入数据时,先往P1输入“1”I2cDelay(); SCL_PIN=1;I2cDelay(); bval=bval<<1; if(SDA_PIN) bval=bval|0x01;I2cDelay(); SCL_PIN=0;}I2cDelay(); SDA_PIN=1; //确认脉冲周期,不送出确认I2cDelay(); SCL_PIN=1;I2cDelay();I2cDelay();return(bval);}unsigned char myread(unsigned char address) //从EEPROM读入1字节数据{unsigned char tmp;Start(); SendByte(0xa0); SendByte(address);Start(); SendByte(0xa1); tmp=ReadByte();Stop(); DelayX1ms(2);return(tmp);}void Timer0ISR(void) interrupt 1 using 3 //定时器0中断程序,用于走时,1/8000秒一次{unsigned char tmp,tmp_days;count_down--;if(count_down==1 || count_down==2001 || count_down==4001 || count_down==6001){ flash=~flash; //数码管闪烁的开关量if(sound && flash) sound_output=0; //驱动蜂鸣器else sound_output=1; //关闭蜂鸣器return;}/*** 计算当前日期为星期几***/else { tmp=(year-1)/4+1; tmp=(year-tmp)+tmp*2;weekday=(tmp+5)%7; //计算出当前年的1月1日为星期几}tmp_days=0;for(tmp=1;tmp<month;tmp++)if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10)tmp_days=tmp_days+31;else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)tmp_days=tmp_days+30;else if(tmp==2){ if(year%4==0) tmp_days=tmp_days+29;else tmp_days=tmp_days+28;}tmp_days=tmp_days+day-1; weekday=(weekday+tmp_days%7)%7+1;return;}/*** 查询是否有闹钟时间项符合触发条件***/if(count_down==5000){ if((alarm_stop || sound) && alarm[cur_alarm_active].m!=min) //触发后1分钟{ alarm_stop=0; sound=0; } //自动关蜂鸣器if(sound==0 && alarm_stop==0) //没有已触发的闹钟项for(tmp=0;tmp<8;tmp++) //则查询8个闹钟项内是否有符合条件的{ if(((alarm_en>>tmp)&1)==0) continue; //该闹钟项不启用if(((alarm_wk>>tmp)&1)==1) //该闹钟项周末有效{ if(weekday!=6 && weekday!=7) continue; } //当前不是星期六或星期天else{ if(weekday==6 || weekday==7) continue; }if(alarm[tmp].h==hour && alarm[tmp].m==min) //比较当前时间与该{ sound=1; cur_alarm_active=tmp; break; } //闹钟项的时间}return;}if(count_down==0) //过了一秒钟{ count_down=8000;sec++;if(sec==60){ sec=0;min++;if(min==60){ min=0;hour++;switch(day){ case 29: if(month==2 && year%4) { day=1; month=3; }break;case 30: if(month==2 && year%4==0) { day=1; month=3; }break;case 31: if(month==4 || month==6 || month==9 || month==11){ day=1; month++; }break;case 32: day=1; month++;if(month==13) { month=1; year++; }}}}}}}void Timer1ISR(void) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;char tmp;TH1=0x15; TL1=0xa0; // 每30ms中断一次/*** 当前显示的内容***/if(show_status==0) //当前正在设置闹钟项{ display[0]=cur_alarm_set; display[1]=0xf;display[2]=alarm[cur_alarm_set].h/10; display[3]=alarm[cur_alarm_set].h%10;display[4]=alarm[cur_alarm_set].m/10; display[5]=alarm[cur_alarm_set].m%10;display[6]=(alarm_wk>>cur_alarm_set)&1; display[7]=(alarm_en>>cur_alarm_set)&1;}if(show_status==1 || show_status==3) //当前显示或设置日期{ display[0]=year/10; display[1]=year%10; display[2]=month/10;display[3]=month%10; display[4]=day/10; display[5]=day%10;display[6]=0xf; display[7]=weekday;}if(show_status==2 || show_status==4) //当前显示或设置时间{ display[0]=hour/10; display[1]=hour%10; display[2]=min/10;display[3]=min%10; display[4]=sec/10; display[5]=sec%10;display[6]=0xf; display[7]=0xf; //最后两后无显示}/*** 按键扫描及处理***/keytmp=~(P1) & 0x0f;{ if(km==0) km=1;else{ if(kp==0){ kp=1;if(keytmp==1) //第一个按钮{ if(sound) { alarm_stop=1; sound=0; } //如果闹钟正响,按此键停止else if((show_status==1 || show_status==2) && led_on) //正显示日期或时间{ show_status=0; cur_alarm_set=0; attr=0x3f; } //进入闹钟设置else if(show_status==0) //如正在设置闹钟时间项{ show_status=2; new_alarm_info=1; attr=0xff; } //返回当前时间显示return;}if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效{ switch(attr){ case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换else if(show_status==2) show_status=1;break;case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;else if(show_status==3)year=(year+1)%50; //当前日期的“年”加1else if(show_status==4)hour=(hour+1)%24; //当前时间的“时”加1break;case 0xcf: if(show_status==0) //闹钟设置的“时”加1alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;else if(show_status==3){ month++; //当前日期的“月”加1if(month==13) month=1; }else if(show_status==4)min=(min+1)%60; //当前时间的“分”加1break;case 0xf3: if(show_status==0)alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;else if(show_status==3){day++; //当前日期的“日”加1if(day==32) day=1; }else if(show_status==4){count_down=8000;sec=(sec+1)%60; } //当前时间的“秒”加1break;case 0xfd: if(show_status==0)alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换break;case 0xfe: if(show_status==0)if(keytmp==4) //第三个按钮{ switch(attr){ case 0xff: if(show_status==1 || show_status==2)led_on=~led_on; //打开或关闭数码管显示break;case 0x3f: if(show_status==0) //如果正在设置闹钟{ if(cur_alarm_set==0) cur_alarm_set=7;else cur_alarm_set--;}else if(show_status==3) //当前日期的“年”减1{ if(year==0) year=49; else year--; }else if(show_status==4) //当前时间的“时”减1{ tmp=hour-1; if(tmp<0) hour=23; else hour=tmp; }break;case 0xcf: if(show_status==0) //闹钟设置的“时”减1{ tmp=alarm[cur_alarm_set].h-1;if(tmp<0) alarm[cur_alarm_set].h=23;else alarm[cur_alarm_set].h=tmp;}else if(show_status==3){ month--; //当前日期的“月”减1if(month==0) month=12; }else if(show_status==4){ tmp=min-1; //当前时间的“分”减1if(tmp<0) min=59; else min=tmp; }break;case 0xf3: if(show_status==0) //闹钟设置的“分钟”减1{ tmp=alarm[cur_alarm_set].m-1;if(tmp<0) alarm[cur_alarm_set].m=59;else alarm[cur_alarm_set].m=tmp;}else if(show_status==3){ day--; //当前日期的“日”减1if(day==0) day=31; }else if(show_status==4){ tmp=sec-1; //当前时间的“秒”减1count_down=8000;if(tmp<0) sec=59; else sec=tmp; }break;case 0xfd: if(show_status==0) //切换周末标志alarm_wk^=0x1<<cur_alarm_set;break;case 0xfe: if(show_status==0) //切换启用标志if(keytmp==8 & led_on) //第四个按钮,仅当数码管打开时有效{ switch(attr){ case 0xff: if(show_status==1) //如果当前显示日期show_status=3; //切换到调准日期状态else if(show_status==2) //如果当前显示时间show_status=4; //切换到调准时间状态attr=0x3f; break; //第一、二个数码管闪烁case 0x3f: attr=0xcf; break; //第三、四个数码管闪烁case 0xcf: attr=0xf3; break; //第五、六个数码管闪烁case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁else if(show_status==3){ show_status=1; attr=0xff; } //恢复正常显示日期else if(show_status==4){ show_status=2; attr=0xff; } //恢复正常显示时间break;case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁break;case 0xfe: if(show_status==0) attr=0x3f; //第一、二个数码管闪烁}} // end of if(keytmp==4)} // end of if(kp==0)} // end of if(km==0)} // end of if(keytmp!=0)}main(){unsigned char i;hour=23; min=58; sec=30; year=2; month=4; day=25;count_down=8000;flash=0; attr=0xff; led_on=1;km=0; kp=0; show_status=2; //加电后显示当前时间new_alarm_info=0; sound=0; alarm_stop=0;for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置{ alarm[i].h=myread(i*2); alarm[i].m=myread(i*2+1); }alarm_en=myread(i*2); alarm_wk=myread(i*2+1);IE=0; IP=0; //disable all interrupt and lower priorityTMOD=0x12; //timer 0 is set to mode 2,auto_reloading,timer1,mode 1TR0=1; TR1=1; //timer0 interrupt most importantET0=1; ET1=1; EA=1; //enable interrupt functionwhile(1){ if(led_on)for(i=0;i<8;i++){ P2=0;if(flash || attr&(0x80>>i)){ P0=display[i]; P2=0x80>>i; DelayX1ms(1); }}else P2=0;if(new_alarm_info){ P2=0; //暂时关闭数码管new_alarm_info=0; //写入EEPROMfor(i=0;i<8;i++) { mywrite(i*2,alarm[i].h); mywrite(i*2+1,alarm[i].m); }mywrite(i*2,alarm_en); mywrite(i*2+1,alarm_wk);}}}。