基于单片机液晶定时闹钟的设计方案.doc_第1页
基于单片机液晶定时闹钟的设计方案.doc_第2页
基于单片机液晶定时闹钟的设计方案.doc_第3页
基于单片机液晶定时闹钟的设计方案.doc_第4页
基于单片机液晶定时闹钟的设计方案.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机液晶定时闹钟的设计方案1 设计方案论证1.1 应用近几年,单片机在各个领域得到广泛的应用。从工业到人们的日常生活,大部分的科技产品都是通过单片机来控制。在它问世之前,自动控制设备不能被广泛的应用,这是因为控制设备的体积庞大,耗电量大,价格昂贵。在第一台微处理器成功研制不久,第一个单片机就问世了。因为其小巧的体积,低功耗,以及高效的性能,单片机受到了大家的欢迎。今天,单片机成为了解决低复杂度,中等复杂度控制问题的传统选择。我们选择的方法是单片机开发设计使用的传统方法,通过本次设计,可以了解整个单片机开发的流程。 利用STC89C52单片机结合七段显示器完成的简易的定时闹铃时钟,干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、闹钟电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱动器译码驱动,通过LCD液晶显示屏显示出来。闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。通过设置现在的时间及显示闹铃设置时间,并在定时时间发出一阵声响,可以进步扩充控制电器的启停等。1.2 方案选择用单片机来设计数字钟,软件实现各种功能比较方便,但因软件的执行需要一定的时间,所以就会出现误差。因此我进一步努力,通过对比实际的时钟,查找出误差的来源,并作出调整,使得误差尽可能减小,达到实际数字钟系统的允许误差范围。在程序设计中,采用模块化的程序设计思想,对整个设计划分了若干个模块,先对各个模块分别进行设计,然后整合各个模块,进行仿真模拟,对出现的错误进行分析,然后找出问题的所在,改进程序,再仿真模拟,观察结果、分析结果,直至最终结果满足设置要求。电子闹钟应包括秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分。按键功能说明:K1,设置时间和闹钟的小时;K2,设置小时以及设置闹钟的开关;K3,设置分钟和闹钟的分钟;K4;设置完成退出。1.3 总设计框图及分析CPU按钮电路复位、时钟等电路电源系统闹铃声指示电路液晶显示器显示电路 图 1电子闹钟的主电路指的是图中CPU线框内部分,主要涉及到CPU电路和按键按钮电路。主机的设计具体地说有:1)系统时钟电路设计;2)系统复位电路设计;3)按键与按钮电路设计;4)闹铃声指示电路设计。本设计是定时闹钟的设计,由单片机STC89C52芯片和LCD显示器为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。电子钟设计可采用数字电路实现,也可以采用单片机来完成。数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用STC89C52,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, STC89C52的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。STC89C52单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进步可以扩充控制电器的启停。设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。设计完成的定时闹钟达到课程设计的要求,在到达到定时的时间时就会立即发出蜂鸣声音,持续一分钟。显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。也可以改蜂鸣器为继电器,通过控制继电器从而进一步扩展的来控制一些家电开关。2 硬件电路设计2.1 系统时钟电路设计对于时间要求不是很高的系统,只要按图进行设计就能使系统可靠起振并稳定运行。但由于原理图中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在本闹钟系统的实际应用中一定要注意正确选择参数(3010 PF),并保证对称性(尽可能匹配),选用正牌厂家生产的瓷片或云母电容,如果可能的话,温度系数要尽可能低。实验表明,这2个电容元件对闹钟的走时误差有较大关系。2.2系统复位电路的设计智能系统一般应有手动或上电复位电路。复位电路的实现通常有两种方式:)RC复位电路;)专用F监控电路。前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。对于复位要求高、并对电源电压进行监视的场合,大多采用这种方式。2.3闹钟指示电路设计闹铃指示可以有声或光两种形式。本系统采用声音指示。关键元件是蜂鸣器。蜂鸣器有无源和有源两种,前者需要输入声音频率信号才能正常发声,后者则只需外加适当直流电源电压即可,元件内部已封装了音频振荡电路,在得电状态下即起振发声。市场上的有源蜂鸣器分为3、5、6等系列,以适应不同的应用需要。闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。其电路设计参见系统原理图。2.4 电子闹钟的显示电路设计本次课程设计采用了液晶显示电路。液晶显示是一种被动式的显示器,即液晶本身不发光,而是利用液晶处理后能够改变光纤传输方向的特性,达到显示字符或者图形的目的。这类显示器具有体积小、重量轻、功耗较低、显示内容丰富等特点。LCD显示模块把LCD显示屏、背景光源、线路板和驱动集成电路等部件构成一个整体,作为一个独立部件使用,具有功能较强、易于控制、接口简单等优点。LCD显示模块按显示功能可分为:LCD段式显示模块、LCD字符型显示模块、LCD图形式显示模块三类,在本设计中将会采用字符型显示模块。LCD显示器内部共有14个引脚,包括:8个数据引脚,3个控制引脚,3个电源引脚。利用该显示器来显示“时”、“分”、“秒”计数器的输出状态。到达定时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现闹铃。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。2.5 仿真图运行仿真图3 程序设计3.1 概述软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。基于软件的秒脉冲信号通常有延时法和定时中断法。延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。例如,设定某定时器每100ms中断1次,则10次的周期为1s。这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。本系统中所使用的晶振频率为12MHZ。3.2 主模块的设计主模块是系统软件的主框架。结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。它的合理与否关系到程序最终的功能的多少和性能的好坏。本系统的主模块的程序框图如下图2所示:系统初始化定时初始化中断初始化串口初始化显示待机指示符设定闹铃时间判设置闹铃时间否?显示刷新启动走时有关变量初始化刷新显示判时或分变化否?秒指示判秒到否?闹铃判是否到闹铃时间?延时YYYY图 23.3 基本显示模块设计基本显示模块设计的重点是由显示代码取得相应的段码,显示段码数据的并行发送,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LCD显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。程序流程如图3所示将进制时分秒数据转化为显示代码 关显示以免显示抖动通过串口将时分秒数据传入数码管打开显示图 33.4 时间设定模块设计时间设定模块的设计要点是按键的去抖处理与“一键多态”的处理。即只涉及4个键完成了6位时间参数的设定。软件法去抖动的实质是软件延时,即检测到某一键状态变化后延时一段时间,再检测该按键的状态是否还保持着,如是则作为按键处理,否则,视为抖动,不予理睬。去抖中的延时时间一般参考资料多描述为10ms左右,实际应用中,应大于20ms,否则,会导致按一次作多次处理,影响程序正常执行。“一键多态”即多功能键的实现思想是,根据按键时刻的系统状态,决定按键采取何种动作,即何种功能。其流程图如下图4所示:设置键吗?设置模块初始化将在编参数送显示缓冲区闪烁标志为真?将当前位的显示代码置暗代码调基本显示模块刷新显示设置键吗?当前编辑位下移(下一位)当前编辑的是分各位?结束设定键吗?根据当前位的性质分别进行处理(含上下限判断) 图 43.5 闹铃功能的实现闹铃功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱动器译码驱动,通过六个七段LCD显示器显示出来。闹铃电路根据计时系统的输出状态产生一脉冲信号,然后加上一个高频或低频信号送到放大电路驱动蜂鸣器发声实现报时。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。其流程图如下所示:时十位、个位,分十位、个位改变了设置闹铃标志是否设置了闹铃清除闹铃标志判当前时间是设定时间中断返回中断返回闹铃判别处理图5.1 图5.2虑到实用性,在该电子钟的设计中修改定时或调整时间时采用了闪烁,而且以定时20组闹钟。在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。在显示程序段中主要进行了闪烁的处理,采用定时器中断置标志位,再与位选相互结合的方法来控制调时或定时中的闪烁。时,分,秒显示则是用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。初始化之后,用中断方式对其计数,计数的同时采用了定时器比较的方法,比较当前计数时间与定时时间是否相等,若相等则将闹铃标志位置数。由于定义了定时闹钟组,在这里采用中断组次,每中断一次比较一组闹钟,避免了一次比较中断时间过长,影响下次中断时间。显示之后查询闹铃标志位是否与前面所置数相等,若相等则响铃。为了避免响铃影响显示,采用了每显示几屏以后在显示程序中出现脉冲,驱动喇叭,不会影响显示。之后用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。3.6程序*版本号01 */* 模块构成: */#include #includehdy.h #includehs.c#includeiap_ds1302.h #includelcd1602.h #includezd.h#includeisp_52.h/#includeszxt.h#includeajjc.h#define bgsjcl 30 /背光时间#define xssjcl 100 /显示时间#define jbjcyssj 2 /警报解除延时/定义端口sbit fmqdk=P03; /闹钟端口sbit lcd_bg=P32; /背光/时间相关变量uchar mmzc=0; /秒暂存uchar nzsj42=0,0,0,0,0; /警戒时间bit bjsnbzw=0;char xlys_t=0;struct nzjg /定义结构体闹钟数据结构 / 包含: uchar nzsj_ss; /闹钟时间_时 uchar nzsj_ff; /闹钟时间_分 uchar nzsnbz; /闹钟标志 0:禁止 1:允许 uchar xlsj; /响铃时间 ;struct nzjg nz1,nz2,nz3,nz4,nz5,nz6; /模式 菜单 相关变量 显示相关变量char msbz=0,xxbz=0; /模式标志位,选项标志位 bit xsgxbzw=0,xscshbzw=0,xssnbzw=1,bgsnbzw=1; /显示更新标志位,显示初始化标志位,char bgsj_t=bgsjcl,xssj_t=xssjcl; /显示相关 显示使能时间,背光使能时间/调试用变量int a_ts=50,b_ts=50,c_ts=0,d_ts=0,e_ts=0,f_ts=0;bit bzw_ts=0;/* * */* * */void csmk()/ ksdqsj(); / lcd1602xssz (2,0x1e,mm);/测试模块/测试模块/测试模块/测试模块/测试模块/测试模块/测试模块/测试模块/测试模块/* * */* * */设定基础程序/功能加减设定/参数1:设定变量指针 uchar *sdbl/参数2:加上限 uchar shang/参数3:减下线 uchar xia/返回值:是否越界 char 上限越界:1 下线越界-1 否则:0uchar jjcl(uchar sdbl,uchar shang,uchar xia)char a=0; if(k1bzw=1) k1bzw=0; if(sdbl=shang) (sdbl)+; sdbl=xia; a=1; else (sdbl)+; if(k2bzw=1) k2bzw=0; if(sdblnzsj_ss=jjcl(nzzz-nzsj_ss,23,0); else if(xxbz=2) nzzz-nzsj_ff=jjcl(nzzz-nzsj_ff,59,0); else if(xxbz=3) nzzz-xlsj=jjcl(nzzz-xlsj,99,5); else if(xxbz=4) if(k2bzw=1)|(k1bzw=1) k2bzw=0; k1bzw=0; if(nzzz-nzsnbz=1) nzzz-nzsnbz=0; else nzzz-nzsnbz=1; /按键处理模块void ajclmk() ajjc(); if(k0bzw=1)|(k1bzw=1)|(k2bzw=1)|(k3bzw=1) if(xssj_t=0) k0bzw=0; msbz=0; xsgxbzw=1; bgsj_t=bgsjcl; /使能显示相关变量 xssj_t=xssjcl; if(k0bzw=1) k0bzw=0; xxbz=0; xscshbzw=0; / 标记为未初始化 msbz+; if(msbz=8) msbz=0; if(k3bzw=1) k3bzw=0; xsgxbzw=1; xxbz+; if(msbz=1) if(xxbz=7) xxbz=0; ksxrsj(); ksdqsj(); msbz=0; xscshbzw=0; else if(msbz1) if(xxbz=5) xxbz=0; msbz=0; xscshbzw=0; / iap_jjsjcc(); switch(msbz) case 1:ajsd2();break; /时间设定 case 2: case 3: case 4: case 5: case 6: case 7:ajsd3();break; /警戒设定 /* * */显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模块/显示模式0 时间显示/显示时间void xsms0() if(xscshbzw=0) xscshbzw=1; / 标记为已初始化 lcd1602csh (); /lcd初始化 xsgxbzw=1; / 标记为等待显示 /显示时间初屏 lcd1602xszfc(16,0x10, 2013-12-15 ); lcd1602xszfc(16,0x20, 18:16:20 ); if(xsgxbzw=1) xsgxbzw=0; lcd1602xssz (2,0x14,nn); lcd1602xssz (2,0x17,yy); lcd1602xssz (2,0x1a,rr); lcd1602xssz (2,0x22,ss); lcd1602xssz (2,0x25,ff); lcd1602xssz (2,0x28,mm); if(nz1.nzsnbz=1)|(nz2.nzsnbz=1)|(nz3.nzsnbz=1)|(nz4.nzsnbz=1)|(nz5.nzsnbz=1)|(nz6.nzsnbz=1) lcd1602xszfc (2,0x2c,); else lcd1602xszfc (2,0x2c, ); /显示模式2 时间设定显示void xsms2() if(xscshbzw=0) xscshbzw=1; / 标记为已初始化 lcd1602csh (); /lcd初始化 xsgxbzw=1; / 标记为等待显示 /显示时间初屏 lcd1602xszfc(16,0x10, 2013-12-15 ); lcd1602xszfc(16,0x20, 18:16:20 ); /载入设定值 nnn=nn;yyy=yy;rrr=rr;sss=ss;fff=ff;mmm=mm; if(xsgxbzw=1) xsgxbzw=0; lcd1602xssz (2,0x14,nnn); lcd1602xssz (2,0x17,yyy); lcd1602xssz (2,0x1a,rrr); lcd1602xssz (2,0x22,sss); lcd1602xssz (2,0x25,fff); lcd1602xssz (2,0x28,mmm); switch(xxbz) case 0:lcd1602gbkz(lcd1602_ggb ,0x14);break; case 1:lcd1602gbkz(lcd1602_gbsd,0x15);break; case 2:lcd1602gbkz(lcd1602_gbsd,0x18);break; case 3:lcd1602gbkz(lcd1602_gbsd,0x1b);break; case 4:lcd1602gbkz(lcd1602_gbsd,0x23);break; case 5:lcd1602gbkz(lcd1602_gbsd,0x26);break; case 6:lcd1602gbkz(lcd1602_gbsd,0x29);break; /显示模式3 闹钟时间设定显示 void xsms3() struct nzjg *nzzz; uchar dz1=0; if(xscshbzw=0) xscshbzw=1; / 标记为已初始化 lcd1602csh (); /lcd初始化 xsgxbzw=1; / 标记为等待显示 /闹钟时间设定初屏 lcd1602xszfc(16,0x20,* 18:16 -s *); lcd1602xszfc(16,0x10, ); lcd1602xssz (1,0x20,msbz-1); if(xsgxbzw=1) xsgxbzw=0; switch(msbz) case 2:nzzz=&nz1;break; case 3:nzzz=&nz2;break; case 4:nzzz=&nz3;break; case 5:nzzz=&nz4;break; case 6:nzzz=&nz5;break; case 7:nzzz=&nz6;break; lcd1602xssz(2,0x22,nzzz-nzsj_ss); lcd1602xssz(2,0x25,nzzz-nzsj_ff); lcd1602xssz(2,0x29,nzzz-xlsj); if(nzzz-nzsnbz=1) lcd1602xszfc(3,0x2d,on ); else lcd1602xszfc(3,0x2d,off); switch(xxbz) /光标位置设定 case 0: lcd1602gbkz(lcd1602_ggb,0x14);break; case 1: lcd1602gbkz(lcd1602_gbsd,0x23);break; case 2: lcd1602gbkz(lcd1602_gbsd,0x26);break; case 3: lcd1602gbkz(lcd1602_gbsd,0x2a);break; case 4: lcd1602gbkz(lcd1602_gbsd,0x2e);break; /显示控制模块void xsmk() if(xssj_t0) if(bgsj_t0) lcd_bg=0; /开背光 else lcd_bg=1; /关背光 switch(msbz) case 0:xsms0();break; /正常时间显示模式 case 1:xsms2();break; default:xsms3();break; else /禁止显示 if(xscshbzw=1) / lcd_qp(); /清屏 lcd_bg=1; /关背光 xscshbzw=0; / 标记为未初始化 /* * */* * */* * */* * */ /比较模块/确定当前时间是否满足警戒时间void nzsnhs() if(bjsnbzw=1) bjsnbzw=0; if(nz1.nzsnbz=1) /闹钟1比较 if(nz1.nzsj_ss=ss)&(nz1.nzsj_ff=ff) xlys_t=nz1.xlsj; if(nz2.nzsnbz=1) /闹钟1比较 if(nz2.nzsj_ss=ss)&(nz2.nzsj_ff=ff) xlys_t=nz2.xlsj; if(nz3.nzsnbz=1) /闹钟1比较 if(nz3.nzsj_ss=ss)&(nz3.nzsj_ff=ff) xlys_t=nz3.xlsj; if(nz4.nzsnbz=1) /闹钟1比较 if(nz4.nzsj_ss=ss)&(nz4.nzsj_ff=ff) xlys_t=nz4.xlsj; if(nz5.nzsnbz=1) /闹钟1比较 if(nz5.nzsj_ss=ss)&(nz5.nzsj_ff=ff) xlys_t=nz5.xlsj; if(nz6.nzsnbz=1) /闹钟1比较 if(nz6.nzsj_ss=ss)&(nz6.nzsj_ff=ff) xlys_t=nz6.xlsj; void sjclmk() mm=dqsj(6); if(mm!=mmzc) if(xlys_t=0) fmqdk=0; else fmqdk=1; mmzc=mm; xsgxbzw=1; nzsnhs(); if(mm=0) bjsnbzw=1; ff=dqsj(5); if(ff=0) ss=dqsj(5); if(ss=0) rr=dqsj(5); if(rr=0) yy=dqsj(5); if(yy=0) nn=dqsj(5); /启动初始化void csh() fmqdk=0; lcd1602csh (); ajjccsh(); nz1.nzsj_ss=12; nz1.nzsj_ff=17; nz1.nzsnbz=1; nz1.xlsj=10; nz2=nz1; nz3=nz1; nz4=nz1; nz5=nz1; nz6=nz1; ksdqsj();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论