资源描述
单片机课程设计报告单片机课程设计报告 LCD 电子定时闹钟设计电子定时闹钟设计姓 名: 学 号: 专业班级: 指导老师: 所在学院: 2 摘要摘要本本设计是采用单片机技术的电子定时闹钟,近年来集成电路技术的出现和应用,是推动了人类文明的突飞猛进。基于集成电路技术的单片机产品更是方便了人们的生活和工作 ,目前以单片机技术的应用为核心的产品种类非常丰富。应用我们所学过的知识和查阅相关资料,我制作了这个单片机技术为基础的LCD 可校时可定时电子闹钟,这是一个简单的实用的单片机电子设计产品。本“LCD 定时电子闹钟设计采用 AT89C51 为主控芯片。在充分理解了设计的要求后,准确的定位了设计的目的,然后构思了总体的方案。在选择和合适的硬件完成了电路的设计后,又进行了软件的设计和调试。本系统的硬件组成以及工作原理都有详细的图文说明,所应用的软件技术和各个模块设计的功能及工作过程也有详细的介绍,最后的部分则详细描述了了软件仿真及调试过程。本电子钟设计是以单片机技术为核心,采用了中小规模集成度的单片机制作的功能较为完善的电子闹钟。硬件设计应用了成熟的数字钟电路的基本设计方法以,并详细介绍了系统的工作原理。硬件电路中使用了除 AT89C51 外,另外还有 LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件。在硬件电路的基础上,软件设计按照系统设计功能的要求,运用所学的汇编语言,实现的功能包括时时-分分-秒秒显示、设定和修改定时时间的小时和分钟、校正时钟时间的小时、分钟和秒、定时时间到能发出一分钟的报警声。最后应用伟福及Proteus等软件将硬件电路和软件系统链接在一起对各个部分及整体进行仿真并调试构成了整个完整的电子闹钟的设计。最后通过反复的实际仿真和测试表明,该系统能够实现所有要求的功能包括:(1)能显示时时-分分-秒秒。(2)能够设定定时时间、修改定时时间及时钟。(3)定时时间到蜂鸣器能发出铃声,另外还在此基础上实现了其他的附加功能比如万年历。当然这个系统仍然是属于比较简单的单片机应用系统,要设计功能更强的更复杂的系统还需要我进一步的学习。3目目 录录1 概述概述.31.1 单片机技术和数字钟简介单片机技术和数字钟简介 .31.2 设计本电子闹钟的目的设计本电子闹钟的目的 .31.3 本本 LCD 电子钟的功能及特点介绍电子钟的功能及特点介绍.31.3.1 设计特点.31.3.2 本 LCD 电子闹钟的主要功能.32 系统总体方案及硬件设计系统总体方案及硬件设计.42.1 总体方案设计总体方案设计 .42.2 硬件电路的设计硬件电路的设计 .42.2.1 电路总体概念图设计.52.2.2 主控制芯片 AT89C51.72.2.3 LCD 显示电路.72.2.4 喇叭部分的电路.103 软件设计软件设计.103.1 软件设计概述软件设计概述 .103.2 主函数的设计主函数的设计 .113.3 部分设计思想的说明部分设计思想的说明.123.3.1 程序初始化.123.3.2 闹钟的实现.133.3.3 显示程序.134 PROTEUS 软件仿真软件仿真 .145 课程设计体会课程设计体会.16附录附录.17附附 1 源程序代码源程序代码.17附附 2 系统原理图系统原理图.2841 概述概述1.1 单片机技术和数字钟简介单片机技术和数字钟简介单片机是单片微型计算机的简称,它是一种特殊的计算机。它特别适合于控制领域,故又称为微控制器 MCU(micro control unit). 采用了嵌入系统,通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:中央处理器 CPU,存储器和 I/O 接口电路等。单片机集成度高、功能强、通用性好,而且体积小、重量轻、能耗、低价格便宜,只要和适当的软件及硬件设备相结合,便可成为一个独立的单片机控制的功能系统,单片机也成为目前测量控制应用系统的优选机种和新电子产品的关键部件。 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着 CMOS 化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,和传统控制技术相比有革命性的进步。时钟是将小时、分种、秒种显示于人的肉眼的计时装置。而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。而 LCD 电子定时闹钟是以单片机为基础的数字电路实现对小时、分钟、秒的数字显示的数字计时装置,它的计时周期为 24 小时,另外应有校时功能和一些显示日期、闹钟等附加功能。一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。目前电子种广泛用于各种私人和公众场合,成为我们生活工作学习中不可缺少的好帮手。由于时钟的实用性和在人们生活中的重要性,所以尝试设计以单片机为核心的数字时钟是很有意义的。钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能,本设计中 LCD 电子时钟采用 LCD 显示时间和日期年月,直观实用,而且可以方便的校调,附带的万年历和定时功能也是很方便和实用的.1.21.2 设计本电子定时闹钟的目的设计本电子定时闹钟的目的 复习和巩固所学过的知识,利用此课程设计正好可以对所学习过的知识进行系统的回顾和总结拓展知识面,课堂的知识是远远满足不了设计的要求的,这就需要我们去主动找寻更多的资料,了解更多的知识.培养了设计能力和解决实际实际问题的能力,同时增强了 5自学能力,通过设计完整的单片机系统也初步掌握了组成系统、编程、调试等能力。通过本LCD电子种的设计初步了解了单片机应用系统开发研制过程,软件和硬件设计的方法.1.3 本本 LCD 电子闹钟电子闹钟的功能和特点介绍的功能和特点介绍1.3.11.3.1 设计特点本 LCD 电子定时闹钟是一种种基于单片机技术的多功能、多用途的电子产品,有电子时钟、日期显示、定时闹铃等多种功能。本设计产品性能卓越,功能丰富,采用 LCD 显示更加直观,是一个比较实用的电子产品.1.3.21.3.2 本电子钟的主要功能(1)可以显示 24 小时制“时时-分分-秒秒”,LCD 显示。(2)可以显示日期 具有万年历功能(3)可以方便的设定定时时间、修改定时时间,闹铃功能,预设定时时间到将发出闹铃声.(4)能够修改时钟时间的时、分、秒,能够修改日期的年月日.2 系统总体方案及硬件设计系统总体方案及硬件设计2.1 总体方案设计总体方案设计本 LCD 电子定时数字闹钟,是以单片机及外围接口电路作为核心硬件,辅以外围硬件电路,用汇编语言设计的程序来设计并实现的。根据 C51 单片机的外围接口特点扩展成相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件来执行一定的程序实现数字钟的功能。之所以用单片机来制作电子钟,是因为这样在设计制作简单而且功能多、精确度高,也可方便的扩充其他功能,淡然实现也十分简单。本设计是利用 AT89C51 单片机为主控芯片,由七段数码管、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟。2.2 硬件设计硬件设计2.2. 1 电路总体概念图设计电路总体概念图设计总体的硬件系统结构框图如下图所示,由于 LED 的显示效果比较差因此选6用了更先进的 LCD:AT89C51震荡震荡电路电路调时电路调时电路喇叭喇叭LCD震荡电路震荡电路片选片选代码代码图 1:硬件电路概念示意图 图 2:硬件电路概念图2.2.22.2.2 主控芯片主控芯片 AT98C51AT98C51单片机是 20 世纪 70 年代中期发展起来的一种大规模集成电路器件。它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。20世纪 80 年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。在我们日常学习和生活中,常见的有 51 系列、52 系列、PIC 系列等。其中 51 系列的单片机的模块化结构比较典型、应用灵活,为许多大公司和个人所采纳。在本 LCD 电子闹钟设计中就是采用利用我们熟悉的 AT89C51 单片机为主按键与按钮电路复位等辅助电路LCD闹铃电路电源系统7控芯片。AT89C51 单片机由微处理器,存储器,I/O 口以及特殊功能寄存器 SFR等部分构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为 4KB,片内数据存储器为 128 个字节。89C51 单片机有 4 个 8 位的并行 I/O 口:P0 口,P1 口,P2 口和 P3 口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。P1 口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3 口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如 P3.0 是串行输入口线,P3.1 口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,P0 可作为分时复用的低 8位地址/数据总线,P2 口可作为高 8 位的地址总线。P3 口也可作为 AT89C51 的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号.各口管脚的备选功能如下所示: P3.0 RXD(串行输入口) ; P3.1 TXD(串行输出口) ; P3.2 /INT0(外部中断 0) ; P3.3 /INT1(外部中断 1) ; P3.4 T0(记时器 0 外部输入) ; P3.5 T1(记时器 1 外部输入) ;P3.6 /WR(外部数据存储器写选通) ; P3.7 /RD(外部数据存储器读选通) 。RST:复位输入。当振荡器复位器件时,要保持 RST 脚两个机器周期的高电平时间。 /EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储器(0000H-FFFFH)不管是否有内部程序存储器。注意加密方式 1 时,/EA 将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。在 FLASH 编程期间,此引脚也用于施加 12V 编程电源(VPP) 。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入;XTAL2:来自反向振荡器的输出。AT89C51 单片机由微处理器,存储器,I/O 口以及特殊功能寄存器 SFR 等部分构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为 4KB,片内数据存储器为 128 个字节。89C51 单片机有84 个 8 位的并行 I/O 口:P0 口,P1 口,P2 口和 P3 口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。P1 口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3 口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如 P3.0 是串行输入口线,P3.1 口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,P0 可作为分时复用的低 8 位地址/数据总线,P2 口可作为高 8 位的地址总线。P3 口也可作为 AT89C51 的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号。AT89C51 单片机的封装及管脚分布如图一:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51图 3、AT89C51 单片机封装及管脚分布图2.2.2 时钟电路部分时钟电路部分AT89C51 系列的单片机的时钟方式分为内部方式和外部方式。内部方式就是在单片机的 XTAL1 和 XTAL2 的两引脚外接晶振,就够成了自激振荡器在单片机内部产生时钟脉冲信号。外部时钟方式是把外部已经有的时钟信号引入到单9片机内部。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。本 LCD 电子闹钟设计是采用内部时钟方式,用一个 12MHz 晶振和两个 30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用.其电路图如下:X1CRYSTALC1220pC2220p图 4: 时钟电路之所以采用高性能的振荡电路,因为:1. 单片机电子钟的计时脉冲基准是由外部晶振的频率经过 12 分频后提供,采用内部的定时/计数器来实现计时功能。所以,外接晶振频率精确度直接影响电子钟计时的准确性。 2. 单片机电 子钟利用内部定时/计数器溢出产生中断(12M 晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响 应中断需要 3-8 个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的 机器周期。 2.2.3 LCD 显示电路部分显示电路部分为了获得更好的效果本设计并没有采用常见的 LED,而是采用了型号为LM016L 的 LCD。LCD 有 LED 数码显示更好的更的直观效果,也更加经久耐用。10液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。本 LCD 是 2 行 16 列液晶 可显示 2 行 16 列英文字符,有 8 位数据总线 D0-D7,RS,R/W,EN 三个控制端口(共 14 线) ,工作电压为 5V。没背光,和常用的 1602B 功能和引脚一样(除了调背光的二个线脚). 该模块也可以只用 D4-D7 作为四位数据分两次传送。这样的话可以节省 MCU 的 I/O 口资源。D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LM016L图 5: LM016L LCD引脚说明:VDD:电源正极,4.55.5V,通常使用 5V 电压;VL:LCD 对比度调节端,电压调节范围为 05V。接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个 10K 的电位器来调整对比度,或者直接串接一个电阻到地;RS:MCU 写入数据或者指令选择端。MCU 要写入指令时,使 RS 为低电平;MCU 要写入数据时,使 RS 为高电平;R/W:读写控制端。R/W 为高电平时,读取数据;R/W 为低电平时,写入数据;11E:LCD 模块使能信号控制端。写数据时,需要下降沿触发模块。D0D7:8 位数据总线,三态双向。如果 MCU 的 I/O 口资源紧张的话,该模块也可以只使用 4 位数据线 D4D7 接口传送数据。本充电器就是采用 4 位数据传送方式;BLA: LED 背光正极。需要背光时,BLA 串接一个限流电阻接 VDD,BLK 接地,实测该模块的背光电流为 50mA 左右;BLK: LED 背光地端。2.2.4 喇叭部分的电路喇叭部分的电路 扬声器的电路部分比较简单,如图,通过单片机发出的控制信号经过简单的放大和处理后直接控制 LS1 喇叭。R91kQ12N5088R10100LS1SPEAKERR111kK1图 6: SPEAKER 部分电路图其中 2N5088 的参数为:类型:NPN集电极发射集最小雪崩电压 Vceo(V):30集电极最大电流 Ic(max)(mA):0.050直流电流增益 hFE 最小值(dB):350直流电流增益 hFE 最大值(dB):最小电流增益带宽乘积 Ft(MHz):50封装/温度():TO92/-55150 采用 2N5088 将获得更好更纯净的声音信号 LS1 是经典常见的喇叭.。3 软件设计软件设计3.1 软件设计概述软件设计概述这里用汇编的单片机程序构成了本 LCD 电子闹钟的软件系统。该程序实现时间及定时(时间以 0 点 0 分 0 秒为基准计算,闹铃定时以 0 时 0 分为基准计算)的显示,有外中断 0 和五个开关实现校时,闹钟功能。其中程序的晶振频率为12MHz,最小计时单位为 1/20 秒。12主芯片 p0.1-p0.7 输出数据到 LCD 数据总线,p2.0-2.2 输出 LCD 控制信号,P3.7 输出声音信号,.P1.4-P1.5 输入外部控制信号,整个软件系统也是根据这个关系连接成一个完整的系统。最后经过反复的修改和实验最终确定了主程序见附录 1,并附有十分详细的注释.因为注释已经详细的介绍了软件设计的细节过程下面仅就软件系统特定的部分进行详细的说明,其他细节不再一一详述,3.2 主函数的设计主函数的设计本 LCD 电子闹钟的的主程序流程图如图 7 所示,。 NO Yes Yes图 7: 主函数流程图 1程序初始程序初始化化P1-4=1?显示闹钟定时显示日期时间判断是否到闹钟定时时间LS1 喇叭响13图 8: 主函数流程图 23.3 部分设计思想的说明部分设计思想的说明3.3.13.3.1 程序初始化程序初始化在系统开始上电时,需要对 C51 主芯片和周边电路进行初始化.首先初始化主芯片:ORG 0000HLJMP STARTORG 000BHLJMP TIMER0ORG 001BHLJMP TIMER1ORG 0100HSTART: MOV SP,#60HMOV R0,#18HMOV A,#00HMEM_INI: MOV R0,AINC R0CJNE R0,#5FH,MEM_INI然后就是对 LCD 进行初始化,具体程序见附录 1系统初始化定时器初始化定时器初始化串口初始化显示待机指示符设定闹铃时间判设置闹铃时间否?显示刷新启动走时有关变量初始化刷新显示判断日期是否变化化否?秒指示判断时间是否变化闹铃判是否到闹铃时间?延时YYYY143.3.23.3.2 闹钟的实现闹钟的实现闹钟功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。程序设计思想如图。图 9:闹铃实现思想流程图3.3.33.3.3 显示程序显示程序显示程序包括时钟显示和定时显示程序。具体程序见附 1液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表 3 是 TC1602EL 液晶模块的内部显示地址。12345678910111213141516000102030405060708090A0B0C0D0E0F404142434445464748494A4B4C4D4E4F比如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平1 所以实际写入的数据应该是 01000000B(40H)10000000B(80H)11000000B(C0H),液晶模块内带标准字库,内部的字符发生存储器(CGROM)已经存储了 192 个 57点阵字符,32 个 510 点阵字符。另外还有字符生成 RAM (CGRAM)512 字节,供用户自定义字符。如表 1 所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固 定的代码,比如大写的英文字母“A”的代码是01000001B(41H) ,显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母“A”。时十位、个位,分十位、个位改变了设置闹铃标志是否设置了闹铃清除闹铃标志判当前时间是设定时间中断返回中断返回闹铃判别处理15指令RSR/WD7D6D5D4D3D2D10清显示0000000001光标返回000000001*置输入模式00000001I/DS显示开/关控制0000000DCB光标/字符移位置000000S/CR/L*置功能00001DLNF*置字符发生存储器地址0001字符发生存储器地址(ACG)置数据存储器地址001显示数据存储器地址(ADD)读忙标志或地址010计数器地址(AC)写数到 CGRAM/DDRAM1要写入的数据从 CGRAM/DDRAM 读数11读出的数据 液晶模块内部的控制器共有 11 条控制指令:指令 1:清显示,指令码 01H,光标复位到地址 00H 位置 指令 2:光标复位,光标返回到地址 00H 指令 3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令 4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令 5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标指令 6:功能设置命令 DL:高电平时为 4 位总线,低电平时为 8 位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示 5x7 的点阵字符,高电平时显示 5x10的点阵字符指令 7:字符发生器 RAM 地址设置指令 8:DDRAM 地址设置指令 9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令 10:写数据指令 11:读数据时钟显示和定时显示程序都是应用动态显示,即将字形代码送入字形锁存器;再将所要显示的位置代码送入字位锁存器锁存。为防止闪烁,每位显示时间都调用延时程序进行短暂延时,然后显示另一位。4 Proteus 软件仿真软件仿真将完整的单片机程序保存为后缀名为.asm 文件。打开伟福 E6000 软件,,点击伟福 E6000 主菜单当中的仿真器 ,在下拉菜单中点击仿真器设置 。16在弹出对话框中,语言对话框中选Keil C(V5 或更高), 英特尔 PL/M51,英特尔汇编器,仿真器对话框中G6W-POD-51-8031,晶振频率栏填12000000(Hz ),然后点击好完成仿真器设置。然后点击伟福 E6000 主菜单,新建项目,导入上述 ASM 文件,选择无包含文件,保存此项目文件,再双击ASM 文件打开 ,然后选择项目编译或按 F9,对.asm 文件进行编译,编译顺利完成,生成.HEX 文件。然后用 PROTEUS7.1 软件打开设计好的硬件系统原理图 DZZ.dsn,双击原理图上的 AT89C51 单片机加载 DZZ.HEX 文件。然后点击 PROTEUS7.1 软件窗口下方的相应仿真运行按纽进行仿真.经过反复的防真和调试,此闹钟可以实现所有的功能,既可以显示日期时间,也可以方便的调整日期和时间,定闹钟的功能也正常.实际的防真效果截图如下图(图 10、图 11),其中图 10 是正在调整定闹钟的时间,图 11 是调整显示时钟的时间。至此整个设计基本成功的完成.XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016LR11kR21kR31kR41kR51kR61kR71kR81kR91kQ12N5088R10100LS1SPEAKERR111kK1K2X1CRYSTALC1220pC2220p电气04-40401010412赵化正图 10:仿真效果截图(调整和显示定时)17XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016LR11kR21kR31kR41kR51kR61kR71kR81kR91kQ12N5088R10100LS1SPEAKERR111kK1K2X1CRYSTALC1220pC2220p电气04-40401010412赵化正图 11:仿真效果截图(调整和显示时钟)5 课程设计体会课程设计体会单片机是计算机技术发展的产物,是经济实用开发简便的高科技产品,在当今工业控制、家电等领域占据广泛的市场。通过此次单片机课程设计来设计个简单的数字闹钟,我巩固了自己学习的单片机知识,来初步了解了小型单片机系统的设计和运用,并提高自己实际动手能力。 ,课程设计过程也使我了解了自己能力的不足,不过通过资料收集和文献查询等方法,找出了设计过程中的一些问题以及解决问题的方法,从而比较顺利的完成了这个设计任务。这次自己所做的设计取得了一些宝贵的经验,提高了自己的动手能力,为将来的学习和工作很有好处。通过这次课程设计我学到了很多全新的在课堂上没法学到的知识,同时也加深了以前所学知识的理解,也增强了理论联系实际的操作能力。但是,在实际的编程以及调试程序过程中,我发现自己应该学的还有太多太多。光靠书本上是远远行不通的! 总之,理论必须和实际结合才有威力,知识必须通过应用才能实现其价值!所学的东西最终是要面向社会,是在以后的工作能够更好的应用,此时的知识积累是为以后的工作做好坚实的基础。这个设计总体上不算完美,但是在这个课程设计的经历的好处是不可估量的。18参考文献:参考文献:1余发山单片机原理及应用技术中国矿业大学出版社2孙涵芳MCS-51 系列单片机原理及应用M 北京:北京航空航天大学出版社1996-43王义军.单片机原理及应用习题与实验指导书M.北京:中国电力出版社,20064陈明荧.8051 单片机课程设计实训教材M.北京,清华大学出版社,20045唐前辉、丁明亮. 重庆电专 PROTEUS 中文入门教程6彭小军用单片机实现电子时钟新余高等专科学报,20047黄正谨综合电子设计与实践东南大学出版社2002-38高峰. 单片机应用系统设计及实用技术,北京机械工业出版社,2004附附 1 1 源程序代码源程序代码/*;按 K1 键,依次进入闹钟功能,闹钟时间,年,月,日和时,分,秒模式,直致退出设置状态 *;按 K2 键,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字 *;闹钟响时,按 K2 即可停止闹钟的声响 *;K2 和 K1 需要配合使用;设置状态,LCD 上排最前面显示P,下排最前面设置闹钟时显示alarm:,其他显示time: *;闹钟启用时,在 LCD 下排中间显示一小喇叭,闹钟禁用时,无此小喇叭 *;年代变化 2000-2099,星期自动转换 *;*变量的定义*RS BIT P2.0 ;LCD 数据/命令选择端(H/L)RW BIT P2.1 ;LCD 读/写选择端(H/L)EP BIT P2.2 ;LCD 使能控制PRE BIT P1.7 ;调整键(K1)ADJ BIT P1.6 ;调整键(K2)SPK BIT P3.7 ;闹钟声音输出口YEAR DATA 18H ;年,月,日变量MONTH DATA 19HDATE DATA 1AHWEEK DATA 1BHHOUR DATA 1CH ;时,分,秒,百分之一秒变量MIN DATA 1DHSEC DATA 1EHSEC100 DATA 1FHHOUR_ARM DATA 20H ;闹钟时,分,秒,变量MIN_ARM DATA 21HSEC_ARM DATA 22HSTATE DATA 23HALARM BIT STATE.0 ;闹钟是否启用标志 1-启用,0-禁止LEAP BIT STATE.1 ;是否闰年标志 1-闰年,0-平年KEY_S DATA 24H ;当前扫描键值KEY_V DATA 25H ;上次扫描键值DIS_BUF_U0 DATA 26H ;LCD 上排显示缓冲区DIS_BUF_U1 DATA 27HDIS_BUF_U2 DATA 28HDIS_BUF_U3 DATA 29HDIS_BUF_U4 DATA 2AHDIS_BUF_U5 DATA 2BH19DIS_BUF_U6 DATA 2CHDIS_BUF_U7 DATA 2DHDIS_BUF_U8 DATA 2EHDIS_BUF_U9 DATA 2FHDIS_BUF_U10 DATA 30HDIS_BUF_U11 DATA 31HDIS_BUF_U12 DATA 32HDIS_BUF_U13 DATA 33HDIS_BUF_U14 DATA 34HDIS_BUF_U15 DATA 35HDIS_BUF_L0 DATA 36H ;LCD 下排显示缓冲区DIS_BUF_L1 DATA 37HDIS_BUF_L2 DATA 38HDIS_BUF_L3 DATA 39HDIS_BUF_L4 DATA 3AHDIS_BUF_L5 DATA 3BHDIS_BUF_L6 DATA 3CHDIS_BUF_L7 DATA 3DHDIS_BUF_L8 DATA 3EHDIS_BUF_L9 DATA 3FHDIS_BUF_L10 DATA 40HDIS_BUF_L11 DATA 41HDIS_BUF_L12 DATA 42HDIS_BUF_L13 DATA 43HDIS_BUF_L14 DATA 44HDIS_BUF_L15 DATA 45HFLAG DATA 46H ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。DIS_H DATA 47HDIS_M DATA 48HDIS_S DATA 49HDIS_S0 DATA 4AHDIS_S1 DATA 4BHDIS_S2 DATA 4CHDIS_S3 DATA 4DHDIS_S4 DATA 4EHDIS_S5 DATA 4FH;*初始化*ORG 0000HLJMP STARTORG 000BHLJMP TIMER0ORG 001BHLJMP TIMER1ORG 0100HSTART: MOV SP,#60HMOV R0,#18HMOV A,#00HMEM_INI: MOV R0,AINC R0CJNE R0,#5FH,MEM_INILCALL DELAY_5ms ;初始化 LCDMOV R0,#38H ;设置 LCD 为 16X2 显示,5X7 点阵,八位数据接口LCALL LCD_WCMDLCALL DELAY_5msMOV R0,#0CH ;设置 LCD 开显示及光标形式(光标不闪烁,不显示-)LCALL LCD_WCMDLCALL DELAY_5msMOV R0,#06H ;LCD 显示光标移动设置(光标地址指针加 1,整屏显示不移动)LCALL LCD_WCMDLCALL DELAY_5msMOV R0,#01H ;清除 LCD 的显示内容LCALL LCD_WCMDLCALL DELAY_5ms;第一自定义字符:MOV R0,#40HLCALL lcd_wcmd ;01 000 000第 1 行地址 (D7D6 为地址设定命令形式 D5D4D3 为字符存放位置MOV R0,#1FHLCALL lcd_wdat ;XXX 11111第 1 行数据(D7D6D5 为 XXX,表示为任意数(一般用 000) ,MOV R0,#41HLCALL lcd_wcmd ;01 000 001第 2 行地址MOV R0,#11HLCALL lcd_wdat ;XXX 10001第 2 行数据MOV R0,#42HLCALL lcd_wcmd ;01 000 010第 3 行地址MOV R0,#15HLCALL lcd_wdat ;XXX 10101第 3 行数据MOV R0,#43H20LCALL lcd_wcmd ;01 000 011第 4 行地址MOV R0,#11HLCALL lcd_wdat ;XXX 10001第 4 行数据MOV R0,#44HLCALL lcd_wcmd ;01 000 100第 5 行地址MOV R0,#1FHLCALL lcd_wdat ;XXX 11111第 5 行数据MOV R0,#45HLCALL lcd_wcmd ;01 000 101第 6 行地址MOV R0,#0AHLCALL lcd_wdat ;XXX 01010第 6 行数据MOV R0,#46HLCALL lcd_wcmd ;01 000 110第 7 行地址MOV R0,#1FHLCALL lcd_wdat ;XXX 11111第 7 行数据MOV R0,#47HLCALL lcd_wcmd ;01 000 111第 8 行地址MOV R0,#00HLCALL lcd_wdat ;XXX 00000第 8 行数据;第二个自定义字符:MOV R0,#48HLCALL lcd_wcmd ;01 001 000第 1 行地址MOV R0,#01HLCALL lcd_wdat ;XXX 00001第 1 行数据MOV R0,#49HLCALL lcd_wcmd ;01 001 001第 2 行地址MOV R0,#1BHLCALL lcd_wdat ;XXX 11011第 2 行数据MOV R0,#4AHLCALL lcd_wcmd ;01 001 010第 3 行地址MOV R0,#1DHLCALL lcd_wdat ;XXX 11101第 3 行数据MOV R0,#4BHLCALL lcd_wcmd ;01 001 011第 4 行地址MOV R0,#19HLCALL lcd_wdat ;XXX 11001第 4 行数据MOV R0,#4CHLCALL lcd_wcmd ;01 001 100第 5 行地址MOV R0,#1DHLCALL lcd_wdat ;XXX 11101第 5 行数据MOV R0,#4DHLCALL lcd_wcmd ;01 001 101第 6 行地址MOV R0,#1BHLCALL lcd_wdat ;XXX 11011第 6 行数据MOV R0,#4EHLCALL lcd_wcmd ;01 001 110第 7 行地址MOV R0,#01HLCALL lcd_wdat ;XXX 00001第 7 行数据MOV R0,#4FHLCALL lcd_wcmd ;01 001 111第 8 行地址MOV R0,#00HLCALL lcd_wdat ;XXX 00000第 8 行数据MOV YEAR,#5 ;置年初值MOV MONTH,#1 ;置月初值MOV DATE,#1 ;置日初值MOV DIS_S0,#43H ;CMOV DIS_S1,#72H ;rMOV DIS_S2,#61H ;aMOV DIS_S3,#73H ;sMOV DIS_S4,#79H ;yMOV DIS_S5,#20H ; MOV R1,#00H ;显示一自定义字符LCALL WEEK_PROLCALL UPDATE_BUFLCALL DISPLAY_PRO ;屏显初始化;*主程序*MAIN: MOV IE,#8AH ;CPU 开中断,Timer0,Timer1 开中断MOV TMOD,#11H ;Timer0,Timer1 工作于模式 1, 16 位定时方式MOV TH0,#0DCH ;Timer0 置 10ms 定时初值MOV TL0,#00HMOV TH1,#0FFH ;Timer1 置闹钟声音初值MOV TL1,#00HSETB ALARM ;初始启动闹钟功能CLR TR1 ;Timer1 禁止SETB TR0 ;Timer0 启动MOV KEY_V,#03HMAIN_1: LCALL KEY_SCANMOV A,KEY_SXRL A,KEY_VJZ MAIN_1LCALL DELAY_5msLCALL DELAY_5msLCALL KEY_SCANMOV A,KEY_SXRL A,KEY_V21JZ MAIN_1MOV KEY_V,KEY_SMOV A,KEY_VXRL A,#01HJNZ MAIN_2CLR TR0 ;进入调整状态,禁止 Timer0MOV IE,#00H ;CPU 禁止中断LCALL KEY_PRE_PRO ;PRE 按键按下,调用 PRE 按键处理程序SJMP MAIN_1MAIN_2: MOV A,KEY_VXRL A,#02HJNZ MAIN_1LCALL KEY_ADJ_PRO ;ADJ 按键按下,调用 PRE 按键处理程序SJMP MAIN_1;*按键扫描程序*KEY_SCAN: CLR AMOV P1,#0FFHMOV C,PREMOV ACC.1,CMOV C,ADJMOV ACC.0,CMOV KEY_S,A ;本次扫描键值存入 KEY_SRET;*PRE 按键处理程序*KEY_PRE_PRO: INC FLAGMOV R4,FLAGCJNE R4,#1,KEY_PRE_1 ;注意,该指令不改变操作MOV R0,#0EHLCALL LCD_WCMD ;显示光标_,整个光标不闪烁MOV DIS_S0,#61H ;aMOV DIS_S1,#6cH ;lMOV DIS_S2,#61H ;aMOV DIS_S3,#72H ;rMOV DIS_S4,#6dH ;mMOV DIS_S5,#3aH ;:MOV R1,#50H ;PMOV DIS_H,HOUR_ARMMOV DIS_M,MIN_ARMMOV DIS_S,SEC_ARMLCALL UPDATE_BUFLCALL DISPLAY_PRO ;更新屏显内容MOV R0,#47HLCALL LCD_POS ;使光标位于第一个调整项下JMP KEY_PRE_EKEY_PRE_1: CJNE R4,#2,KEY_PRE_2MOV R0,#49HLCALL LCD_POS ;光标置小时报警设置位置JMP KEY_PRE_EKEY_PRE_2: CJNE R4,#3,KEY_PRE_3MOV R0,#4CHLCALL LCD_POS ;光标置分钟报警设置位置JMP KEY_PRE_EKEY_PRE_3: CJNE R4,#4,KEY_PRE_4MOV R0,#4FHLCALL LCD_POS ;光标置秒时报警设置位置JMP KEY_PRE_EKEY_PRE_4: CJNE R4,#5,KEY_PRE_5MOV DIS_S0,#74H ;tMOV DIS_S1,#69H ;iMOV DIS_S2,#6dH ;mMOV DIS_S3,#65H ;eMOV DIS_S4,#3aH ;:MOV DIS_S5,#20H ; MOV R1,#50H ;PMOV DIS_H,HOURMOV DIS_M,MINMOV DIS_S,SECLCALL UPDATE_BUFLCALL DISPLAY_PRO ;更新屏显内容MOV R0,#05HLCALL LCD_POS ;光标置年调整位置JMP KEY_PRE_EKEY_PRE_5: CJNE R4,#6, KEY_PRE_6MOV R0,#08HLCALL LCD_POS ;光标置月调整位置JMP KEY_PRE_EKEY_PRE_6: CJNE R4,#7,KEY_PRE_7MOV R0,#0bHLCALL LCD_POS ;光标置日调整位置JMP KEY_PRE_EKEY_PRE_7: CJNE R4,#8,KEY_PRE_8MOV R0,#49HLCALL LCD_POS ;光标置时调整位置JMP KEY_PRE_E22KEY_PRE_8: CJNE R4,#9,KEY_PRE_9MOV R0,#4cHLCALL LCD_POS ;光标置分调整位置JMP KEY_PRE_EKEY_PRE_9: CJNE R4,#10,KEY_PRE_10MOV R0,#4fHLCALL LCD_POS ;光标置秒调整位置JMP KEY_PRE_EKEY_PRE_10: MOV FLAG,#0 ;FLAG 到 11,就清零MOV R0,#0CHLCALL LCD_WCMD ;设置 LCD 开显示及光标不闪烁,不显示-MOV R0,#01HLCALL LCD_WCMD ;清除 LCD 的显示内容MOV IE,#8AH ;CPU 开中断,TIMER0,TIMER1 开中断SETB TR0 ;启动 TIMER0KEY_PRE_E:RET;* ADJ 按键处理程序*KEY_ADJ_PRO: MOV R5,FLAGCJNE R5,#0,KEY_ADJ_0 ;FLAG=0,如果有闹钟声音,就停止闹钟声音MOV C,TR1JNC KEY_ADJ_ACLR TR1KEY_ADJ_A: JMP KEY_ADJ_EKEY_ADJ_0: CJNE R5,#1,KEY_ADJ_1 ;FLAG=1,调整是否启用闹钟CPL ALARMLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#47HLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_1: CJNE R5,#2,KEY_ADJ_2 ;FLAG=2,调整闹钟时INC HOUR_ARMMOV A,HOUR_ARMCJNE A,#24,KEY_ADJ_1_1MOV HOUR_ARM,#0KEY_ADJ_1_1: MOV DIS_H,HOUR_ARMLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#49HLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_2: CJNE R5,#3,KEY_ADJ_3 ;FLAG=3,调整闹钟分INC MIN_ARMMOV A,MIN_ARMCJNE A,#60,KEY_ADJ_2_1MOV MIN_ARM,#0KEY_ADJ_2_1: MOV DIS_M,MIN_ARMLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#4CHLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_3: CJNE R5,#4,KEY_ADJ_4 ;FLAG=4,调整闹钟秒INC SEC_ARMMOV A,SEC_ARMCJNE A,#60,KEY_ADJ_3_1MOV SEC_ARM,#0KEY_ADJ_3_1: MOV DIS_S,SEC_ARMLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#4FHLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_4: CJNE R5,#5,KEY_ADJ_5 ;FLAG=5,调整年INC YEARMOV A,YEARCJNE A,#100,KEY_ADJ_4_1MOV YEAR,#0KEY_ADJ_4_1: LCALL WEEK_PROLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#05HLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_5: CJNE R5,#6,KEY_ADJ_6 ;FLAG=6,调整月INC MONTHMOV A,MONTH23CJNE A,#13,KEY_ADJ_5_1MOV MONTH,#1KEY_ADJ_5_1: LCALL WEEK_PROLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#08HLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_6: CJNE R5,#7,KEY_ADJ_7 ;FLAG=7,调整日INC DATEMOV A,MONTHXRL A,#2JNZ KEY_ADJ_6_2 ;不是二月跳转MOV A,DATE ;MOV C,LEAP ;判断是否闰年JC KEY_ADJ_6_1XRL A,#29 ;平年二月日期 28 天JNZ KEY_ADJ_6_5JMP KEY_ADJ_6_4KEY_ADJ_6_1: XRL A,#30 ;闰年二月日期 29 天JNZ KEY_ADJ_6_5JMP KEY_ADJ_6_4 ;跳转到月处理KEY_ADJ_6_2: MOV A,MONTHXRL A,#4JZ KEY_ADJ_6_3MOV A,MONTHXRL A,#6JZ KEY_ADJ_6_3MOV A,MONTHXRL A,#9JZ KEY_ADJ_6_3MOV A,MONTHXRL A,#11JZ KEY_ADJ_6_3MOV A,DATEXRL A,#32 ;大月日期 31 天JNZ KEY_ADJ_6_5JMP KEY_ADJ_6_4KEY_ADJ_6_3: MOV A,DATEXRL A,#31 ;小月日期 30 天JNZ KEY_ADJ_6_5KEY_ADJ_6_4: MOV DATE,#1KEY_ADJ_6_5: LCALL WEEK_PROLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#0BHLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_7: CJNE R5,#8,KEY_ADJ_8 ;FLAG=8,调整时INC HOURMOV A,HOURCJNE A,#24,KEY_ADJ_7_1MOV HOUR,#0KEY_ADJ_7_1: MOV DIS_H,HOURLCALL UPDATE_BUFLCALL DISPLAY_PROMOV R0,#49HLCALL LCD_POSJMP KEY_ADJ_EKEY_ADJ_8: CJNE R5,#9,KEY_ADJ_9 ;FLAG=9,调整分INC MINMOV A,MINCJNE A,#60,KEY_ADJ_8_1MOV MIN,#0KEY_ADJ_8_1: MOV DIS_M,MINLC
展开阅读全文