目录一、系统总体方案选择与说明 (1)二、设计框图与工作原理 (2)2.1设计框图 (2)2.2工作原理 (2)三、各单元硬件设计说明及计算方法35四、软件设计与说明 ............................................................................................................4.1程序设计流程图 (5)4.2程序设计步骤 (6)4.2.1延时程序 (6)4.2.2主程序的设计 (7)4.2.3中断服务程序的设计 (7)4.2.4显示控制子程序的设计 (7)4.2.5按键控制程序的设计 (7)五、调试结果及说明 (8)5.1软件调试 (8)5.2硬件调试 (9)六、各元件的使用说明 (10)6.1AT89C51 芯片 (10)6.2数码管 (10)6.3按键 (10)七、总结 (11)12八、参考文献 ......................................................................................................................九、附录 (13)13附录 A ...............................................................................................................................附录 B (14)系统总体方案选择与说明单片机系统作为一种典型的嵌入式系统,其系统设计包括硬件电路设计和软件编程设计两个方面,其调试过程一般分为软件调试、硬件测试、系统调试 3 个过程。
如果采用单片机系统的虚拟仿真软件—— Proteus,则不用制作具体的电路板也能够完成以上工作。
基于单片机设计的数字钟精确度较高,因为在程序的执行过程中,任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。
从而,使数字钟的精度仅仅取决于单片机的产生机器周期电路和定时器硬件电路的精确度。
另外,程序较为简洁,具有可靠性和较好的可读性。
针对要实现的功能,拟采用AT89C51 单片机进行设计, AT89C51 单片机是一款低功耗,高性能 CMOS8 位单片机,片内含 4KB 在线可编程(ISP)的可反复擦写 1000 次的 Flash 只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准 MCS- 51 指令系统及 80C51 引脚结构 [7] 。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为显示程序、调时显示运用、时钟和跑表切换程序这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
本设计中我们采用的硬件是自己焊的单片机开发板,首先要先确认该板能够完成下载功能在开始编程;第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和段选电路等。
第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。
第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
在下载到硬件中时确认程序的关键管脚与硬件电路一致。
设计框图与工作原理1、设计框图(如图一):熟悉硬件了解各引脚功能分块设计各部分电路完成整体电路图将分块的电路组合认真学习单片机汇编语言确定编程结构和思路综合各程序完成整体程序编辑各个程序模块调试程序,进行修改用 Proteus 画出电路图对仿真中出现的问题进行改正画出仿真图进行仿真仿真成功焊接单片机开发板软硬件结合,完成任务书验证硬件电路要求对设计进行总结和分析成功图一工作原理:在整个系统中首先要做的是将要实现功能的软件程序编写好,在程序编写好以后对其进行仿真调试,直到仿真结果和所需结果一致;其次要做的就是焊接出硬件即单片机开发板,在焊接好的开发板中对开发板进行检测看其是否能工作;在开发板能工作后,将软件程序下载到硬件开发板的芯片中,进行调试直到硬件中所示的结果和自己设计所需的结果一致。
各单元硬件设计说明及计算方法这部分介绍各模块电路的硬件设计方法和成果,主要分为:输入部分、输出部分、复位。
对于输入部分有时钟和跑表功能切换键,有对时钟的时、分、秒进行调整的按键;而输出部分则是电路的显示部分,将 AT89C51 的输出与数码管连接起来就构成了该硬件电路的显示部分。
对于硬件个元件的来源,我们先把单片机开发板焊接好,在焊接的过程中初步的了解一下开发板的内部结构以及各元件之间的关系,以便于在后续的下载连线工作中能够正确的、快速的连接好线,以便下载,焊接好开发板后,接下来就是测试开发的好坏,好的话就完成了硬件的设计,坏的话就将其原因查出重新焊接直到开发板能够下载程序,为后续的下载做好准备。
下面分别来介绍一下各个部分。
输入部分:在电子钟的输入部分,设置相应的置数功能,通过外部设备的输入,如按键,实现时间的修改。
在选用输入端口时,将P1 引脚与按键相连进行输入。
设计的输入部分如图二:图二输出部分:在电子钟的输出部分,与数码管相连显示出时、分、秒,在显示中其数字的输出在 P0 口,数码管有共阳和共阴之分,根据自己的软件程序的编写来选择不同的数码管和数码管的个数,以及正确的连接数码管的驱动电路。
设计的输出部分如图三:图三硬件的计算是简单的计算,其要计算需要多少个数码管来显示,以及多少个开关来控制该电路,本硬件电路需要五个按键来控制对于时、分、秒的调整以及时钟和跑表的切换功能和复位键,对于数码管则只需要六个来分别显示时时:分分:秒秒或分分:秒秒:毫秒毫秒。
软件设计与说明程序设计流程图(如图四):初始化显示无按键判断按键按键 3按键 1按键2调时调分调秒显示所调时间显示所调时间显示所调时间调整时限到或其他输入跑表显示分显示秒显示毫秒结束图四结合电路,程序的总体思路分析:1、点复位键(即单片机的系统复位键)后,进行时钟时间显示,从0 时 0分 0 秒开始。
2、按下 SECOND 键时进行校时,当 SECOND 键按下 1 次对秒位进行调时,此时按下 1 次对秒位加 1;3、当 MINUTE 键按下 1 次时对分位进行调整 ,此时按下 1 次对分位加 1;4、当 HOUR 键按下 1 次时对时进行调整 ,此时按下 1 次久对时位加1;5、当 xuanze 键按下时,系统将切换到跑表功能,数码管显示分分:秒秒:毫秒毫秒。
在程序设计时,尽量改进算法,算法的改进可以使相对误差减小,或者可以使占用空间减小。
另外,分块的设计思想要贯穿始终,整个程序较为繁杂,某些程序段会反复用到,因此采取的方法是写出多个程序段,通过跳转指令进行调用。
程序设计步骤:在程序设计过程中,我遇到了很多困难,这部分也是让我学到很多东西的地方。
首先,我学习了定时器的相关知识,计数器的使用是很重要的组成部分,在这个设计中选择计数器 T0。
T0 的工作方式有:方式 1:16 位计数器,常用方式 2:自动重装初值的8 位定时 /计数器方式 3:T0 相当于两个独立的8 位定时 /计数器此程序采用方式 1,方式 1 的定时时间 t 为 t=(216-M)*12/fosc 。
其中 M 为定时器初值, fosc 为 12MHz ,若 M 为 0 则 t=65536*12/2*106=65.536ms。
因此可取 10ms 为计时单位,初值 M 应为( 216-M ) *2*10 -6=10*10-3。
M=55536=1101100011110000B=0D8F0H。
即定时器初值为 TH0=0D8H ,TL0=0F0H 。
定时器中断 100 次为一秒,这部分在中断程序中用到。
其次,我参看了文献中的设计思路,做到胸有成竹后再进行具体的程序书写工作。
认真学习了教科书中关于汇编语言编程的问题,熟悉了汇编语言的编程方法和语法习惯。
第三步就是进行具体的程序编写工作。
1、延时程序在动态扫描时,必然用到延迟程序,这里使用延迟 1ms 的程序,用它来消除抖动,在判断按键是否按下是也用到延时程序,来消除抖动,因此这个延时程序是来优化该程序的。
2、主程序的设计主程序的主要功能是进行定时器 T0 的初始化,并启动 T0,然后通过反复调用显示子程序,等待 10ms 定时中断的到来,器流程图如图五所示:主程序中是用来控制全局的,当有中断时则转向中断服务程序,中断服务程序执行完后又回到主程序中,等待下一次的中断来临,这样就形成了一个循环,知道系统暂停和复位。
3、中断服务程序的设计中断服务程序中,总体思路是:由于初值是 D8F0H ,所以装满定时器需要 10ms 的时间,从而 100 次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为 0,分加一,依次类推。
4、显示控制子程序的设计在显示子程序中所要显示的是当为时钟时显示时、分、秒,当为跑表时显示分、秒、毫秒,所以在显示模块中需要一条转至语句,通过按键来分别选择所需显示的方向。
设置 T0 为方式 1设中断次数为100清计时单元开中断启动 T0调用显示子程序图五5、按键控制程序的设计在按键控制程序中,首先要判断按键是否按下,若按下则执行按键按下所要执行的语句,若没按下则继续判断按键是否按下,对于按键还得需要消抖程序,使得按键更准确。
调试结果及说明软件调试:程序编写完成后需要对程序进行编译和调试,在编译过程中刚开始很大可能都有错误,因为这么多的程序很有可能自己的粗心而导致语句有错误,经过反复的编译和调试,程序才真正的正确,在程序调试完成后,需生成后缀名为 .HEX 文件,该文件是用来仿真加载到 AT89C51 芯片上的,在仿真过程中也遇到了很多的问题,比如说仿真结果和所需的不一致,这就得改程序,还有仿真时数码管没有显示,这又可能是仿真电路有问题,总之在软件调试过程中问题是很多的,我们得一一的解决。
仿真结果如图六所示:R6R510k10kC1U1U21nF19A0A02 39 B0 18X1XTAL1P0.0/AD0 3 A017 C2A1 A1 38 B1A2 P0.1/AD1 4 A1 16CRYSTALA2 37 B2 A3 P0.2/AD25 A215 18A3 36 B3 XTAL2P0.3/AD3 6 A3 14A4 A4 35 B4 1nFA5 P0.4/AD4 7 A4 13 A5 34 B5 A6 P0.5/AD5 8 A5 12A6 33 B69A7P0.6/AD6 9 A6 11A7 32 B7RSTP0.7/AD7 A719 21P2.0/A8 1 CEP2.1/A9 22AB/BAP2.2/A10 232974LS245PSENP2.3/A113025 R1 R2 R3 R4ALEP2.4/A12 3126EAP2.5/A1310k10k 10k 10kP2.6/A14 27P2.7/A1528SECOND1 P1.0 P3.0/RXD 10MINUTE 2 11P1.1 P3.1/TXD312 HOUR4 P1.2 P3.2/INT0 13P1.3 P3.3/INT1514SW16 P1.4 P3.4/T0 15P1.5 P3.5/T1 7 16P1.6 P3.6/WRSW-SPST817P1.7P3.7/RDAT89C51图六结果说明:图中所示从左至右数码管显示的是时、分、秒,图中左下角有四个按键,分别用来调整时、分、秒和时钟和跑表的选择。