湖南工业职业技术学院
毕业设计(论文)
题目:基于单片机的数字钟的设计
院系:电气系
专业:电子信息专业
学生姓名:班级/学号:电信
指导老师/督导老师:
起止时间:
1
湖 南 工 业 职 业 技 术 学 院
引言
这次毕业设计通过对单片机的学习、应用,以ATS51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它主要通过DP-51PROC单片机综合仿真实验仪实现,通过数码管能够准确显示时间,调整时间,它的计时周期为24小时,从而到达学习、设计、开发软、硬件的能力。主要实现功能为显示时间,时间校准调时(采用手动按键调时),闹铃功能(设置定时时间,到点后闹铃发出响声)。通过键盘可以进行校时、定时。闹铃功能使用I/O 口定时翻转电平驱动的无源蜂鸣器。本文主要介绍了工作原理及调试过程。
关键词:单片机 电子时钟 ATS51
2
湖 南 工 业 职 业 技 术 学 院
目 录
引言……………………….......…………………………………………………………………………..2
第一章 第二章 概述………………………………………………………………………………………….4 方案论证与比较…………………………………………………………………………..5
2.1数字时钟方案……………………………………………………………………………………6 2.2数码管显示方案…………………………………………………………………………………6 2.3闹铃方案…………………………………………………………………………………………6 2.4校准方案…………………………………………………………………………………………7
第三章 硬件设计…………………………………………………………………….……………...8
3.1总体设计………………………………………………………………………….……………...8 3.2模块设计…………………………………………………………………………….………….. 8
第四章 设计原理……...……………………………………………………………….…………..13
4.1系统总体方案选择与说明…………………………………………………….……………….13 4.2工作原理…………………………………………………………………….………………….14 4.3各单元硬件设计说明及计算方法………………………………………….………………….15 4.4软件设计与说明………………………………………………………….…………………….15
第五章 软件设计…...……………………………………………………….…………………….17
5.1主程序流程…………………………………………………………….……………………….17 5.2闹铃程序………………………………………………………………………………………..18 5.3中断程序......................................................................................................................................19
第六章 调试过程...........................................................................................................................20
6.1使用的元件与元件特性………………………………………………………………………..20 6.2电路连接………………………………………………………………………………………..23 6.3使用Keil uVision3编写程序………………………………………………………………… .23 6.4运行程序………………………………………………………………………………………..31
总结......................................................................................................................................................... 50 参考文献.................................................................................................................................................52
3
湖 南 工 业 职 业 技 术 学 院
第一章 概述
从单片机电子时钟近年的发展趋势来看,正朝着多层次用户、多品种、多规格、高精度、小体积、低能耗等方面发展。在这种趋势下,时钟的数字化,智能化已经成为现代时钟生产研究的主导设计方向。带有时钟功能的电子产品和电子设备进年来广泛地出现在国内外市场中。例如奥运会倒计时显示屏、铁路安全显示屏、生产线看板、体育比赛记时屏、大型室外高亮度时钟等,这类产品覆盖银行、医院、地铁车站、体育运动、电视台、监控系统、高大建筑物等行业。作为一种人机接口方式,语音比LCD,鼠标键盘等设备更易于使用。而在设计里加上语音提示、音乐或者其他语音功能,还使得设计显得既人性化又有趣,不但能提高开发者的兴趣和积极性,同时也能让设计作品与众不同,从而得到了各界领域的广泛应用所以对语音的研究有很大的实际意义。
本论文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机ATS51芯片和LED数码管为核心,辅以蜂鸣器电路,构成了一个单片机电子时钟。由于单片机芯片上引脚数目有限,为了解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设置或由机器状态来区分。显示时间功能:显示时,分,秒。具有校时功能: 能对时、分、秒按实际时间进行手动校正。闹铃功能:到时播放音乐。 我使用的是DP-51PROC单片机综合仿真实验仪。我将先介绍一下显示电路、闹铃电路的内部工作原理,及本次设计中51单片机是如何实现任务要求的,主要有设计思路,设计框图,设计过程。主要内容包括方案论证与比较、系统设计、设计原理、软件设计、调试过程。
4
湖 南 工 业 职 业 技 术 学 院
第二章 方案论证与比较
2.1数字时钟方案
数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。
方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。
2.2数码管显示方案
方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。
从节省I/O口和降低能耗出发,本设计采用方案二。
使用共阴极七段数码显示管。使用74SL48作为 BCD-7段数码管显示译码器 2.3闹铃方案
方案一:蜂鸣器,一个交流蜂鸣器及其驱动电路,能够演奏音乐。 方案二:闹铃芯片
因为单片机有定时器所以使用蜂鸣器就可以了,不必使用闹铃芯片了,很浪费单片机功能。 所以选择方案一蜂鸣器
2.3.1驱动选择
方案一:PWM 输出口直接驱动蜂鸣器 。PWM 输出口直接驱动蜂鸣器方式。由于PWM 只控制
5
湖 南 工 业 职 业 技 术 学 院
固定频率的蜂鸣器,所以可以在程序的系统初始化时就对PWM 的输出波形进行设置。
首先根据PWM 输出的周期宽度是10 位数据来选择PWM 时钟。系统使用4MHz 的晶振作为主振荡器,一个tosc 的时间就是0.25μs,若是将PWM 的时钟设置为tosc 的话, 则蜂鸣器要求的波形周期500μs 的计数值为500μs/0.25μs=(2000)10=(7D0)16,7D0H 为11 位的数据,而SH69P43 的PWM
输出周期宽度只是10 位数据,所以选择PWM 的时钟为tosc 是不能实现蜂鸣器所要的驱动波形的。
这里我们将PWM 的时钟设置为4tosc,这样一个PWM 的时钟周期就是1μs 了,由此可以算出500μs 对应的计数值为500μs/1μs=(500)10=(1F4)16,即分别在周期寄存器的高2 位、中4 位和低4 位三个寄存器中填入1、F 和4,就完成了对输出周期的设置。再来设置占空比寄存器,在PWM 输出中占空比的实现是
通过设定一个周期内电平的宽度来实现的。当输出模式选择为普通模式时,占空比寄存器是用来设置高电平的宽度。250μs 的宽度计数值为250μs/1μs=(250)10=(0FA)16。只需要在占空比寄存器的高2 位、中4 位和低4 位中分别填入0、F 和A 就可以完成对占空比的设置了,设置占空比为1/2duty。
以后只需要打开PWM 输出,PWM 输出口自然就能输出频率为2000Hz、占空比为1/2duty 的方波。
方案二: I/O 口定时翻转电平驱动蜂鸣器。使用I/O 口定时翻转电平驱动蜂鸣器方式的设置比较简单,只需要对波形分析一下。由于驱动的信号刚好为周期500μs,占空比为1/2duty 的方波,只需要每250μs 进行一次电平翻转,就可以得到驱动蜂鸣器的方波信号。在程序上,可以使用TIMER0 来定时,将TIMER0 的预分频设置为/1,选择TIMER0 的始终为系统时钟(主振荡器时钟/4),在TIMER0 的载入/计数寄存器的高4 位和低4 位分别写入00H 和06H,就能将TIMER0 的中断设置为250μs。当需要I/O 口驱动的蜂鸣器鸣叫时,只需要在进入TIMER0 中断的时候对该
I/O 口的电平进行翻转一次,直到蜂鸣器不需要鸣叫的时候,将I/O 口的电平设置为低电平即可。不鸣叫时将I/O 口的输出电平设置为低电平是为了防止漏电。
因为此次设计是基于51单片机驱动I/O 口的,所以选择方案二I/O 口定时翻转电平驱动蜂鸣器。
2.3.2蜂鸣器的选择
方案一:有源蜂鸣器 即通电就可以发声。
方案二: 无源蜂鸣器 即要有驱动的音频电流才能发声。
因为此次设计是基于51单片机驱动的,所以选择方案二无源蜂鸣器。
2.4校准方案
采用手动按键调时。用四个按键,一个是进入调时,一个是没按一次秒加一,六十以后变零,一个是没按一次分加一,六十以后变零,一个是没按一次时加一,二十四以后变零。
[
6
湖 南 工 业 职 业 技 术 学 院
第三章 系统设计
3.1总体设计
3.1.1系统说明
本次设计时钟电路,使用了ATC51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、显示屏即可满足设计要求 3.2模块设计
3.2.1电源部分
单片机从外部引入VCC 5V的直流电,为单片机、复位电路提供电源,GND接地。 3.2.2复位电路
图3-1复位电路
如图3-1所示,复位电路主要由型号为1N4148的二极管,型号为10UF/16V的电解电容,型号为104的瓷片电容,10K的电阻以及按键S1构成,S1接芯片的相应引脚RST,当开关按下时引脚RST为高电平1,断开时引脚为低电平0。
7
湖 南 工 业 职 业 技 术 学 院
3.2.3程序下载接口
图3-2 程序下载电路
如图3-2所示,由ATS ISP构成的两排十针下载口,板图上有一个小方框,为1号引角;下载线的凸口为正方向,凸口的右侧边的第一个插孔为1号引角。
3.2.4位选部分
选电路为三极管的集电极接数码管的公共端,当P2口对应的引脚输出高电平时三极管导通,对应的数码管显示数据。这样,在同一时刻,6位LED中只有选通的那1位显示出字符,而其他5位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其他个位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示出相应的字符,而其他各位则是熄灭的。如此循环下去,就可以使各位显示出将要显示的字符。虽然这些字符是在不同时刻出现的,而在同一时刻,只有一位显示,其他各位熄灭,但由于LED的余辉和人眼的视觉暂留作用,只要每位显示间隔足够短,则可以造成多位同时亮的假象,达到同时显示的效果。
3.2.5数码管的连接电路
8
湖 南 工 业 职 业 技 术 学 院
图3-6为数码管的引脚图,每位的段码线(a,b,c,d,e,f,g,)分别与1个7位的锁存器输出相连,由ATS51控制组合0-9十个数据,如令其显示1则b,c引脚(即2,3引脚)送高电平,7位LED显示的数据由显示缓冲区30H~36H单元中的数据决定 ,动态显示时,每位显示持续时间为1ms,1ms延时由软件实现,7位显示约耗时8ms。
此时数码管显示1。由于各位的段码线并联,8位I/O口输出段码对各个显示位来说都是相同的。
举例如果使用段共阴极数码管,要显示数字“4”时应该让b=c=f=g=1,a=d=e=0,如图3-3
图3-3数码显示
图3-4 BCD-7段数码管显示译码器 使用74SL48作为 BCD-7段数码管显示译码器。
译码是编码的你过程。编码是将含有特定意义的信息编成二进制代码。译码是将表示特定意义信息的二进制代码翻译出来。实现译码功能的电路称为译码器。
四位BCD译码器可以将BCD编码转化成十进制数码,并通过7段数码管显示出来。由于输入端有四个,共有24=16种不同的组合,每一种组合可对应一个数码,而十进制数码共有10个数码,因此有6个无效状态,对应7段数码管不亮。7段数码管内部有7个发光二极管,利用这7个发光二极管的亮暗组合来显示数码。7段数码管内部的7个发光二极管有共阴和共阳两种接法,把所有二极管的阳极连到一起的称为共阳极接法,此时译码器的输出应该是低电平有效;把所有二极管的阴极连到一起的称为共阴极接法,此时译码器的输出应该是高电平有效。
举例说明,如果要显示数码“0”则共阴极7段数码管的输出led6(a)、led5(b)、led4(c)、led3(d)、led2(e)、led1(f)、led0(g)为1111110,输入端D3、D2、D1、D0为0000。
用c51的p1口的p0、p1、p2、p3连接74ls48驱动器的A、B、C、D。
9
湖 南 工 业 职 业 技 术 学 院
3.2.6控制部分
ATS51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4K bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准8051指令系统及引脚。ATS51提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
ATS51有40引脚,双列直插(DIP)封装,所用引脚功能如下: 1. VCC ——运行时加+5V 2. GND ——接地
3. XTAL1 ——振荡器反相放大器及内部时钟发生器的输入端 4. XTAL2 ——振荡器反相放大器的输出端
5. RST ——复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机
器周期以上的高电平,将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFT AUXR的DISRTO位(地址8EH)可打开或关闭该功能。DISRTO位缺省为RESET输出高电平打开状态。
6. EA/VPP ——片外程序存储器访问允许信号。欲使CPU仅访问外部程序存储器(地
址为0000H-FFFFH),EA端必须保持低电平(接地),如果EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
7. P1口,P2口——P1,P2是一组带内部上拉电阻的8位双向I/O口。运行时通过P1
口控制驱动电路的工作,将数据送到数码管,显示相应的段码,为了达到减少功耗或满足端口对最大电流的,应加上一限流电阻。P2.0——P2.5口控制数码管的位选,使六个数码管轮流显示数据,等于1时位选三极管导通,等于0 时位选三极管截止。
8. 无自锁开关——(S2-P3.7)开关接相应引脚P3.7,当开关按下时,相应引脚为低
电平0,断开时引脚为高电平1。
3.2.7蜂鸣器驱动电路
图3-5 蜂鸣器电路
如图3-5由于蜂鸣器的工作电流比较大,以致于单片机的I/O 口是无法直接驱动的,
10
湖 南 工 业 职 业 技 术 学 院
所以要利用放大电路来驱动,使用三极管来放大电流就可以了。
利用I/O 定时翻转电平来产生驱动波形,利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为2500Hz 的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O 口每200μs 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。 3.2.8校准调时部分
更新显示器涉及到两个操作:发数据和改片选信号。使用单片机的p2口的p2.4、p2.5、p2.6、p2.7作为片选口与按键相连。
第四章 原理
4.1系统总体方案选择与说明
本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机ATC51为核心元件同时采用LED数码管显示器动态显示“时”,“分”,“秒”的现代计时装置。另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。
本次设计时钟电路,使用了ATC51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,四个按键的功能:A键用于电子钟启动/调整;B键用于调时,范围0-23,0为24点,每按一次时加1;C键用于调分,范围0-59,0 为60分,每按一次分加1;D键用于调秒, 范围0-59,0为60秒,每按一次秒加1,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、蜂鸣器、LED显示屏即可满足设计要求。
11
湖 南 工 业 职 业 技 术 学 院
4.1.2总体方案设计细想
1、 秒的设置利用单片机的T0定时器工作方式1,定时50秒,并利用一个软件计数器(R0
到R7中的任意一个),本程序中选用R4做计数器,并附初值为20,作减法计数,每次T0溢出时,计数器减一,当计数为零时,定时一秒完成.
2、 时钟的时分秒秒的个位以一为进制计数满10后向秒的十位进一,秒的十位计数满6
后向分的个位进一;分的个位满10后向分的十位进一,分的十位满6后向小时的个位进一;小时同前一步。
3、 闹钟的设置取时分秒的存储单元的数值与设定值相比较,当数值相等时,闹钟输出
端口打开
4、 显示输出显示器即LED显示的是十进制的数,故需要数据进制转换功能DA。本程序
中选用的是共阴极七段六管LED。用单片机芯片ATC51的P3;口输出控制共阴极七段六管LED的位选信号;用P1口输出共阴极七段六管LED的码段信号
4.1.2说明
系统由ATC51、LED 数码管、按键、电容、电阻等部分构成,能实现时间的调整、输出、调时间时能闪烁等功能。系统中按钮S1能对时间进行调整功能的按钮,采用单键控制调时功能,运用软件去抖判断按键的时间从而选择完成相对应的功能
时钟显示在此部分的设计中,设置专用显示数据缓冲区70h--75h,与分,时及其他数据缓冲区数据区别,在其中存放的是显示段码,而其他缓冲区存放的是时间数据。在显示时,首先将时间十进制数据转化为显示段码,然后送往数码管显示。显示段码采用动态扫描的方式。在要求改变显示数据的类别时,只须改变@R0(指向数据缓冲区的指针)指向的十进制数据缓冲区即可。
数据调整数据调整有多种方式。一、可以直接进入相关状态进行有关操作;二、将调整分两步,先进入状态,然后执行操作,这两步分别由两个键控制。方式一,比较直接,设计思想也比较简单,但是,这种方式存在操作时间和控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度(显示部分可以采用8279芯片来控制,可以解决此问题)。 当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。如果采用二的方式,就不会出现这种情况。因为状态的调整,与状态的操作可以分别由两个键控制,其状态的调整数可以多达256个(理论上),操作的完成是这样的,一键控制状态的调整,一键控制数据的调整。以上两种方式的实现都可以采用查询和中断的方式。两种方式必须注意的问题是两者进行相关操作的过程不能太长否则会影响显示的扫描。利用查询的方式,方法传统,对此就不作过多的讨论,以下是采用中断的方式实现的数字钟的一些讨论和有关问题作的一些处理。基于以上的讨论可以设计如下将调整分为状态调整和数据调整两部分,每次进入中断只执行一次操作,然后返回,这样,就不必让中断处于调整等待状态,这样,可以使中断的耗时很小。将定时器中断的优先级设置为最高级,那么中断的方式和查询的方式一样不会影响到时钟的记数。基于以上的讨论,数据修改的具体操作如下:
在状态进入后,调整指针的指向中@R1表示指向数据缓冲区的指针,它主要是为数据
12
湖 南 工 业 职 业 技 术 学 院
的调整而设立的,在图中MBF ,HOUR,分别表示时钟的分,时的数据缓冲区。状态3是秒表进入状态,状态4是时钟正常显示状态。 在程序中@R0为专用指针,它的值只在状态调整时改变,每次运行图示模块,只改变一次状态,就跳出程序。调整数据只须改变@R0中的数据即可。
@R0—MIN 状态1 @R0—HO状态2 正常计数 状态3 状态4
图4-1 状态图
4.2工作原理 电子钟的工作原理:
简易电子钟的设计有很多种方法,本设计采用单片机技术。简易电子钟设计的关键是如何产生秒的时间基准。本设计利用单片机的定时器/计数器和中断系统,通过软件计数的方法,获得秒的时间基准。具体方法如下单片机晶振频率fosc=6MHZ,设定定时器/计数器T0、T1的工作方式为工作方式1,软件控制定制器/计数器T0、T1的运行、停止,定时间为50ms,则定时器/计数器T0、T1溢出中断20次即可得到1秒的时间基准,定时器/计数器T0、T1计数初值X应满足(216-X)×2=50000us, X=40536(十进制),3CB0H(十六进制)。定时器
/计数器T0、T1采用中断控制方式,溢出次数在定时器/计数器的中断服务程序中,通过软件计数累加器计数,累计次数满8次,则表明产生了1秒的时间基准。
简易电子钟的显示器采用LED数码管显示器,由6个LED数码管组成,从左到右依次显示位时(十位、个位)、分(十位、个位)、秒(十位、个位)。电子钟键盘应由四个键构成,一个键用控制电子钟的运行、停止,另外按钮用于调整电子钟的时分秒值。本设计中采用一个按钮,用于控制时钟的运行、停止,调整时分值。
4.3各单元硬件设计说明及计算方法 总体方案及硬件设计:
电子钟硬件系统的设计,关键是键盘、显示器接口电路的设计,本设计采用ATC51的并行I/O口构成电子钟的键盘、显示接口电路,其硬件系统原理框图如下图所示,主要包括单片机、时钟电路。复位电路及显示接口电路。
13
湖 南 工 业 职 业 技 术 学 院
时钟电路 驱动电路 显示器 单片机ATC51 复位电路 键 盘
图4-2 单片机设计
需要用的硬件芯片ATC51,七段六管LED供阴极显示器,按钮,电容,晶振管。采用晶振电路产生秒脉冲,采用ATC51芯片的P1口输出对七段LED显示器的码段进行控制。运用P3.0到P3.5的输出对七段六管LED显示器的位选控制。运用P3.7口对时钟进行调节功能输入
4.4软件设计与说明
软件设计功能部分包括一秒计时程序INTT0,加一程序ADD1,显示程序DISPLAY,延时程序,中断,调时程序SETMM,闪烁程序INTT1,清零程序CLR0,等。
其中一秒计时程序、加一程序、中断程序、清零程序及显示程序是是时钟的核心程序,完成时钟的正常走时功能,也是时钟的基本功能。
延时程序在本系统中主要起两个主用,第一就是显示的短暂延时,使显示更加完善,作用二就是在按按钮时根据时间来选择相应的功能以及起软件消斗功能。 闪烁程序能使显示功能更加人性化,以及同步显示正在执行的功能。 调时程序主要完成设置时间的功能
从单片机开始清零开始清零70H到7AH单元 ,在清零20H0A放入7A单元,定T0、
T1为工总方式1 T0T1定时器赋初值3CB0,EA、ET0、TR0置位,开中断开启T0定时器,
显示程序,如果正确继续显示,如何错误可以重新调时。
4.5调试结果与必要的调试说明
本课程设计调试是采用经典画图及仿真工具PROTEUS软件完成
首次调试出现显示不正常,显示位不对,理论上应为,七段六管LED从左到右显示位秒的个位,秒的十位,分的个位,分的十位,小时的个位,小时的十位,对应的端口应为P3口的P3.0到P3.5按顺序对应,但秒的个位向后推移了一位,且有应为秒的显示位反而不显示。刚刚开始就排除了软件问题,以为是用错了显示器,结果换来换去没有用错。采用一位一位
14
湖 南 工 业 职 业 技 术 学 院
测试法进行排除,发现P3.0口输出有无,无论怎么改都是显示‘0’和‘8’两个数。后来问老师,并找到了出错的原因,程序中显示器的号码段有错误,应选用共阴极的码段。程序中七段六段LED显示的位的初值为0FEH,及‘11111110B’,为共阴极初值。而代码用的是共阳极的代码段,故显示不正常。把号码段改为共阴极代码后,显示正常。显示正常后,长按键SB0释放后进入调分状态,在每快速按键后分显示位加一,能调到59后再次按键自动清零,说明能准确完成分的60计时;再次长按SB0释放后,进入调时状态,每短按一次SB0后时显示位加一,能调到23后再次按键自动清理,说明能准确完成小时24小时计时;第三次长按键后,退出调时,进入正常计时状态,说明能准确完成状态循环。
4.6使用说明
系统的时间调整功能采用单键控制,其操作为——长按S1一次松开后,退出时钟正常走秒,并进入对时钟的分钟未进行调整,每短按SB0按钮一次,时钟分钟显示数值加一,满六十后制动归零;再次长按S1按钮松开后,退出分钟调整,进入时钟小时调整,每短按SB0一次,时钟小时位加一,满二十四后制动归零;再次长按SB0,退出小时调整,并进入正常走时功能。
第五章 软件设计
5.1主程序流程图
15
湖 南 工 业 职 业 技 术 学 院
5.2闹铃流程图 图5-1主程序
16
湖 南 工 业 职 业 技 术 学 院
图5-2闹铃程序
5.3中断程序
17
湖 南 工 业 职 业 技 术 学 院
图5-3中断程序
第六章 调试过程
6.1使用的元件与元件特性
18
湖 南 工 业 职 业 技 术 学 院
图6-1 DP-51DPROC单片机实验箱
表6-1 ATS51功能特性:
实验仪模块分布图
· 兼容MCS-51指令系统 · 32个可编程I/O口 · 2个16位可编程定时/计数器 · 全双工UART串行中断口线 · 6个中断源 · 中断唤醒省电模式 · 看门狗(WDT)电路 · 4k可反复擦写(>1000次)ISP Flash ROM · 4.0-5.5V工作电压范围 · 全静态工作模式:时钟频率0-33MHz · 128x8bit内部RAM · 低功耗空闲和掉电模式 · 3级程序加密锁 · 掉电标识和快速编程特性 DP-51PRO 单片机综合仿真实验仪由多个相对的功能模块组成,每个功能模块都有一个编号,如C3,D8。以下是各模块位置分布图。
19
湖 南 工 业 职 业 技 术 学 院
图6-2单片机综合仿真实
验仪
使用到的功能模块简介
DP-51PRO 单片机综合仿真实验仪上每个功能模块的主要功能如下表所示
表6-2 编号 功能块名称 MON51 仿真调试运行模块 功能说明 内带MON51 监控程序,支持与KEIL C51 联机仿真调试,支持A1 单步、断点、跟踪、运行等方式。调试完成可以直接运行,无需仿真器和编程器。实现PHILIPS 单片机的Kflash 的ISP下载编程功能。另外,RS232 串口通讯实验也用这个功能块来进行。 A1区MON51仿真模块
该区除了下载仿真功能外,还包含了RS232 实验的功能。电路结构如下图所示。 短接A1 区的JP15 跳线组的1和2,3和4(出厂默认设置),就把单片机锁紧座的Rxd 和Txd 脚与RS232 电平转换芯片MAX232 连接起来了。如果用户想外接RS232 接口,可以把短路器去掉,这时JP15 的1、3那边是连接到MAX232 芯片的,2、4那边是连接到单片机锁紧座的。
A1 区的J76 可以通过40针排线与A2区的J79 相连,把单片机的功能管脚外引出去。
20
湖 南 工 业 职 业 技 术 学 院
图6-3 D7 I2C 实验区
该区包含一片24WC02 256 字节的EEPROM,一片PCF8563实时时钟芯片及外围电路,一片ZLG7290 键盘LED 驱动芯片及8 段8 位数码管和16 个按键。
D4 蜂鸣器区
该区包含一个交流蜂鸣器及其驱动电路
表6-3 D4 D8
D4 区为蜂鸣器电路,具体结构如下图所示。其中,J8为控制信号输入端,当输入为0时,没有声音输出,当输入为1时,蜂鸣器发声。
蜂鸣器区 接触式IC 卡实验区 该区包含一个交流蜂鸣器及其驱动电路 该区包含一个可连接SLE4442 卡的读卡头。
图6-4蜂鸣器电路
6.2电路连接
用导线连接D5区的SCL、SDA到A2区的P16、P17(SCL—P16、SDA-P17),连接D5区的RST _ L、INT _ KEY到A2区的P10、INTO(RST-P10、INT_ KEY-INT0),短接D5区的JP1跳线。
21
湖 南 工 业 职 业 技 术 学 院
使用导线把A2区的P13与B5区的BUZZ接线柱相连。
6.3使用Keil uVision3编写程序 6.3.1.写显示程序:
#include #define uchar unsigned char /*宏定义*/ #define uint unsigned int #define _Nop() _nop_() /*定义空指令*/ /* 常,变量定义区 */ /*端口位定义*/ sbit SDA=P1^7; /*模拟I2C数据传送位*/ sbit SCL=P1^6; /*模拟I2C时钟控制位*/ /*状态标志*/ bit ack; /*应答标志位*/ void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); 22 湖 南 工 业 职 业 技 术 学 院 SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); } void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); } void SendByte(uchar c) { uchar BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c< _Nop(); /*保证时钟高电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; 23 湖 南 工 业 职 业 技 术 学 院 } _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); } uchar RcvByte() { uchar retc; uchar BitCnt; retc=0; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); 24 湖 南 工 业 职 业 技 术 学 院 retc=retc<<1; if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc); } void Ack_I2c(bit a) { if(a==0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); } bit ISendByte(uchar sla,uchar c) { Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack==0)return(0); SendByte(c); /*发送数据*/ if(ack==0)return(0); 25 湖 南 工 业 职 业 技 术 学 院 Stop_I2c(); /*结束总线*/ return(1); } bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack==0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack==0)return(0); for(i=0;i Stop_I2c(); /*结束总线*/ return(1); } bit IRcvByte(uchar sla,uchar *c) { Start_I2c(); /*启动总线*/ SendByte(sla+1); /*发送器件地址*/ if(ack==0)return(0); *c=RcvByte(); /*读取数据*/ Ack_I2c(1); /*发送非就答位*/ Stop_I2c(); /*结束总线*/ return(1); } bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) { 26 湖 南 工 业 职 业 技 术 学 院 uchar i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack==0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i *s=RcvByte(); Ack_I2c(1); /*发送非应位*/ Stop_I2c(); /*结束总线*/ return(1); } 6.3.2调用I2C软件包 调用I2C软件包中开头包含“VIIC_C51.H”头文件的“VIIC_C51.C”文件加人到keil C51的项目中。修改“VIIC_C51.C”文件中的“sbit SDA=P1^ 7;”和“bit SCL=P1^ 6;” include \"reg52.h\" #include #define PCF8563 0xA2 #define WRADDR 0x00 #define RDADDR 0x02 unsigned char DelayNS(unsigned char no) { unsigned char i,j; //延时参数 //定义器件地址 //定义写单元首地址 //定义读单元首地址 \"VIiC_C51.H\" //包含VI2C软件包 27 湖 南 工 业 职 业 技 术 学 院 for(; no>0; no--) { for(i=0; i<100; i++) for(j=0; j<100; j++); } return 0; } void { } 6.3.3调用ZLG7290软件包 另外,还要增加ZLG7290软件包中开头包含“ZGL7290.H”文件头的“ZGL7290.C”文件加人到keil C51的项目中。 #include #include sbit sbit unsigned char DelayNS(unsigned char no) { unsigned char i,j; //延时参数 for(; no>0; no--) { for(i=0; i<100; i++) for(j=0; j<10; j++); } RST=P1^0; KEY_INT=P3^2; \"reg52.h\" \"VIiC_C51.H\" //包含VI2C软件包 unsigned char td[5]={0x00,0x12,0x00,0x30,0x12}; //定义初始化字 unsigned char rd[5]; DelayNS(10); while(1) { IRcvStr(PCF8563,RDADDR,rd,0x3); //读现在的时、分、秒 DelayNS(10); } //定义接收缓冲区 //初始化PCF8563,如果需要的话可以不去掉 ISendStr(PCF8563,WRADDR,td,0x5); main() #include \"zlg7290.h\" 28 湖 南 工 业 职 业 技 术 学 院 return 0; } void main() { unsigned char i,KEY; RST=0; DelayNS(1); RST=1; DelayNS(10); while(1) { if(KEY_INT==0) { KEY=ZLG7290_GetKey(); DelayNS(10); for(i=0;i<8;i++) { ZLG7290_SendCmd(0x60+i,KEY); DelayNS(1); } } } } 6.4运行程序 6.4.1操作1 先在select decive for target“target1”中选择单片机P80/87C52X2 如图6-5 29 湖 南 工 业 职 业 技 术 学 院 图6-5 选择单片机型号 图6-6单片机选择 6.4.2操作2 然后设置options for target“target1”中的target、C51、debug、target setup如图6-7 30 湖 南 工 业 职 业 技 术 学 院 图6-7设置工程 图6-8设置工程 Target选项的设置: DP-51PRO实验仪处在调试状态时,MON51监控程序将占 用0000H-7FFFH之间的程序存储单元,用户程序位于8000H-BFFFH之间的SRAM单元(off-chip Code memory 和 off-chip Xdata memory设置); 源程序开头也要用ORG伪指令进行相应的调整。 如图6-8 31 湖 南 工 业 职 业 技 术 学 院 图6-9设置工程 图6-10设置工程 第一种工作方式,选择其中Use Simlator选项,将µVision2调试器设置成软件模拟仿真,它只能对程序的语法及其结构做一般性的分析,与硬件没有联系。在此模式下不需要实际的目标硬件就可以模拟80C51微控制器的很多功能,在准备硬件之前就可以测试您的应用程序,这是很有用的。 在纯软件模拟工作方式下,上述(1)~(5)步均可省略,用户程序仍定位于0000H,源程序的起始定位也不需变。 当然,因为是软件模拟调试,程序中对外设的访问就无法通过DP-51PRO实验仪来观察运行效果,如灯亮、电机转等。但是Keil C51集成开发环境也提供了一个外设窗口来模拟外设动作,对于简单的应用程序基本上也够用了。 32 湖 南 工 业 职 业 技 术 学 院 第二种工作方式是:在图2.7所示的Debug调试模式设置窗口中,选择use, 将µVision2调试器设置成硬件模拟仿真。对于DP-51PRO单片机综合仿真实验仪的软硬系统联合调试而言,应该选择”Keil Monitor-51 Driver”。 此后,即可将DP-51PRO实验仪与Keil C51集成开发环境进行联合仿真调试。 至于其它的选项用户可按默认值进行设置或不用设置,最后点击确定加以确认。 仿真时选择第一种工作方式,真正实现功能时选择第二种工作方式,由于要实现功能所以选择第二种工作方式。 如图6-10 再点击setting,设置Target Setup,把端口Port从com1改成com2 如图6-11 图6-1设置工程 6.4.3再建立目标(build target) 如图6-12 33 湖 南 工 业 职 业 技 术 学 院 图6-12建立目标工程 6.4.4汇编语言 设置完毕执行Rebuild all target files命令对项目文件进行重新编译(汇编)、 连接。正确无误后,就可以对程序进行仿真调试了。汇编语言: 显示的: $NOMOD51 ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package ; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. ; ; To translate this file use A51 with the following invocation: ; ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; BL51 invocation: ; ; BL51 ;------------------------------------------------------------------------------ ; ; User-defined Power-On Initialization of Memory 34 湖 南 工 业 职 业 技 术 学 院 ; ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; ; ; XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATALEN ; PDATASTART EQU 0H ; the absolute start-address of PDATA memory PDATALEN ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C51 ; run-time routines must be set to zero. ;------------------------------------------------------------------------------ ; ; Reentrant Stack Initilization ; ; The following EQU statements define the stack pointer for reentrant ; functions and initialized it: ; ; Stack Space for reentrant functions in the SMALL model. IBPSTACK ; ; Stack Space for reentrant functions in the LARGE model. XBPSTACK ; ; Stack Space for reentrant functions in the COMPACT model. PBPSTACK ; ;------------------------------------------------------------------------------ ; ; Page Definition for Using the Compact Model with KByte xdata RAM EQU 0 ; set to 1 if compact reentrant is used. EQU 0 ; set to 1 if large reentrant is used. XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. EQU 0 ; set to 1 if small reentrant is used. IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1. EQU 0H ; the length of PDATA memory in bytes. EQU 0H ; the length of XDATA memory in bytes. ; the absolute start-address of IDATA memory is always 0 EQU 80H ; the length of IDATA memory in bytes. IDATALEN PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. 35 湖 南 工 业 职 业 技 术 学 院 ; ; The following EQU statements define the xdata page used for pdata ; variables. The EQU PPAGE must conform with the PPAGE control used ; in the linker invocation. ; PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. PPAGE ; ;------------------------------------------------------------------------------ ; Standard SFR Symbols ACC DATA 0E0H B DATA 0F0H SP DATA 81H DPL DATA 82H DPH DATA 83H ?C_C51STARTUP SEGMENT CODE ?STACK STARTUP1: IF IDATALEN <> 0 MOV R0,#IDATALEN - 1 RSEG C_C51STARTUP CSEG AT 0x8000 STARTUP1 ?C_STARTUP: LJMP EXTRN CODE (?C_START) PUBLIC C_STARTUP RSEG DS 1 STACK SEGMENT IDATA NAME C_STARTUP EQU 0 ; define PPAGE number. 36 湖 南 工 业 职 业 技 术 学 院 CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ENDIF IF XDATALEN <> 0 MOV DPTR,#XDATASTART MOV R7,#LOW (XDATALEN) IF (LOW (XDATALEN)) <> 0 MOV R6,#(HIGH (XDATALEN)) +1 ELSE MOV R6,#HIGH (XDATALEN) ENDIF CLR A XDATALOOP: MOVX @DPTR,A INC DPTR DJNZ R7,XDATALOOP DJNZ R6,XDATALOOP ENDIF IF PPAGEENABLE <> 0 MOV P2,#PPAGE ENDIF IF PDATALEN <> 0 MOV R0,#PDATASTART MOV R7,#LOW (PDATALEN) CLR A PDATALOOP: MOVX @R0,A INC R0 DJNZ R7,PDATALOOP ENDIF IF IBPSTACK <> 0 EXTRN DATA (C_IBP) MOV C_IBP,#LOW IBPSTACKTOP ENDIF 37 湖 南 工 业 职 业 技 术 学 院 IF XBPSTACK <> 0 EXTRN DATA (C_XBP) IF PBPSTACK <> 0 EXTRN DATA (C_PBP) MOV SP,#?STACK-1 ; This code is required if you use L51_BANK.A51 with Banking Mode 4 ; EXTRN CODE (B_SWITCH0) ; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 END 闹铃程序 $NOMOD51 ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package ; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. ; ; To translate this file use A51 with the following invocation: ; ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; BL51 invocation: ; ; BL51 ;------------------------------------------------------------------------------ LJMP C_START MOV C_PBP,#LOW PBPSTACKTOP ENDIF MOV C_XBP,#HIGH XBPSTACKTOP MOV C_XBP+1,#LOW XBPSTACKTOP ENDIF 38 湖 南 工 业 职 业 技 术 学 院 ; ; User-defined Power-On Initialization of Memory ; ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; ; ; the absolute start-address of IDATA memory is always 0 IDATALEN EQU 80H ; the length of IDATA memory in bytes. ; XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATALEN EQU 0H ; the length of XDATA memory in bytes. ; PDATASTART EQU 0H ; the absolute start-address of PDATA memory PDATALEN EQU 0H ; the length of PDATA memory in bytes. ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C51 ; run-time routines must be set to zero. ;------------------------------------------------------------------------------ ; ; Reentrant Stack Initilization ; ; The following EQU statements define the stack pointer for reentrant ; functions and initialized it: ; ; Stack Space for reentrant functions in the SMALL model. IBPSTACK EQU 0 ; set to 1 if small reentrant is used. IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1. ; ; Stack Space for reentrant functions in the LARGE model. XBPSTACK EQU 0 ; set to 1 if large reentrant is used. XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ; ; Stack Space for reentrant functions in the COMPACT model. PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ; ;------------------------------------------------------------------------------ 39 湖 南 工 业 职 业 技 术 学 院 ; ; Page Definition for Using the Compact Model with KByte xdata RAM ; ; The following EQU statements define the xdata page used for pdata ; variables. The EQU PPAGE must conform with the PPAGE control used ; in the linker invocation. ; PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. ; PPAGE EQU 0 ; define PPAGE number. ; PPAGE_SFR DATA 0A0H ; SFR that supplies uppermost address byte ; (most 8051 variants use P2 as uppermost address byte) ; ;------------------------------------------------------------------------------ ; Standard SFR Symbols ACC DATA 0E0H B DATA 0F0H SP DATA 81H DPL DATA 82H DPH DATA 83H NAME C_STARTUP ?C_C51STARTUP SEGMENT CODE ?STACK SEGMENT IDATA RSEG STACK DS 1 EXTRN CODE (?C_START) PUBLIC C_STARTUP CSEG AT 0x8000 ?C_STARTUP: LJMP STARTUP1 40 湖 南 工 业 职 业 技 术 学 院 RSEG C_C51STARTUP STARTUP1: IF IDATALEN <> 0 MOV R0,#IDATALEN - 1 CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ENDIF IF XDATALEN <> 0 MOV DPTR,#XDATASTART MOV R7,#LOW (XDATALEN) IF (LOW (XDATALEN)) <> 0 MOV R6,#(HIGH (XDATALEN)) +1 ELSE MOV R6,#HIGH (XDATALEN) ENDIF CLR A XDATALOOP: MOVX @DPTR,A INC DPTR DJNZ R7,XDATALOOP DJNZ R6,XDATALOOP ENDIF IF PPAGEENABLE <> 0 MOV PPAGE_SFR,#PPAGE ENDIF IF PDATALEN <> 0 MOV R0,#LOW (PDATASTART) MOV R7,#LOW (PDATALEN) CLR A PDATALOOP: MOVX @R0,A INC R0 DJNZ R7,PDATALOOP ENDIF 41 湖 南 工 业 职 业 技 术 学 院 IF IBPSTACK <> 0 EXTRN DATA (C_IBP) MOV C_IBP,#LOW IBPSTACKTOP ENDIF IF XBPSTACK <> 0 EXTRN DATA (?C_XBP) MOV C_XBP,#HIGH XBPSTACKTOP MOV C_XBP+1,#LOW XBPSTACKTOP ENDIF IF PBPSTACK <> 0 EXTRN DATA (?C_PBP) MOV C_PBP,#LOW PBPSTACKTOP ENDIF MOV SP,#?STACK-1 ; This code is required if you use L51_BANK.A51 with Banking Mode 4 ; EXTRN CODE (?B_SWITCH0) ; CALL B_SWITCH0 ; init bank mechanism to code bank 0 LJMP C_START END 闹铃的: ORG 8000H JMP MAIN ORG 800BH JMP INTT0 ORG 8100H MAIN: MOV SP,#60H MOV TMOD,#01H SETB ET0 SETB EA SETB TR0 42 湖 南 工 业 职 业 技 术 学 院 START0: SETB P1.3 MOV 30H,#00H NEXT: MOV A,30H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV R2,A JZ ENDD ANL A,#0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH JNZ SING CLR TR0 JMP D1 SING: DEC A MOV 22H,A RL A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV TH0,A MOV 21H,A MOV A,22H RL A INC A MOVC A,@A+DPTR MOV TL0,A MOV 20H,A SETB TR0 D1: CALL DELAY INC 30H JMP NEXT ENDD: CLR TR0 JMP START0 INTT0: PUSH PSW PUSH ACC 43 湖 南 工 业 职 业 技 术 学 院 MOV TL0,20H MOV TH0,21H CPL P1.3 POP ACC POP PSW RETI DELAY: MOV R7,#02 DELAY0: MOV R4,#187 DELAY1: MOV R3,#248 DJNZ R3,$ DJNZ R4,DELAY1 DJNZ R7,DELAY0 DJNZ R5,DELAY RET TABLE: DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H TABLE1: DW 260,400,524,580,684,777,820,8 DW 968,65030,65058,65110,65157,65178,65217 END 时间调整程序: SETMM: cLR ET0 ;关定时器T0中断 CLR TR0 ;关闭定时器T0 LCALL DL1S ;调用1秒延时程序 JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值 SETB ET1 ;允许T1中断 SETB TR1 ;开启定时器T1 SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待 SETB 00H ;键释放,分调整闪烁标志置1 SET4: JB P3.7,SET3 ;等待键按下 LCALL DL05S ;有键按下,延时0.5秒 JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态 44 湖 南 工 业 职 业 技 术 学 院 MOV R0,#77H ;按下时间小于0.5秒加1分钟操作 LCALL ADD1 ;调用加1子程序 MOV A,R3 ;取调整单元数据 CLR C ;清进位标志 CJNE A,#60H,HHH ;调整单元数据与60比较 HHH: JC SET4 ;调整单元数据小于60转SET4循环 LCALL CLR0 ;调整单元数据大于或等于60时清0 CLR C ;清进位标志 AJMP SET4 ;跳转到SET4循环 CLOSEDIS:SETB ET0 ;省电(LED不显示)状态。开T0中断 SETB TR0 ;开启T0定时器(开时钟) CLOSE: JB P3.7,CLOSE ;无按键按下,等待。 LCALL DISPLAY ;有键按下,调显示子程序延时削抖 JB P3.7,CLOSE ;是干扰返回CLOSE等待 WAITH: JNB P3.7,WAITH ;等待键释放 LJMP START1 ;返回主程序(LED数据显示亮) SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态) SETHH1: JNB P3.7,SET5 ;等待键释放 SETB 01H ;小时调整标志置1 SET6: JB P3.7,SET7 ;等待按键按下 LCALL DL05S ;有键按下延时0.5秒 JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整 MOV R0,#79H ;按下时间小于0.5秒加1小时操作 LCALL ADD1 ;调加1子程序 MOV A,R3 ; CLR C ; CJNE A,#24H,HOUU ;计时单元数据与24比较 HOUU: JC SET6 小于24转SET6循环 LCALL CLR0 ;大于或等于24时清0操作 AJMP SET6 ; 跳转到SET6循环 SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键释放 LCALL DISPLAY ;延时削抖 JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待 CLR 01H ;清调小时标志 CLR 00H ;清调分标志 CLR 02H ;清闪烁标志 CLR TR1 ;关闭定时器T1 45 湖 南 工 业 职 业 技 术 学 院 CLR ET1 ;关定时器T1中断 SETB TR0 ;开启定时器T0 SETB ET0 ;开定时器T0中断(计时开始) LJMP START1 ;跳回主程序 SET1: LCALL DISPLAY ;键释放等待时调用显示程序(调分) AJMP SET2 ;防止键按下时无时钟显示 SET3: LCALL DISPLAY ;等待调分按键时时钟显示用 AJMP SET4 SET5: LCALL DISPLAY ;键释放等待时调用显示程序(调小时)AJMP SETHH1 ;防止键按下时无时钟显示 SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用 AJMP SET6 SETOUT1: LCALL DISPLAY ;退出时钟调整时键释放等待 AJMP SETOUT ;防止键按下时无时钟显示 6.4.5使用Dpflash编写程序地址 如图6-13、 6-14 图6-13下载地址 46 湖 南 工 业 职 业 技 术 学 院 图6-14编程MON51 6.4.6把单片机综合实验仿真实验仪上的TKSMonitor51仿真器上的工作模式选择开关切换到RUN处,然后按一下复位键RESET,MON51程序就开始运行了。 6.4.7点击debug,开始运行 如图6-15 图6-15debug 47 湖 南 工 业 职 业 技 术 学 院 总结 设计总结 本设计能够很准确的走时,并能够通过硬件对时钟进行时间调整。 功能介绍: 1. 显示XX-XX-XX时间 2. 时间可调:调整键(S2)按下时间小于1秒(t<1s),关闭显示(省电)。调整键(S2) 按下(t>0.5s)分钟位闪亮,此时按下S2键(t<0.5s)该个位数值加1,当加到9时,再按下S2键则该个位显示0,分钟十位加1。继续按下调整键(S2)(t>0.5s)时钟位闪亮,此时按下S2键(t<0.5s)该个位数值加1,当加到9时再按下加S2键则该个位显示0,时钟十位加1。继续按下调整键(S2)(t>0.5s),返回到正常显示状态。 3. 闹铃功能:S3键设置闹铃时间,到时后蜂鸣器发出声音。 调试要点:首先确保各器件的完好性,其次检测各芯片的电源线和地线是否接触良好,然后焊接器件,接好电源用万用表检测各电源端、地端的状态是否正常。检查无误后插上ATS51并烧写一简易的程序,观察电路是否能协同工作。最后烧写工作程序,根据显示现象调试程序直至成功。上电运行时,数码管开始显示00:00:00,时钟开始走时。 图7-1 48 湖 南 工 业 职 业 技 术 学 院 后言 首先感谢我的论文指导老师李佳老师,我的论文是在她的悉心指导下完成的。李佳老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样,她循循善诱的教导和不拘一格的思路给予我无尽的启迪。同时也感谢谢芳芳老师,身为任课老师的她也给予我许多学习方面的照顾,此次设计也是谢芳芳老师在一旁提点才让我有这样的成果。 其次我要感谢一直陪同我走完大学求学之路的同学,谢谢他们平时对我无微不至的照顾和关心。我很高兴能生活在一个互助友爱和充满活力的集体中,从他们的身上我学到了很多,同时他们给我的大学生活留下了许多美好的回忆。 最后,我要特别感谢我的父母。在我求学的过程中他们付出的不仅仅是辛勤的劳动和汗水,而是世界上最崇高、最伟大的爱。他们所做的一切是我这一生都无法回报的。 真诚感谢给予我热情帮助和关注的所有人。 制作心得:通过这次的可测和功能设计是我认识到我对单片机反面的知识知道的太少了,对于书本上很多知识还不能灵活运用,有很都我们需要掌握的知识在等着我去学习,我会在以后的学习生活中弥补我所缺少的知识。还有通过本次的课程设计我还学会了PROTEUS软件的初步用法。通过PROTEUS软件仿真可以形象的反应自己编程的效果,为本次设计提供不少帮助。本次的课程设计,我从中学到了一些很重要的东西,那就是如何从理论到实践的转换化,怎样将我所学到的知识运用我以后的工作当中去。在大学的课堂的学习只是在我们灌输专业知识,而我们应把所学的知识用到我们显示的生活中去。此次的的电子时钟设计给我奠定了一个实践基础,我会在以后的学习生活中磨练自己,是自己适应于以后的竞争。在本次的设计中,非常感谢唐老师的指导,在老师的讲解下,我成功的解决了编程中的问题。也使我明白了编程也好,做事也罢,小小的细节马虎不得,必须要认认真真得做好一件事。 49 湖 南 工 业 职 业 技 术 学 院 参考文献 [1]周立功.单片机实验与实践教程(三).北京航空航天大学出版社.2006-5 [2]孙涵芳.MCS-51系列单片机原理及应用[M] .北京航空航天大学出版社.1996-4 [3]王迎旭.《单片机原理与应用》.机械工业出版社.2004-7 [4]唐继贤.51单片机工程应用实例. 北京航空航天大学出版社.2009-1 [5]戴仙金.51单片机及其C语言程序开发实例.清华大学出版社.2008-2 [6]杜树春 张体才. 单片机与外围器件接口实例详解. 中国电力出版社.2009-1 [7]王庆利 袁建敏.单片机设计案例实践教程. 北京邮电大学出版社.2010-02 [8]求是科技.单片机典型模块设计实例导航(第2版).人民邮电出版社. 2008-7 [9]叶钢 李三波 张莉. 单片机原理与仿真设计.北京航空航天大学出版社. 2009-4 [10]杭和平.单片机原理与应用.机械工业出版社.2008-5 [11]徐玮 沈建良. 单片机快速入门. 北京航空航天大学出版社. 2008-5 [12]王小立 朱志. 单片机应用技术一体化教程. 中国科学技术大学出版社. 2008-8 [13]孙惠芹. 单片机项目设计教程. 电子工业出版社. 2009-6 50
因篇幅问题不能全部显示,请点此查看更多更全内容