单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习、应用,以
AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由直流电源供电,通过数码管能够准确显数字时钟是现代社会应用广泛的计时工具,在航天、电子等科研单位,工厂、医院、学校等企事业单位,各种体育赛事及至我们每个人的日常生活中都发挥着重要的作用。本系统是基于AT89C51单片机设计的一个具有六位LED显示的数字时实时钟,采用独立式按键进行时间调整,同时引入一个内部充电电源在停止外部供电时,仍具有内部计时的功能。该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点
第2章 系统设计
2.1 电路组成及工作原理
本文数字时钟设计原理主要利用AT89C51单片机,由单片机的P0口控制数码管的位显示, P2口控制数码管的段显示,P1口与按键相接用于时间的校正。在设计中引入两个电源电路,一个是外部电源系统产生+5V电压,用于给CPU及显示电路提供工作电压,这是数字时钟正常工作时的总电压。另一个是备用电源,当外部电源关断时由它提供工作电压使CPU继续工作,利用单片机的空闲方式降低功耗,数码管不显示但能使计时保持正常,不会造成掉电时计时清零的现象。针对内外两个电源情况又加入了MC34064电压检测电路,用于时实判断是哪各电源在工作。
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。
2.2 硬件部分
2.2.1 单片机系统
2.2.1.1 单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU),随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/O口),可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED驱动电路),脉宽调制电路(PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。
本文采用的单片机为AT89C51,AT89C51是一种低功耗、高性能的片内含有4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。它的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.2.2.2 AT89C51的主要性能参数:
与MCS-51产品指令系统完全兼容 4k 字节可重擦写FLASH闪速存储器 1000次擦写周期
全静态操作:0Hz—24MHz 三级加密程序存储器 128×8字节内部RAM 32个可编程I/O口线 2个16位定时/计数器
6个中断源
可编程串行URAR通道 低功耗空闲和掉电模式
AT89C51提供以下标准功能:4k 字节FLASH闪速存储器,128字节内部RAM,32个I/O口线,2个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51降至0Hz的静态逻辑操作,并支持两种可选的节电工作模式。空闲方式体制CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器体制工作并禁止其他所有不见工作直到下一个硬件复位。
2.2.2 显示部分
单片机应用系统中使用的显示器主要有发光二极管显示器,简称LED(Light Emitting Diode);液晶显示器LCD(Liquid Crystal Display);近几年也有配置CRT显示器的。而目前在单片机系统中,通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
2.2.2.1 LED显示结构与原理
单片机中通常用七段LED构成字型“8”,另外,还有一个小数点发光二极管以显示小数位!这种显示器有共阴和共阳两种!发光二极管的阳极连在一起的(公共端)称为共阳极显示器,阴极连在一起的称为共阴极显示器。(如下图所示)
一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划(段) a_g,另一个小数点为dp发光二极管。当在某段发光二极管上施加一定的正向电压时,该段笔画即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。由于共阴极连接需加驱动,故在这里我采用的是共阳阳极连接。以共阳极LED为例,各LED公共阳极K0接高电平,若向各控制端a,b, ┄,g,dp顺次送入00011110信号,则该显示器显示“⒎”字型。
共阴极7段LED显示数字0 ~ F、文字、符号及小数点的编码。
共阴极7 段LED显示字型编码表
显示字符 共阴极段选码 显示字符 共阴极段选码 0 3FH 5 6DH 1 06H 6 7DH 2 5BH 7 07H 3 4FH 8 7FH 4 66H 9 6FH “灭”(黑) 00H
2.2.2.2 LED显示器接口及显示方式
LED显示器有静态显示方式和动态显示方式两种。静态显示就是当显示器显示某个字符时,相应的段恒定的导通或截止,直到显示另一个字符为止。LED显示器工作于静态显示方式时,各位的共阴极接地;若为共阳极则接+5V电源。每位的段选线分别与一个8位锁存器的输出口相连,显示器中的各位相互独立,而且各位的显示字符一经确定,相应锁存的输出将维持不变。
正因为如此,静态显示器的亮度较高。这种显示方式编程容易,管理也较简单,但占用I/O口线资源较多。因此,在显示位数较多的情况下,一般都采用动态显示方式。
由于所有6位段皆由一个I/O口控制,因此,在每一瞬间,6位LED会显示相 同的字符。要想每位显示不同的字符,就必须采用扫描方法流点亮各位LED,即在每一瞬间只使某一位显示字符。在此瞬间,段选控制I/O口输出相应字符段选码(字型码),而位选则控制I/O口在该显示位送入选通电平(因为LED为共阴,故应送低电平),以保证该位显示相应字符。如此轮流,使每位分时显示该位应显示字符。
在多位LED显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8位I/O口控制。而共阴(共阳)极公共端分别由相应的I/O口线控制,实现各位的分时选通。
段选码,位选码每送入一次后延时1MS,因人的视觉暂留时间为0.1S(100MS),所以每位显示的时间不能超过20MS,并保持延时一段时间,以造成视觉暂留效果,给人看上去每个数码管总在亮。这种方式称为软件扫描方式。
2.2.3 键盘工作模块
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。 按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵,其它
工作均由软件完成。由于其经济实用,较多地应用于单片机系统中。在本套设计中由于只需要几个功能键,此时,可采用独立式按键结构
2.2.3.1 独立式按键结构
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如下图所示。
独立式按键的典型
独立式按键电路配置灵活,软件结构简单,但每个按键必
须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,采用。
2.2.3.2 独立式按键的软件结构
独立式按键的软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。 2.2.4电压检测电路
电路核心元件是MC34064,它具有电压检测功能。工作方式是低电平有效, 因此将其1脚与单片机的P1.7相接,2脚接VCC,3脚接地。当外部电源+5V供电时,P1.7为高电平送入累加器C,此时C=1调入显示,时钟进入正常的计时显示状态。当+5V没接入而采用备用电源工作时,P1.7为低电平送入累加器C,此时C=0单片机进入空闲方式,关断显示但内部计时仍在进行。这样就能很好
地判断是外部+5V电源供电还是备用电池供电,根据CPU的工作状态进而实现时钟断电仍能计时,当重新接入+5V电源时实现计时显示同步运行的功能。
2.2.5备用电池功耗问题
在设计方案中采用+3.6V可充电电池作为备用电源,但若把电池直接并联在外部+5V电源引脚两端时,存在着电池功耗问题如:1.接入+5V时会对电池B1进行电流很大的强充电过程,这会直接影响电池的使用寿命。2.停止外部+5V供电时,此时外部电源等效于一个电压源,充电电池B1既要对CPU供电又要对电压源供电,这样会使电池电量消耗过大,使得电池供电效率大大降低。 为解决上述问题,我们引入两个1N5819:1.若+5V接入时,一方面为显示部分和复位电路提供+5V 工作电压,另一方面通过V8、 R15对电池B1进行涓流充电,同时通过V7向CPU提供工作电压。从而很好地解决电池充电时,电流过大影响电池使用寿命的问题。2.当外部+5V电源断开时,由电池B1经V7向CPU提供工作电压,同时由于V8截止故不会造成电池B1对外部的放电,从而提高了电池的供电效率,能够长时间地为CPU提供工作电压。
2.2.6 直流稳压电源部分
直流稳压电源是给电子设备提供稳定直流电压的电子电路。这次电路需要的是+5V直流电源。 2.2.6.1 主要技术指标
(1) 输入交流电压220V(50~60Hz)。 (2) 输出直流电压5V,输出电流1A。
(3) 输入交流在220V上下波动10%时,输出电压相对变化量小于2%。 (4) 输入电阻R0<0.1Ω。
(5) 输出最大波纹电压小于10Mv。
2.2.6.2 滤波电路
它的任务是将全滤波形的输出通过RC滤波网络以后变成更平坦的直流电压,减小脉动,提高整流的效果。这是整流管中通过的电流的瞬间值要比平均值大得
多,特别在接通电源瞬间有相当大的冲击电流(即充电电流)通过整流管,这一点要引起注意。 (1) 电源变压器
它的任务是把电源电压220V变压到合适的大小。如果U2的值太大,会造成集成端稳压器7805的功豪大,温升高,且浪费电能。反之,如果U2的值小到一定程度,三端稳压器不能正常工作,失去稳压作用.因此U2的值应大小合适,这个值应该使三端稳压器在交流电网电压最低和输出电流最大时能正常工作。而且在正常稳压的前提下,它的压降尽可能小,以减小功耗。 (2) 整流电路
它的任务是将正弦波变换成直流电压。这里一般采用桥式整流电路来实现,既可用四个二极管来组成,也可用整流桥堆来完成,只是参数一定要选择合理。 (3) 稳压电路
要求输出恒定的直流电压,且要达到设计中所提出的要求。在此选用一片7805芯片来实现。
2.2.7相关参数计算
关于驱动电路中的限流电阻R,通常根据LED的工作电流计算而得到的。 例如:(1.) R1=(VCC-V0)/I0 其中VCC=+5V, V0的压降为+1.4v, I0的工作电流为10mA 所以R1=(5V-1.4V)/10mA=360Ω,要想得到10mA的工作电流必须使限流电阻大于360Ω,故在电路中我选用了390Ω的电阻。
(2) 对于连接位选显信号的电阻选用上,由Ic<100Ib,I0=10mA,得Ib>0.1 mA,根据R2=(VCC-Vbc)/Ib=(5v-0.7v)/0.1 mA=4.3kΩ,若要Ib>0.1 mA则必须使R2>4.3 kΩ,因此选用了比较接近的4.7 kΩ
第3章 软件设计(图) 3.1时钟主程序流程图
3.2定时中断服务程序流程图
3.3电路图
第4章 操作与调试
4.1 KEIL uVision3简介
4.1.1 8051开发工具
KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同
时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision3的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision3 IDE可为它们提供单一而灵活的开发环境。
C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。 4.1.2 uVision3集成开发环境 (1)、项目管理
工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。 一个单一的uVision3工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组”。开发工具选项可以对应目标,组或单个文件。
uVision3包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定 微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特 性。
uVision3可以为片外存储器产生必要的连接选项:确定起始地址和规模。 (2)、集成功能
uVision3的强大功能有助于用户按期完工。
1.集成源极浏览器利用符号数据库使用户可以快速浏览源文件。用详细的符号信息来优化用户变数存储器。
2.文件寻找功能:在特定文件中执行全局文件搜索。 3.工具菜单:允许在V3集成开发环境下启动用户功能。 4.可配置SVCS接口:提供对版本控制系统的入口。 5.PC-LINT接口:对应用程序代码进行深层语法分析。 6.Infineon的EasyCase接口:集成块集代码产生。
7.Infineon的DAVE功能:协助用户的CPU和外部程序。DAVE工程可被直接输入uVision3。
4.2 Proteus简介
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision3等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。 4.2.1进入Proteus ISIS
双击桌面上的ISIS 6 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 6 Professional” →“ISIS 6 Professional”,出现如图4.1所示屏幕,表明进入Proteus ISIS集成环境。
图4.1 启动时的屏幕
4.2.2 工作界面
Proteus ISIS的工作界面是一种标准的Windows界面,如图4.2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
图4.2 Proteus ISIS的工作界面
4.3 软件调试
软件调试的任务是利用ISIS开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现仿真结果故障。程序的调试应一个模块一个模块地进行,我们首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来总调。联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。调试的基本步骤如下:
(1)、修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。例如将DISP0~DISP5单元置为“012345”,应能在LCD上从左到右显示“012345”。若显示不正确,可在中断子程序相应位置设置断点调试检查。然后修改计时缓冲区内容,调用拆字程序,调试显示模块。
(2)、运行主程序调试模块,不按下任何键,检查是否能开始正确显示。若不能正确显示,则应在定时器中断服务子程序中设置断点,检查HOUR、MIN、SEC单元是否随断点运行而变化。然后屏蔽缓冲区初始化部分,用仿真器修改万年历显示缓冲区内容为2008年12月12日,运行主程序(调进位键),检验能否正确进位,以及试调时间看能否正确的进位。
(3)、调试键盘扫描模块,先用延时5ms子程序代替显示子程序延时消抖,
在求取键号后设置断点,中断后观察A累加器中的键号是否正确;然后恢复用显示子程序延时消抖,检验与显示模块能否正确连接。
(4)、调试时间设置模块。首先屏蔽COMB子程序,单独调试键盘设置模块,观察显示缓冲区DISP0~DISP5单元的内容是否随键入的键号改变,以及键号能否在LCD上显示。然后屏蔽子程序,单独调试合字模块。
(5)、运行主程序联调,检查能否用键盘修改当前万年历,时间,以及温度能否正确显示。
1. 开机时,显示12:00:00的时间开始计时; 2. P0.0/AD0控制“秒”的调整,每按一次加1秒; 3. P0.1/AD1控制“分”的调整,每按一次加1分; 4. P0.2/AD2控制“时”的调整,每按一次加1个小时;
第5章 致谢
在设计过程中,通过针对性地查找资料,了解了些电子方面的资料,既增长了自己见识,补充最新的专业知识,又提高了自己的应用能力。这次对AT89C51有了一个全面的认识,在此基础上结合以前所学的专业知识,从而把我所学的知识贯穿到一起,对电子专业有了一个更全面的认识!总之这次毕业设计让我把理论设计和工程实践相结合、巩固基础知识与培养创新意识相结合、个人作用和集体协作相结合等方面全面的培养学生的全面素质。这些在我今后的学习和工作当中都会有很大的帮助。最后,我要感谢付俊辉老师,在这次毕业设计中给了我许多的帮助。同时也感谢河南科技学院明天更美好!
第6章 参考文献
【1】《单片机原理与接口技术》,余锡存主编,西安电子科技大学出版社,2001.7. 【2】《MCS-51单片机原理与应用》,蔡美琴主编,高等教育出版社,1992.8. 【3】《单片机原理与应用技术》,张友德、谢伟毅主编,机械工业出版社,2004.3. 【4】单片机原理接口与应用》,黄遵熹主编,西北工业大学出版社,2002.5. 【5】《单片机原理与应用》,刘华东主编,电子工业出版社,2003.8.
【6】刘文涛.MCS-51单片机培训教程(C51版).北京:电子工业出版社,2005.
【7】《51系列单片机及C51程序设计》,王建校、杨建国主编,科学出版社,2002.4. 【8】《单片机原理与应用》,朱月秀、濮阳槟、骆经备主编,科学出版社,2004.3. 【9】《新编单片机原理与应用》,潘永雄主编,西安电子科技大学出版社,2003.2. 【10】《单片机原理与应用》,孙俊逸主编,清华大学出版社,2006.2. 【11】《单片机原理与应用》,李全利主编,清华大学出版社,2006.2.
【12】《单片机原理及其接口技术》第二版,胡汉才主编,清华大学出版社,2004.2. 【13】夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001. 【14】杨将新,李华军,刘东骏.单片机程序设计及应用.北京:电子工业出版社,2006. 【15】谢维成,杨加国.单片机原理与应用及C51程序设计.北京:清华大学出版社,2006.
附录一
程序
SEC EQU 32H ;秒即时时间\\伪指令 MIN EQU 31H ;分 HOUR EQU 30H ;时 DAY EQU 35H ;日 MON EQU 34H ;月 YEAR EQU 33H ;年
MIN_1 EQU 41H ;分定时器1 路、开存储单元 HOUR_1 EQU 42H ;时 DAY_1 EQU 43H ; MON_1 EQU 44H ; YEAR_1 EQU 45H ;
MIN_11 EQU 40H ;分定时器1 路、关存储单元 HOUR_11 EQU 46H ;时 DAY_11 EQU 47H ;日 MON_11 EQU 48H ;月 YEAR_11 EQU 49H ;年 ;***********************
ORG 0000H ;复位起始位置 ljmp MAIN
ORG 0003H ;中断转换显示年月日、INT0 LJMP SHOW
ORG 000BH ;计数中断T0、方式1 LJMP TIME ORG 0013H
LJMP CHANGE; 调整时间、定时、INT1(SB0 键) ;------主程序 ORG 0030H MAIN:
;--------初始化付值 MOV YEAR , #02 MOV MON , #05 MOV DAY , #01 MOV HOUR , #00 MOV MIN , #00 MOV SEC , #00
CLR 40H ;定时单元1 路清零 CLR 41H CLR 42H CLR 43H
CLR 44H CLR 45H CLR 46H CLR 47H CLR 48H CLR 49H ;-------开中断
MOV TMOD , #01H ;计数、模式1、T0 MOV TL0, #0B0H ;100SM 计数定时 MOV TH0, #3CH ; clr p3.0
MOV 20H, #0AH ;10 次*100SM SETB PT0 ;T0 为最高级 SETB TR0 ;允许计数 SETB ET0 ;允许T0 中断 SETB EX0 ;允许INT0 中断 SETB EX1 ;允许INT1 中断 SETB EA ;开总中断
;------显示、定时器启动判断 LOOP:
MOV R1, #30H; 存储单元 MOV R4, #01H; 位选通 MOV R3, #03H; 三组显示
NEXT:
MOV A , @R1 ;
MOV B , #10 ;将存储单元转换成两高低两组的BCD 码 DIV AB SWAP A ORL A, B
MOV P0, A;输出 MOV P2, R4
INC R1 ;下一单元 MOV A, R4 ; RL A ;位移 MOV R4, A
LCALL DE5SM ;延时0.5SM
DJNZ R3, NEXT ;全扫描显示一偏 ;------判断定时输出(只编写了一路)
CJNE R7, #88H,LOOP ;是8 则开,否则、定时已关、转 ;---------开 MOV A, YEAR
CJNE A, YEAR_1, LOOP_1;年比较,不等转关 MOV A, MON
CJNE A, MON_1, LOOP_1 MOV A, DAY
CJNE A , DAY_1,LOOP_1 MOV A, HOUR
CJNE A, HOUR_1,LOOP_1 MOV A, MIN
CJNE A, MIN_1, LOOP_1 CPL P3.0 ;---------关 LOOP_1:
MOV A, YEAR
CJNE A, YEAR_11, LOOP;年比较 MOV A, MON
CJNE A, MON_11, LOOP MOV A, DAY
CJNE A , DAY_11,LOOP MOV A, HOUR
CJNE A, HOUR_11,LOOP MOV A, MIN
CJNE A, MIN_11, LOOP CPL P3.0 LJMP LOOP
;-----年月日显示中断子程序
SHOW: PUSH PSW push ACC PUSH B PUSH 01H PUSH 02H PUSH 03H PUSH 04H
MOV R2, #0FFH ;中断扫描次数 TURN: MOV R1 , #33H MOV R4 , #01H MOV R3 , #03H NEXT_1:
MOV A, @R1 MOV B , #10 DIV AB SWAP A ORL A, B MOV P0, A MOV P2, R4 INC R1 RL A
MOV R4 ,A LCALL DE5SM DJNZ R3, NEXT_1
DJNZ R2, TURN ;反复显示一定时间后返回 POP 04H POP 03H POP 02H POP 01H POP B POP ACC POP PSW RETI
;-----计数中断服务子程序 TIME:
PUSH PSW PUSH ACC PUSH B PUSH 06H
MOV TH0 , #3CH;重装计数 MOV TL0 , #0BH;
DJNZ 20H, OUT ;转到中断跳出pop 程序
MOV 20H, #0AH ; 重装:100*10=1000 ;-----进位程序 INC SEC
MOV R6, SEC ;
CJNE R6, #60, OUT;比较 MOV SEC , #00 ; INC MIN
MOV R6, MIN
CJNE R6, #60, OUT MOV MIN , #00
INC HOUR
MOV R6 , HOUR
CJNE R6 , #25 , OUT MOV HOUR ,#00 INC DAY
MOV R5, MON
CJNE R5, #1, MON_22;是否1 月、不是转2 月 MOV R5, DAY
CJNE R5, #32, OUT ; 本月是否益出 INC MON MOV DAY,#1 LJMP OUT OUT: POP 06H POP B POP ACC POP PSW RETI
MON_22:
MOV R5, MON
CJNE R5 , #2 , MON_33;是否2 月、不是转3 月 MOV A, YEAR ;判断是否瑞年 MOV B, #4 DIV AB MOV A , B
JNZ OUT_1;不是则转(A 不为零则转) MOV R5 ,DAY
CJNE R5,#30, OUT;如是瑞年、判断是否到29 天 INC MON MOV DAY ,#1 LJMP OUT OUT_1:
MOV R5, DAY
CJNE R5, #29, OUT ;平年二月判断 INC MON
MOV DAY , #1 LJMP OUT MON_33:
MOV R5, MON
CJNE R5, #3 , MON_44
MOV R5, DAY
CJNE R5 , #32, OUT INC MON
MOV DAY , #1 LJMP OUT MON_44:
MOV R5, MON
CJNE R5,#4, MON_55 MOV R5, DAY
CJNE R5 ,#31,OUT INC MON
MOV DAY , #1 LJMP OUT MON_55:
MOV R5,MON
CJNE R5,#5, MON_66 MOV R5,DAY
CJNE R5,#32,OUT INC MON MOV DAY,#1 LJMP OUT MON_66:
MOV R5, MON
CJNE R5,#6, MON_77 MOV R5, DAY
CJNE R5 ,#31,OUT INC MON
MOV DAY , #1 LJMP OUT MON_77:
MOV R5, MON
CJNE R5,#7, MON_88 MOV R5, DAY CJNE R5,#32,L1 INC MON
MOV DAY , #1
L1: LJMP OUT MON_88:
MOV R5, MON
CJNE R5,#8, MON_99 MOV R5, DAY CJNE R5 ,#32,L2
INC MON
MOV DAY , #1 L2: LJMP OUT MON_99:
MOV R5, MON
CJNE R5,#9, MON_00 MOV R5,DAY CJNE R5 ,#31,L3 INC MON
MOV DAY , #1 L3: LJMP OUT MON_00:
MOV R5, MON
CJNE R5,#10, MON_AA MOV R5, DAY CJNE R5 ,#32,L4 INC MON
MOV DAY , #1 L4: LJMP OUT MON_AA:
MOV R5, MON
CJNE R5,#11, MON_BB MOV R5,DAY CJNE R5,#31,L5 INC MON
MOV DAY , #1 L5: LJMP OUT MON_BB: MOV R5, DAY CJNE R5 ,#32,L6 INC YEAR MOV MON, #1 MOV DAY , #1 L6:LJMP OUT
;-----校对时间、定时调整中断 CHANGE : PUSH PSW PUSH ACC
PUSH B PUSH 00H mov p2,#00h
SHOW_1:
MOV A , #01H;显示1 MOV P0, A
MOV P2, #0FFH;三组数码管都显示1 路 LCALL READ ;调用读p1 口键程序 CJNE A, 01H, SHOW_1;去抖后比较 LCALL DE250SM ; 延时250 秒 CJNE A, #0FBH,ttT1 LJMP SB3_1
ttT1: CJNE A, #0FEH,SHOW_1 AJMP SHOW_2 ;-------二组显示 SHOW_2:
MOV A, #02H; 显示2 MOV P0, A
MOV P2, #0FFH; LCALL READ
CJNE A, 01H, SHOW_2 ;去抖后比较 LCALL DE250SM; 延时250 秒
CJNE A, #0FBH,T2;不等转去判断此时SB3 按了没 LJMP SB3_2
T2: CJNE A, #0FEH, SHOW_2 AJMP SHOW_3 ;_------三组显示 SHOW_3:
MOV A, #03H; 显示3 MOV P0, A
MOV P2, #0FFH;位码 LCALL READ
CJNE A, 01H,SHOW_3;去抖后比较 LCALL DE250SM;延时250 秒
CJNE A, #0FBH, T3;不等转去判断此时SB3 按了没 LJMP SB3_3
T3: CJNE A, #0FEH, SHOW_3
AJMP SHOW_4;------即时年单元调时、显示 SHOW_4:
MOV A , YEAR ;调出年单元 MOV B, #10 ;BCD 转换 DIV AB
SWAP A ORL A, B MOV P0, A ; MOV P2, #01H; LCALL READ LCALL DE250SM
CJNE A, 01H, SHOW_4 ;去抖
CJNE A, #0FEH, KEY2_1 ;按SB2 转年调整 AJMP MON_CH ;按SB1 往下调月单元 KEY2_1:CJNE A, #0FDH, SHOW_4 LCALL YEAR_AD ; 调用年调整 AJMP SHOW_4 ;
MON_CH: MOV A , MON ; 月单元调整 MOV B, #10 DIV AB SWAP A ORL A, B MOV P0, A ; MOV P2, #02H; LCALL READ LCALL DE250SM
CJNE A, 01H, MON_CH ;去抖
CJNE A, #0FEH, KEY2_2 ;按SB2 转月调整 LJMP DAY_CH ;按SB1 往下调日单元 KEY2_2:CJNE A, #0FDH, MON_CH LCALL MON_AD ; 调用月调整 LJMP MON_CH ; DAY_CH:
MOV A , DAY ; 日单元调整 MOV B, #10 DIV AB SWAP A ORL A, B MOV P0, A ; MOV P2, #04H; LCALL READ LCALL DE250SM
CJNE A, 01H, DAY_CH ;去抖
CJNE A, #0FEH, KEY2_3 ;按SB2 转日调整 LJMP HOUR_CH ;按SB1 往下调时单元 KEY2_3:CJNE A, #0FDH, DAY_CH LCALL DAY_AD ; 调用日调整
LJMP DAY_CH
HOUR_CH:
MOV A , HOUR ; 时单元调整 MOV B, #10 DIV AB SWAP A ORL A, B MOV P0, A ; MOV P2, #01H; LCALL READ LCALL DE250SM
CJNE A, 01H, HOUR_CH ;去抖
CJNE A, #0FEH, KEY2_4 ;按SB2 转时调整 AJMP MIN_CH ;按SB1 往下调分单元 KEY2_4:CJNE A, #0FDH, HOUR_CH LCALL HOUR_AD ; 调用时调整 AJMP HOUR_CH ; MIN_CH:
MOV A , MIN ; 分单元调整 MOV B, #10 DIV AB SWAP A ORL A, B MOV P0, A ; MOV P2, #02H; LCALL READ LCALL DE250SM
CJNE A, 01H, MIN_CH ;去抖
CJNE A, #0FEH, KEY2_5 ;按SB2 转分调整 AJMP SEC_CH ;按SB1 往下调秒单元 KEY2_5:CJNE A, #0FDH,MIN_CH LCALL MIN_AD ; 调用分调整 LJMP MIN_CH ; SEC_CH:
MOV A , SEC ; 秒单元调整 MOV B, #10 DIV AB SWAP A ORL A, B MOV P0, A ; MOV P2, #04H;
LCALL READ LCALL DE250SM
CJNE A, 01H, SEC_CH ;去抖
CJNE A, #0FEH, KEY2_6 ;按SB2 秒调整 LJMP OUT_A ;按SB1 跳出
KEY2_6: CJNE A, #0FDH, SEC_CH CLR SEC ; 归零 LJMP SEC_CH ;
;-------按SB2\\定时器年单元加1 子程序 SB3_2: LJMP SHOW_2 ;二路没编返回 SB3_3: LJMP SHOW_3 ;三路没编返回 SB3_1:
MOV A , YEAR_1 ; 调时年单元 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #01H LCALL READ LCALL DE250SM CJNE A, 01H, SB3_1
CJNE A, #0FBH, KEY2_7 ;按SB2 转年调整 LJMP MON_111 ;按SB1 往下调月单元 KEY2_7:CJNE A, #0FDH, SB3_1 INC YEAR_1 ; 1 路年单元加1 MOV R5,YEAR_1
CJNE R5,#09,SB3_1 ;益出 MOV YEAR_1, #00H AJMP SB3_1 ;
;-------月单元加1 子程序 MON_111:
MOV A , MON_1 ; 调时月单元显示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #02H LCALL READ LCALL DE250SM
CJNE A, 01H, MON_111
CJNE A, #0FBH, KEY2_8 ;按SB2 转月调整 LJMP DAY_111 KEY2_8:
CJNE A,#0FDH,MON_111
INC MON_1 ;1 路月单元加1 MOV R5,MON_1
CJNE R5,#13,MON_111;益出 MOV MON_1, #01H
AJMP MON_111 ; 转到月显 ;_------日单元加1 子程序 DAY_111:
MOV A , DAY_1 ; 调时日单元显示提示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #04H LCALL READ LCALL DE250SM
CJNE A, 01H,DAY_111
CJNE A, #0FBH, KEY2_9 ;按SB2 转日调整 LJMP HOUR_111
KEY2_9: CJNE A,#0FDH,DAY_111 INC DAY_1 ;1 组日单元加1 MOV R5, DAY_1
CJNE R5,#32,DAY_111;益出 MOV DAY_1, #01H
AJMP DAY_111 ; 转到日显 ;-------按SB2 时单元加1 子程序 HOUR_111:
MOV A , HOUR_1 ; 调时时单元显示提示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #01H LCALL READ LCALL DE250SM
CJNE A, 01H,HOUR_111
CJNE A, #0FBH, KEY2_10 ; 按 SB2 转时调整 LJMP MIN_111
KEY2_10:CJNE A,#0FDH,HOUR_111 INC HOUR_1
MOV R5,HOUR_1
CJNE R5,#24,HOUR_111;益出
MOV HOUR_1, #00H
AJMP HOUR_111 ; 转到时显 ;-------分单元加1 子程序 MIN_111:
MOV A , MIN_1 ; 调时分单元、并显示提示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #02H LCALL READ LCALL DE250SM
CJNE A, 01H,MIN_111
CJNE A, #0FBH, KEY2_11 ;按SB2 转分调整 AJMP OFF_CH ;按SB3 往下调定时:关单元 KEY2_11: CJNE A, #0FDH, MIN_111 INC MIN_1 ;1 路分单元加1 MOV R5, MIN_1
CJNE R5,#60,MIN_111;益处 MOV MIN_1, #00H
AJMP MIN_111 ; 转到分显 年单元调整
OFF_CH: MOV A , YEAR_11 ; 调时年单元 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #01H LCALL READ LCALL DE250SM
CJNE A, 01H, OFF_CH
CJNE A, #0FBH, KEY2_F7 ;按SB2 转年调整 LJMP MON_OFF ;按SB1 往下调月单元 KEY2_F7:CJNE A, #0FDH, OFF_CH INC YEAR_11 ; 1 路年单元加1
MOV R5,YEAR_11
CJNE R5,#09,OFF_CH ;益出 MOV YEAR_11, #00H AJMP OFF_CH ;
;-------月单元加1 子程序 MON_OFF:
MOV A , MON_11 ; 调时月单元显示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #02H LCALL READ LCALL DE250SM
CJNE A, 01H, MON_OFF
CJNE A, #0FBH, KEY2_F8 ;按SB2 转月调整 LJMP DAY_OFF KEY2_F8:
CJNE A,#0FDH,MON_OFF INC MON_11 ;1 路月单元加1 MOV R5,MON_11
CJNE R5,#13,MON_OFF;益出 MOV MON_11, #01H
AJMP MON_OFF ; 转到月显 ;_------日单元加1 子程序 DAY_OFF:
MOV A , DAY_11 ; 调时日单元显示提示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #04H LCALL READ LCALL DE250SM
CJNE A, 01H,DAY_OFF
CJNE A, #0FBH, KEY2_F9 ;按SB2 转日调整 LJMP HOUR_OFF
KEY2_F9: CJNE A,#0FDH,DAY_OFF INC DAY_11 ;1 组日单元加1 MOV R5, DAY_11
CJNE R5,#32,DAY_OFF;益出 MOV DAY_11, #01H
AJMP DAY_OFF ; 转到日显 ;-------按SB2 时单元加1 子程序 HOUR_OFF:
MOV A , HOUR_11 ; 调时时单元显示提示 MOV B ,#10
DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #01H LCALL READ LCALL DE250SM
CJNE A, 01H,HOUR_OFF
CJNE A, #0FBH, KEY2_F10 ; 按 SB2 转时调整 LJMP MIN_OFF
KEY2_F10:CJNE A,#0FDH,HOUR_OFF INC HOUR_11
MOV R5,HOUR_11
CJNE R5,#24,HOUR_OFF;益出 MOV HOUR_11, #00H
AJMP HOUR_OFF ; 转到时显 ;-------分单元加1 子程序 MIN_OFF:
MOV A , MIN_11 ; 调时分单元、并显示提示 MOV B ,#10 DIV AB SWAP A ORL A,B MOV P0, A MOV P2, #02H LCALL READ LCALL DE250SM
CJNE A, 01H,MIN_OFF
CJNE A, #0FBH, KEY2_F11 ;按SB2 转分调整 LJMP ON_1 ;按SB3 往下调定时:开与关 KEY2_F11: CJNE A, #0FDH, MIN_OFF INC MIN_11 ;1 路分单元加1 MOV R5, MIN_11
CJNE R5,#60,MIN_OFF;益处 MOV MIN_11, #00H
LJMP MIN_OFF ; 转到分显 ;-------开、关定时
ON_1:CJNE A, #0FBH, MIN_OFF K1: MOV A, #88H MOV R7, A MOV P0, A
MOV P2, #0FFH;三组都显示开 LCALL READ
LCALL DE250SM
CJNE A, 01H, ON_1;去抖后比较
CJNE A, #0FBH,KEY2_12 ;按SB2 转关 LJMP OUT_A ;按SB3 调出、处于开状态 KEY2_12: CJNE A, #0FDH, K1 k2: MOV A, #00H; 显示0 关 MOV R7, A MOV P0, A
MOV P2, #0FFH; LCALL READ LCALL DE250SM
CJNE A, 01H, K2;去抖后比较
CJNE A, #0FBH,KEY2_13 ;按SB2 转开 LJMP OUT_A ;SB3 调出、处关状态 KEY2_13:
CJNE A, #0FDH, K2 ; 比较按了没 LJMP K1 ; 按了SB2、转开 OUT_A: POP 00H POP B POP ACC POP PSW RETI
;_------读取按键程序
READ:MOV A , P1;读取按键 MOV R1, A
LCALL DE10MS MOV A, P1 RET
;_----延时程序 DE5SM: PUSH 01H
MOV R1, #0FFH DJNZ R1,$
POP 01H RET
DE10MS: PUSH 04H PUSH 05H MOV R4, #0AH
Dl1: MOV R5, #0FFH dl2: DJNZ R5,$ DJNZ R4,dl1 POP 05H
POP 04H RET
DE250SM:PUSH 02H PUSH 00H
MOV R0, #0FFH
DEL:MOV R2, #0FFH DJNZ R2,$ DJNZ R0, DEL POP 00H POP 02H RET
;_---调整时间进位程序 MIN_AD: INC MIN
MOV R6, MIN
CJNE R6, #60, OU1 MOV MIN , #00 OU1: RET HOUR_AD: INC HOUR
MOV R6 , HOUR CJNE R6 , #25 , OU2 MOV HOUR ,#00 OU2: RET DAY_AD: INC DAY
MOV R6, DAY
CJNE R6 , #32, OU3 ; 是否益出 MOV DAY ,#01H OU3: RET
MON_AD: INC MON
MOV R6, MON
CJNE R6, #13, OU4 ; 是否益出 MOV MON ,#01H OU4: RET YEAR_AD: INC YEAR
MOV R6, YEAR
CJNE R6, #09, OU5;是否益出 MOV YEAR ,#00H OU5: RET END
因篇幅问题不能全部显示,请点此查看更多更全内容