单片机闹钟
单片机设计闹钟课程设计

单片机设计闹钟课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理,掌握闹钟设计的硬件组成和功能模块。
2. 使学生掌握C语言编程基础,能够运用C语言编写简单的闹钟程序。
3. 帮助学生了解单片机中断、定时器等知识,并能将其应用于闹钟设计。
技能目标:1. 培养学生动手实践能力,能够独立完成闹钟硬件电路的搭建和程序编写。
2. 提高学生问题解决能力,能够根据实际需求调整闹钟程序,实现相应功能。
3. 培养学生团队协作能力,能够在小组合作中发挥个人优势,共同完成课程任务。
情感态度价值观目标:1. 培养学生对单片机及编程的兴趣,激发学习热情,树立自信心。
2. 培养学生勇于尝试、不断探索的精神,使其面对困难时保持积极态度。
3. 培养学生遵守实验规程,注重安全意识,养成良好的实验习惯。
课程性质:本课程为实践性较强的课程,旨在让学生通过动手实践,掌握单片机设计与编程的基本技能。
学生特点:学生处于高年级阶段,已具备一定的电子技术基础和编程知识,具备独立思考和解决问题的能力。
教学要求:教师应注重理论与实践相结合,引导学生主动参与,关注个体差异,激发学生潜能,提高教学质量。
通过课程学习,使学生能够将所学知识应用于实际项目中,达到学以致用的目的。
二、教学内容1. 硬件知识:介绍闹钟电路的组成,包括单片机芯片、时钟电路、蜂鸣器、按键等部件的功能和连接方式。
- 教材章节:《单片机原理与应用》第三章“单片机硬件结构”2. C语言编程:讲解C语言基础知识,重点掌握数据类型、运算符、控制语句等,并应用于单片机程序编写。
- 教材章节:《C语言程序设计》第二章“C语言基础”3. 单片机编程:学习单片机编程基础,掌握中断、定时器等编程方法,实现闹钟功能。
- 教材章节:《单片机原理与应用》第四章“中断与定时器”4. 闹钟程序设计:根据实际需求,编写闹钟程序,实现设定时间、响铃、停止等功能。
- 教材章节:《单片机原理与应用》第七章“项目实践案例”5. 实践操作:指导学生进行闹钟硬件电路搭建,程序编写和调试,培养学生动手能力。
单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
单片机闹钟设计程序报告

单片机闹钟设计程序报告1. 引言闹钟作为人们日常生活中的常用物品,不仅有叫醒人们起床的功能,还可以作为提醒的工具。
随着科技的进步,单片机闹钟逐渐取代了传统的机械闹钟,成为人们生活中不可或缺的一部分。
本报告旨在介绍一个基于单片机的简单闹钟设计程序。
2. 设计方案本设计方案使用了单片机和数码管作为主要硬件,通过对单片机的编程,实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
2.1 硬件设计硬件方面,本设计基于某型号的单片机和数码管。
单片机通过相关的引脚与数码管相连,通过控制引脚的电平来显示不同的数字。
2.2 软件设计软件方面,本设计使用C语言编程实现。
主要的功能包括获取当前时间、显示时间、设置时间、设置闹钟时间、闹钟触发检测、蜂鸣器报警等。
3. 程序实现3.1 初始化设置在程序的开始部分,需要对单片机进行初始化设置。
包括设置引脚的输入输出模式、设置计时器、设置中断等。
3.2 时间显示为了实现时间显示的功能,我们需要通过单片机的计时器来不断获取当前时间,并将其转换为时、分、秒的格式。
然后通过数码管显示出来。
3.3 时间设置通过给单片机的某个引脚接入按钮,实现时间设置功能。
当按钮被按下时,单片机进入时间设置模式。
此时,用户可以通过另外的按钮来逐个调整时、分、秒的数值。
3.4 闹钟时间设置类似于时间设置,闹钟时间设置也需要通过按钮来实现。
用户可以按下对应的按钮来设置闹钟的时、分,设置完毕后,单片机会将设置的时间保存起来。
3.5 闹钟触发检测在每一次时间显示的循环中,程序都会检测当前时间是否与闹钟时间相符。
如果相符,则触发闹钟,蜂鸣器开始报警。
3.6 蜂鸣器报警通过单片机的一个输出引脚,连接到蜂鸣器,实现蜂鸣器的报警功能。
当闹钟触发时,单片机会给对应的引脚输出一个高电平,从而使蜂鸣器发声。
4. 总结通过对单片机闹钟设计程序的实现,我们成功实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
单片机定时闹钟课程设计

单片机定时闹钟课程设计一、课程目标知识目标:1. 理解单片机定时器的工作原理,掌握定时器的编程方法;2. 学会使用单片机实现闹钟功能,了解时间计算与时间显示的基本方法;3. 掌握相关电子元器件的原理和功能,如晶振、电容、数码管等。
技能目标:1. 能够运用C语言编写单片机程序,实现闹钟的定时与显示功能;2. 学会使用调试工具对单片机程序进行调试,解决常见问题;3. 提高动手能力,能够独立完成单片机定时闹钟的硬件电路搭建与程序编写。
情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发创新意识;2. 培养学生团队协作精神,学会共同解决问题;3. 增强学生实践操作能力,树立实践出真知的观念。
课程性质:本课程为实践性课程,结合理论教学,注重培养学生的动手能力与实际应用能力。
学生特点:学生具备一定的单片机基础知识,对编程有一定了解,但对实际应用尚缺乏经验。
教学要求:结合学生特点,注重理论与实践相结合,以学生为主体,引导学生主动参与,提高学生的实践操作能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 理论知识:- 单片机定时器/计数器的工作原理与编程方法;- 时间计算与时间显示技术;- 硬件电路设计原理,包括晶振、电容、数码管等元器件的应用。
2. 实践操作:- 搭建单片机定时闹钟的硬件电路;- 编写单片机程序,实现定时与显示功能;- 使用调试工具对程序进行调试,解决常见问题。
3. 教学大纲:- 第一阶段:回顾单片机基础知识,介绍定时器/计数器原理,分析闹钟功能需求;- 第二阶段:学习时间计算与显示技术,讲解硬件电路设计方法;- 第三阶段:动手实践,分组进行硬件电路搭建与程序编写;- 第四阶段:程序调试与优化,展示成果,总结经验。
4. 教材关联:- 教材第3章:单片机定时器/计数器的原理与应用;- 教材第4章:C语言编程基础,涉及闹钟程序编写;- 教材第5章:电子元器件及其应用,用于硬件电路设计。
基于单片机的定时闹钟设计.

目录目录 (I)一设计题目 (1)二设计要求 (1)三作用与目的 (1)四设备及软件 (2)1.AT89C51单片机 (2)2. Proteus仿真软件 (2)3.Keil软件 (3)五系统设计方案 (4)1 电路的总体原理框图 (4)2 工作原理 (5)六系统硬件设计 (5)1.系统总体设计 (5)2.系统时钟电路设计 (6)3.系统复位电路的设计 (6)4.闹钟指示电路设计 (6)5.电子闹钟的显示电路设计 (6)七系统软件设计 (7)1.主模块的设计 (7)2.基本显示模块设计 (8)3. 时间设定模块设计 (9)4. 闹铃功能的实现 (10)八 Proteus软件仿真 (11)1.本次试验的效果图 (12)2.性能及误差分析: (12)九设计中的问题及解决方法 (13)十设计心得 (14)参考文献 (15)致谢 (16)附录1 系统整体结构电路原理图 (17)附录2 程序清单 (18)基于单片机的定时闹钟设计一设计题目基于单片机的定时闹钟二设计要求1、能显示时时-分分-秒秒。
2、能够设定定时时间、修改定时时间。
3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。
三作用与目的以单片机为核心的数字时钟是很有社会意义和社会价值的。
钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能数字闹钟通过数字电路实现时、分、秒。
数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。
多功能数字钟的应用非常普遍。
由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行校时、定时等功能。
基于单片机的定时闹钟设计

基于单片机的定时闹钟设计设计定时闹钟是人们日常生活中常见的需求之一,而单片机技术的发展为定时闹钟的实现提供了可行的解决方案。
本文将介绍基于单片机的定时闹钟设计。
一、研究背景及意义在现代社会中,时间是人们日常生活中非常重要的一个因素。
为了更好地规划时间和提高生活效率,人们需要定时提醒自己进行各种活动。
闹钟作为定时提醒的工具,在人们的日常生活中扮演着不可替代的角色。
而基于单片机的定时闹钟实现具有高精度、多功能等优点,因此备受人们青睐。
二、技术方案设计本文设计的基于单片机的定时闹钟主要由三部分组成:时钟电路、单片机控制电路和显示电路。
1. 时钟电路时钟电路采用RTC芯片,可以提供高精度的时间计量。
RTC芯片内部自带晶振,保证了较高的时钟精度。
时钟电路主要功能为提供当前时间,包括小时、分钟和秒。
2. 单片机控制电路单片机控制电路是实现定时闹钟的核心部分。
程序流程如下:①初始化:单片机启动后,需要对RTC芯片和闹钟设定进行初始化,包括设定当前时间和设定闹钟时间。
②计时函数:单片机开启定时器,在每秒钟时钟信号来临时,计时器会进行一次计数。
③闹钟判断:单片机判断当前时间是否等于闹钟设定时间,如果相等,则触发闹钟事件,启动蜂鸣器提示。
④按键设置:单片机可以通过按键进行时间设置和闹钟设置,包括增加或减少小时、分钟和秒数,并将设置信息保存至RTC芯片内存中。
3. 显示电路显示电路采用数码管进行显示,使用单片机控制输出数据。
数码管分为小时显示、分钟显示和秒显示,可以满足不同的显示需求。
三、实验结果分析通过实验结果可以发现,本文设计的基于单片机的定时闹钟可以准确地显示时间和定时提醒。
同时,可以通过按键进行时间和闹钟的设置,并存储至RTC芯片内部,保证了时间和闹钟的持久性。
四、结论及展望基于单片机的定时闹钟设计具有实用性和可行性,可以提高人们生活的效率和品质。
然而,本设计在信号筛选和抗干扰能力方面还有一定的改进空间,需要通过更深入的研究来进一步完善。
基于单片机定时闹钟的设计
基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。
其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。
本文将探讨如何基于单片机设计一个定时闹钟。
一、硬件需求1、单片机:选择一个适合你项目的单片机。
比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。
2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。
可以选择常见的16x2字符型LCD显示屏。
3、按键模块:用于设定时间和闹钟功能。
一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。
4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。
二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。
2、编程语言:一般使用C或C++进行编程。
3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。
程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。
三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。
2、初始化:在程序中初始化所有的硬件设备。
3、时间设定:通过按键模块设定时间。
你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。
4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。
5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。
四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。
可以考虑使用网络时钟或者GPS模块。
2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。
3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。
4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。
单片机定时闹钟课程设计
单片机定时闹钟课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解定时器的功能和工作原理。
2. 使学生掌握定时闹钟程序编写的基本方法,了解中断处理的相关知识。
3. 帮助学生了解电子时钟的基本构成,掌握时间计算和显示的相关技巧。
技能目标:1. 培养学生动手实践能力,学会使用编程软件编写、调试程序,实现单片机定时闹钟功能。
2. 提高学生分析问题和解决问题的能力,能够独立完成定时闹钟课程的各项任务。
3. 培养学生团队协作能力,学会在项目过程中进行有效沟通和分工合作。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣,激发他们探索未知、自主学习的精神。
2. 培养学生勇于尝试、不怕失败的品质,提高他们面对困难时的心理素质。
3. 增强学生的创新意识,鼓励他们发挥想象力和创造力,设计出具有个性的定时闹钟作品。
课程性质分析:本课程属于电子技术与应用领域的实践课程,旨在让学生通过动手实践,掌握单片机定时闹钟的设计与制作。
学生特点分析:学生处于中学阶段,具有一定的电子技术基础和编程能力,对新鲜事物充满好奇,喜欢动手实践。
教学要求:1. 结合课本知识,注重理论与实践相结合,提高学生的实际操作能力。
2. 注重培养学生的创新精神和团队协作能力,提高他们的综合素质。
3. 以学生为主体,关注个体差异,因材施教,使每个学生都能在课程中取得进步。
二、教学内容1. 单片机基础原理回顾:包括单片机的结构、工作原理、定时器/计数器功能。
2. 定时器编程技术:重点讲解定时器的初始化、中断处理程序编写,以及定时器应用实例。
- 教材章节:第三章《单片机定时器/计数器》3. 中断系统原理:介绍中断的概念、中断优先级、中断向量表,以及中断处理流程。
- 教材章节:第四章《中断系统》4. 显示技术:讲解数码管、LCD等显示器件的工作原理和编程方法。
- 教材章节:第五章《显示技术》5. 定时闹钟设计与实现:包括闹钟功能的整体设计、程序编写、调试与优化。
单片机做闹钟综合设计报告
单片机做闹钟综合设计报告1. 引言闹钟是人们日常生活中常见的用于定时提醒的设备,而使用单片机来设计一款智能闹钟更加便捷和实用。
本设计报告将介绍如何使用单片机进行闹钟设计并具备一定的智能化功能。
2. 设计原理2.1 硬件设计本设计使用了一块单片机开发板、一块液晶显示屏、一个蜂鸣器和几个按键进行硬件设计。
- 单片机开发板:使用STC89C52单片机作为核心处理器,具有较高的稳定性和可靠性。
- 液晶显示屏:用于显示当前时间、闹钟设置和其他相关信息。
- 蜂鸣器:用于发出闹钟提醒的声音。
- 按键:用于设置闹钟时间和关闭闹钟。
2.2 软件设计软件设计主要基于C语言编写的程序,通过单片机的IO口来控制硬件设备。
- 系统初始化:设置单片机的时钟、IO口和外部中断等。
- 时间设置:通过按键实现对当前时间的设置,包括小时、分钟和秒钟。
- 闹钟设置:通过按键实现对闹钟时间的设置,并保存到EEPROM中,以便断电后依然能够记住设置的闹钟时间。
- 闹钟提醒:当当前时间和闹钟时间匹配时,发出蜂鸣器的声音提醒用户。
- 其他功能:包括显示当前时间、闹钟时间和提醒信息等。
3. 设计流程本次设计主要分为硬件设计和软件设计两个部分。
3.1 硬件设计流程1. 搭建电路连接,将单片机、液晶显示屏、蜂鸣器和按键连接在一起。
2. 使用示波器测试电路连接的正常性和稳定性,保证电路连接无误。
3. 按照电路图逐步搭建实验电路。
4. 将电路连接好后,用万用表和示波器等测试仪器对电路进行检测,确保硬件连接正确。
3.2 软件设计流程1. 编写初始化函数,对单片机进行必要的初始化设置。
2. 编写时间设置函数,通过调用按键函数实现时间的增加和减少,并将设置后的时间显示在液晶显示屏上。
3. 编写闹钟设置函数,通过按键设置闹钟时间,并将设置的闹钟时间保存在EEPROM中,以备断电后读取。
4. 编写闹钟提醒函数,通过对比当前时间和已设置的闹钟时间,当条件满足时,发出蜂鸣器的声音提醒用户。
单片机闹钟原理
单片机闹钟原理
单片机闹钟是一种利用单片机控制的电子设备,用于显示时间并在特定时间点发出警报提醒人们。
它的工作原理如下:
1. 时钟电路:使用晶振和电容等元件组成的时钟电路,提供稳定的振荡信号为单片机提供精确的时间基准。
2. 单片机控制:利用单片机内部的定时器或外部时钟模块,编写程序控制时钟的运行,实现时间的增加和显示。
3. 显示模块:使用液晶显示屏或数码管等显示模块,将单片机计算得到的时间信息以可视化的形式呈现给用户。
4. 按键输入:设有按键输入模块,通过用户的按键操作来设置闹钟的时间、开关闹钟等功能。
5. 闹铃功能:在设定的时间点,单片机控制警报电路发出声音或振动等警示信号,提醒用户。
6. 电源模块:提供电源给单片机和其他电路模块,可以使用电池、适配器等方式。
通过以上几个主要模块的配合,单片机闹钟可以实现时间的显示、闹钟的设置和报警功能。
用户可以根据自己的需求设定闹钟时间,并通过闹铃功能在设定的时间点提醒自己。
同时,单片机闹钟还可以具备其他功能,如温湿度测量、光感应等,以满足不同的使用场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;时钟程序---clock1.2;;; ~~~~~~~~~~~信科院*** ~~~~~~~~~~~~~~~~ ;;;实现基本显示时间,年月日,星期功能;实现调时间功能;凌晨跳变完成;设定闹钟功能;响闹铃功能;;创建时间:2011-5-7 修改时间:2011-5-8;确定:2011-5-8;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;20H-22H:设定时间时的秒,分,时寄存;23H-25H:设定时间时的日,月,年寄存;26H:设定时间时的星期寄存;27H-29H:检测时间是否匹配程序的设定时,分,秒寄存;30H:是否开闹铃储存31H-32H:闹铃设定时间的时,分寄存33H-34H:闹铃设定中的时分寄存;;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ORG 00HSPK EQU P3.7RST EQU P3.0SCLK EQU P3.1IO EQU P3.2RS EQU P3.6RW EQU P3.5E EQU P3.4SJMP STARORG 70HSTAR: LCALL DELAY100 ;最终检测到的按键的值储存在R1中MOV SP,#70HLJMP INITIALLOOP: LCALL DISPLAYACALL KEYCJNE R2,#0AH,QUITADJUST_LCALL ADJUSTQUITADJUST_:CJNE R2,#0CH,QUITRINGCHAR_LCALL RINGCHARQUITRINGCHAR_:CJNE R2,#0BH,QUITRINGSET_LCALL RINGSETQUITRINGSET_:LCALL RINGBEGINTESTSJMP LOOP;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;键盘子函数;在键盘测试之前先置入口参数R0,若为0则进行无穷检测,否则只进行一次有效输入;函数需要用到R0,R1,R2,R3,R5,R6,R7,默认测试端口为P2口;返回参数为A,A为其按键代表的字符码;未push任何寄存器,返回值为R2;2011-5-3;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------KEYBOARD:MOV R2,#0FFHMOV P2,#0FHMOV A,P2CPL AANL A,#0FH;JZ KEYBOARDMOV R5,AMOV P2,#0F0HMOV A,P2CPL AANL A,#0F0H;JZ KEYBOARDMOV R4,ALCALL DELAY10KEY1:MOV A,P2CPL AANL A,#0F0HJNZ KEY1 ;以上为行列扫描LCALL DELAY10MOV A,R4ORL A,R5MOV B,AMOV R1,#0MOV DPTR,#KEYBOARDTABMOV R3,#11HWHICHKEY:MOV A,R1 ;R1记录其是第几个按键MOVC A,@A+DPTRDJNZ R3,KEYNEXTSJMP KEYNEXT2KEYNEXT:CJNE A,B,WHICHKEY1KEYNEXT2:LCALL KEYSTANDFOR ;跳到转化为键盘代表意义函数,转化为具体ASKII 码,并存在A中MOV R2,A ;将A中的数据放在R2中,并以R2为返回值;IFR0IS1:RETWHICHKEY1:INC R1SJMP WHICHKEYKEYBOARDTAB:DB11H,21H,41H,81H,12H,22H,42H,82H,14H,24H,44H,84H,18H,28H,48H,88H,0FFH KEYSTANDFOR: ;赋予每个检测到的按键一个8bit字符MOV A,R1INC AMOVC A,@A+PCRETDB 1H,2H,3H,0AH,4H,5H,6H,0BH,7H,8H,9H,0CH,0EH,0H,0FH,0DH,0FFH ;!!!!!修改了最后一个值,原本是0ffhDELAY100: ;延时100msMOV R6,#200D1001:MOV R7,#250DJNZ R7,$DJNZ R6,D1001RETDELAY10: ;延时10msMOV R6,#20D101:MOV R7,#248DJNZ R7,$DJNZ R6,D101RET;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;@!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!; 测试用:键盘输入MADE:5-5;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------KEY: MOV R2,#0FFH ;重要:R2默认为FFH,若结束程序时检测到R2不变,则为未有按键按下MOV R3,#0FEHMOV R1,#0KEY0: MOV A,R3MOV P2,AMOV A,P2SWAP AMOV R4,ASETB CMOV R5,#4KEY2: RRC AJNC KEYININC R1DJNZ R5,KEY2MOV A,R3SETB CRLC AMOV R3,AJB ACC.4,KEY0;MOV R1,#11H;MOV R2,#0FFHRETKEYIN:ACALL DE10K1: MOV A,P2SWAP A ;!!!!!!!!!!!!XRL A,R4JZ K1ACALL KEYVLCALL DE10MOV R2,AMOV R1,#11HRETKEYV: MOV A,R1INC AMOVC A,@A+PCRETDB 7H,8H,9H,0AH,4H,5H,6H,0BH,1H,2H,3H,0CH,0EH,0H,0FH,0DH,0FFH ;~~键盘值~~DE100: MOV R6,#200D1: MOV R7,#250DJNZ R7,$DJNZ R6,D1RETDE10: MOV R6,#40 ;!!!!!此处改变了最初的值,原本为20,则延时10ms!!!!!!!D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2RET;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;1602子函数;使用P1口和P3.5,P3.6,P3.7;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------MOV P3,#0FFHMOV P1,#01H ;清屏ACALL ENABLEMOV P1,#38H ;设置数据库长度为8位,两行显示,字形为5*7ACALL ENABLEMOV P1,#0CH ;设置开显示屏,关闭光标,字符不闪烁ACALL ENABLEMOV P1,#06H ;设置读写一个字符后,地址指针加1,光标加1,写完一个字符后光标不移动ACALL ENABLEMOV P1,#80H ;设置开始字符为第一行,第一个字符ACALL ENABLEMOV DPTR,#INITIALTAB1LCALL IWRITE ;写第一行MOV P1,#0C0HACALL ENABLEMOV DPTR,#INITIALTAB2LCALL IWRITE ;写第二行;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;创建自定义新字符,该字符为闹钟标志;由于00H指示输出结束,所以该字符放在CGRAM的01H中;2011-5-3;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------CREATECHAR:MOV R3,#10H ;R3控制读入8个字节的数据MOV R4,#48HMOV R5,#0HMOV DPTR,#CREATECHARTABCREATE1:MOV A,R5MOVC A,@A+DPTRMOV P1,R4 ;R4为CGRAM地址值,向1602写入CGRAM地址值ACALL ENABLESETB RSCLR RWMOV P1,A ;向所确定的CGRAM地址值写入表中对应的数据CLR EACALL MAXDELAYCLR RSSETB EINC R4INC R5DJNZ R3,CREATE1RETCREATECHARTAB: DB 0H,04H,15H,0EH,1FH,1FH,1FH,00H,0H,04H,15H,0EH,11H,11H,1FH,00H;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;初始化程序,初始化到欢迎界面,闪烁,并延时;不使用其它特别寄存器,但将P3口全都暂时默认为高电平;内嵌有enable函数,完成整个程序时可将其放在initial函数之外;2011-5-3;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------INITIAL:MOV P3,#080HMOV P1,#01H ;清屏ACALL ENABLEMOV P1,#38H ;设置数据库长度为8位,两行显示,字形为5*7ACALL ENABLEMOV P1,#0CH ;设置开显示屏,关闭光标,字符不闪烁ACALL ENABLEMOV P1,#06H ;设置读写一个字符后,地址指针加1,光标加1,写完一个字符后光标不移动ACALL ENABLEMOV P1,#80H ;设置开始字符为第一行,第一个字符ACALL ENABLEMOV DPTR,#INITIALTAB1 ;欢迎界面LCALL IWRITE ;写第一行MOV P1,#0C0HACALL ENABLEMOV DPTR,#INITIALTAB2LCALL IWRITE ;写第二行MOV P1,#0DHACALL ENABLE;***************************************************************;初始化1302CLR RSTNOPCLR SCLK ;1302初始化NOPMOV B,#8EH ;初始化写MOV A,#00HLCALL WRITEBYTEMOV B,#81H ;初始化为时钟不暂停LCALL READBYTEANL A,#7FHMOV B,#80HLCALL WRITEBYTEMOV B,#85H ;初始化时钟为24小时制LCALL READBYTEANL A,#7FHMOV B,#84HLCALL WRITEBYTE;***************************************************************LCALL CREATECHAR ;创造自定义字符MOV P1,#01H ;清屏LCALL ENABLEMOV P1,#04H ;令写一个字符后光标减1LCALL ENABLEMOV 30H,#00H ;初始化是否开ring,1为开,0为关MOV 31H,#00H ;初始化闹铃的时MOV 32H,#00H ;初始化闹铃的分HALFINITIAL: ;半初始化程序;*************************************************************** ;显示星期MOV P1,#8DH ;显示星期几的位置为#8CHLCALL ENABLEMOV DPTR,#WEEKDAYMOV B,#8BH ;读取星期几的数据LCALL READBYTEDEC AMOV B,#3MUL ABMOV R5,AMOV R3,#03HDISWEEKDAY:MOVC A,@A+DPTR ;获取从哪个字符开始读MOV P1,ASETB RSCLR RWCLR EACALL MAXDELAYSETB EINC R5MOV A,R5DJNZ R3,DISWEEKDAY;***************************************************************;*************************************************************** ;初始化年月日MOV P1,#89H ;显示年月日LCALL ENABLEMOV B,#87H ;显示日LCALL WRITENUMMOV A,#0B0HLCALL WRITE1602MOV B,#89H ;显示月ACALL WRITENUMMOV A,#0B0HLCALL WRITE1602MOV B,#8DH ;显示年LCALL WRITENUMMOV A,#30H ;显示年的最前面两个数,默认为20LCALL WRITE1602MOV A,#32HLCALL WRITE1602;**************************************************;初始化闹铃;**************************************************MOV P1,#0CFH ;确定闹铃时间的位置LCALL ENABLEMOV A,32H ;显示闹铃时间的分ANL A,#0FHADD A,#30HLCALL WRITE1602MOV A,32HANL A,#0F0HSWAP AADD A,#30HLCALL WRITE1602MOV A,#3AH ;显示冒号LCALL WRITE1602MOV A,31H ;显示闹铃时间的时ANL A,#0FHADD A,#30HLCALL WRITE1602MOV A,31HANL A,#0F0HSWAP AADD A,#30HLCALL WRITE1602MOV P1,#0C9H ;确定闹铃符号的位置LCALL ENABLEMOV A,30HCJNE A,#00H,OPENRINGCHARMOV A,#02H ;闹铃符号显示为中空的关闹铃符号SJMP DISRINGCHAROPENRINGCHAR:MOV A,#01H ;闹铃符号显示为实心的开闹铃符号DISRINGCHAR:LCALL WRITE1602 ;显示闹铃符号;**************************************************;*************************************************************** LJMP LOOPWEEKDAY:DB 'NUSNOMEUTDEWUHTIRFTAS'MAXDELAY: ;长延时MOV R7,#1MAXD1: MOV R6,#255MAXD2: DJNZ R6,MAXD2DJNZ R7,MAXD1RETLMAXDELAY: ;初始化延时MOV R7,#255LMAXD1: MOV R6,#255LMAXD2: NOPDJNZ R6,LMAXD2DJNZ R7,LMAXD1RETLLMAXDELAY: ;使能延时MOV R7,#10LLMAXD1:MOV R6,#255LLMAXD2:DJNZ R6,LLMAXD2DJNZ R7,LLMAXD1RETIWRITE:MOV R1,#00HIWRITE1:MOV A,R1MOVC A,@A+DPTRACALL IWRITE2INC R1CJNE A,#00H,IWRITE1RETIWRITE2:MOV P1,ASETB RSCLR RWCLR EACALL LMAXDELAYSETB ERETENABLE: CLR RSCLR RWCLR EACALL LLMAXDELAYSETB ERETINITIALTAB1: DB '0 9 3 8 4 0 4 6',00INITIALTAB2: DB ' INITIALIZE...',00H;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;显示程序;;;2011-5-3;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------DISPLAY:MOV P1,#0CH ;设置开显示屏,关闭光标,字符不闪烁ACALL ENABLEMOV P1,#04H ;令写一个字符后光标减1LCALL ENABLEMOV P1,#0C7H ;令光标开始时位于第二行第8位数,这样是为了显示e.g.15:35:00的时间格式:LCALL ENABLEMOV A,R1ANL A,#0FEHMOV R1,A ;R0最低位为高指示现在是00:00:00MOV B,#81HACALL WRITENUM ;显示秒MOV A,#3AH ;写一个“:”到光标上ACALL WRITE1602MOV B,#83H ;显示分ACALL WRITENUMMOV A,#3AH ;写一个“:”到光标上ACALL WRITE1602MOV B,#85H ;显示小时ACALL WRITENUMMOV 27H,#00HMOV 28H,#00HMOV 29H,#00HLCALL TESTTIMEJZ NOT000000LJMP HALFINITIALNOT000000:RETWRITENUM:;函数前置条件:在B有读取到的数据;该子函数1302中某RAM中的数据,并且分离高低四位,;转化为1602的码制,将其写在1602上当前光标对应的地方ACALL READBYTEPUSH ACCANL A,#0FHADD A,#30H ;分离第四位ACALL WRITE1602POP ACCSWAP AANL A,#07HADD A,#30H ;分离高四位ACALL WRITE1602RETWRITE1602: ;将A中的数据写在现在1602上光标所对的地方MOV P1,ASETB RSCLR RWCLR EACALL MAXDELAYSETB ERET;****************************************************************************** ***;写入一个地址之后,从DS1302读一个字节;从最低位开始将IO中的8bit送C 写地址数据上升沿有效默认SCLK初始化为低;最终将读取数据送AREADBYTE:CLR SCLKSETB RSTMOV A,BMOV R4,#8READLOOP1:CLR SCLKRRC AMOV IO,CSETB SCLKNOPDJNZ R4,READLOOP1MOV R4,#8 ;R4控制移位8次READLOOP2:CLR SCLKNOPMOV C,IO ;动作RRC A ;将C中的1bit传到A的最高位SETB SCLKDJNZ R4,READLOOP2CLR RSTNOPCLR SCLKRET;写入一个地址之后,从DS1302写入一个字节,该字节原本放在A中;从最低位开始将IO中的8bit送C 写地址数据上升沿有效默认SCLK初始化为低;最终将读取数据送ABYTE:CLR SCLKMOV R4,#8 ;R4控制移位8次MOV A,BBYTELOOP:CLR SCLKRRC AMOV IO,CSETB SCLKDJNZ R4,BYTELOOPRET;************ !!TEST WRITEBYTE FUNCTION:WRITEBYTE:CLR SCLKSETB RSTPUSH ACCMOV A,BMOV R4,#8WRITE1:RRC ACLR SCLKMOV IO,CSETB SCLKDJNZ R4,WRITE1CLR SCLKPOP ACCMOV R4,#8WRITE2:RRC ACLR SCLKMOV IO,CSETB SCLKDJNZ R4,WRITE2CLR RSTRET;****************************************************************************** ****;----------------------------------------------------------------------------------;----------------------------------------------------------------------------------;修改时间子函数;1.存秒,分,。