1、 目 录一、.设计任务.1二、总体方案设计与方案可行性说明1三、总框图及总体软件设计说明2四、接口电路逻辑图及硬件设计说明4五、主要子程序框图及其设计说明7六、源程序清单(详细注释).14七、调试记录及调试结果25八、系统实现功能与操作说明26九、课程设计总结27十、参考文献28一、 设计任务基于在一个学期内对单片机原理及接口技术以及软件Keilc51汇编语言软件的学习及应用,在课程设计期间通过一个微机应用系统的设计与调试过程,运用微机原理及接口技术课程所学的知识,在设计中加以实践,达到理解、巩固和发展所学内容的目标。通过系统构造、流程设计、编程与调试的过程,掌握分析与解决实际问题的方法与手段
2、,提高系统设计、程序编码与调试方面的实际动手能力,作为从事工程技术工作的一次系统训练。本次课程设计的主要任务是完成数字电子时钟的设计和实现,其主要功能如下:1、 于微机系统上实现时间的正常显示;2、 实现时间的正常调节;3、 实现定时并做到可调,并在预定时间到达时进行报警并且实现可控;4、 整点报时;5、 实现年、月、日的正常显示,并做到年、月、日的可调;本次设计还应注意一下几点事项:1,、对微机系统中的51单片机的内部存储器要进行合理的、有条理的安排和使用,如果没有进行合理安排在设计的过程中,有些相关的内部存储器中存放的数据会出现冲突,导致设计的结果不正常,如:数码管显示不正常出现乱码或频闪
3、跳动等问题;2、对单片机开发系统的硬件在运用时所出现的问题要有更清楚的认识和了解,并且运用程序来防止和减少问题的出现从而影响设计的可行性,如按键部分的抖动问题,在本次设计当中,采用延时的方法来防止按键按下所产生的抖动问题。二、 总体方案设计与方案可行性说明 本次方案的设计以单片机中的定时为主,分别实现时、分、秒、时、年、月、日上的显示和正常进位,在此基础上,总体方案可分为以下四个功能模块:模块一:计时功能模块,以微机开发系统中51单片机的定时功能为主,本次设计采用的计时方式为方式2,并且采用中断方式进行一秒计时,由于51单片机的功能特性的限制,计时的方案由采用100ms计时并且在这个基础上连续
4、循环10次进行秒钟计时,在秒的基础上再分别进行其他时间单位的转化,如此逐渐递进实现总体时间计时的实现。时进制采用24小时进制,年份显示只能实现099之间的显示。模块二:显示功能模块,主要以微机开发系统中的七段数码管实现,显示的主要格式为“时/年分/月秒/日”,其中,年、月、日的显示由微机开发系统中的按键实现切换。模块三:闹钟功能模块:以蜂鸣器的蜂鸣为标志,蜂鸣器工作则表示预定时间到达。闹钟的设定由按键开关实现,闹钟的开关有拨键开关控制。模块四:控制功能模块:主要以微机开发系统 中的按键和拨键开关实现,按键开关主要用作时间设置,日期设置和闹钟设置以及对时间和日期的显示的转换。拨键开关主要用来实现
5、闹钟的开关设置。在按键开关的防抖动处理上,以在程序中进行10ms的延时来进行处理。三、 总框图及总体软件设计说明程序总体框图:开始堆栈初始化:60h年月日暂存地址初始化:3032h秒分时暂存地址初始化:1012h预定时间地址始化:2022h计时设置:方式2 100ms计时1 图 1调用段码转化子程序调用显示子程序调用时间调整子程序调用闹钟警报子程序按键2是否按下按键3是否按下1年月日显示闹钟调整NNYY等待中断按键4是否按下NNY 图 2 总体软件设计说明:在软件设计即程序的编程编程方面,如面的设计框图所示,本次课程设计在程序编写的同时已经将51单片机中的内部存储器进行了一定的规划,其中101
6、2h作为计时方面的暂存器,分别存放秒、分、时上面的内容;2022h上的内容分别存放闹钟上的秒、分、时的内容(20h上的内容为秒,在程序中没有特别定义初值);3032h上的内容为日、月、年上的内容;7077h为显示缓冲区,60h为堆栈的首地址。在计时开始时各存储器上的内容会随着程序的运行而改变,所以只要对各存储器上的内容进行调用和显示就可以实现时间显示,闹钟显示以及日期的显示。由于数码管的显示特点,在进行调用显示之前,须将各存储器的内容进行转化,即数据的高低位分离,高四位和第四位的数值分别存放在不同的显示缓冲区内,进而进行显示调用。 四、 接口电路逻辑图及硬件设计说明 接口电路逻辑图 主机板图3
7、 8255与89S51的连接图4 I2C总线、温度传感器与扬声器的连接图5 键盘与数码管利用8255并行控制开关量图6 拨动开关、按钮与发光二极管的控制本次课程设计的硬件系统主要器件有:89c51单片机,82c55芯片,8个数码管,按键开关,拨键开关,发光二极管,蜂鸣器,以及其他相关器件。本系统中,89c51与两片82c55相连,51单片机程序的运行控制82c55的各端口输入输出、电平的高低进行控制以便更有效地对数码管、发光二极管、开关以及其他外部电路器件进行更有效和合理的控制。如上图所示的各功能模块,在本次设计中主要利用到键盘与数码管以及拨动开关,按键开关控制部分。第一片8255(连接发光二
8、极管与开关)的端口取为PA口:FD00H,PB口:FD01H,PC口:FD02H,控制口:FD03H。控制字应使得PA口输出,PB、PC口输入,为8BH。第二片8255(连接数码管)的端口地址取为FE00HFE03H,为用PC口控制键盘,控制字取为81H.PA口用于送字段码,PB口用于送字位码。五、 主要子程序框图及其设计说明1、 中断子程序(JISHI):开始R20秒位加1(10h)10h=?60重新载入计时初值R2-1=?0 秒位清0分位加1(11h)11h=?60分位清0时位加1(12h) 12h=?24 时位清0调用RIQI子程序返回NNNYYY所利用资源:内部寄存器R0 R2内部存储
9、器 10h12h所调用子程序:RIQI 图 72、 日历子程序(RIQI):开始日位加1(30h)进入月份判断是否为12月是否为闰年年位除于4是否有余数4、6、9、11月30h(日位)=?301、3、5、7、8、10、12月30h(日位)=?3130h=?2830h=?29YNY月位(31h)加1,日位(30h)为1年位(32h)加1,月位(31h)日位(30h)为1NY月位(31h)加1,日位(30h)为1月位(31h)加1,日位(30h)为1Y返回NNYN所利用资源:内部寄存器R0 R1内部存储器 30h32h 图 83、调时子程序(TIAO):分位(11h)加111h是否为60调用断码转
10、化子程序调用显示子程序开始按键0是否按下按键1是否按下时位(12h)加112h是否为24时位(12h)清0或分位(11h)清0返回YYYNNN 图 9所利用资源:内部寄存器R0 A内部存储器 10h12h 25h所调用子程序:CHANGE DISP4、闹钟设定子程序(DING):开始调用断码转化子程序调用显示子程序按键0是否按下按键1是否按下按键4是否按下预定分位(21h)加1,21h是否为24时位(12h)清0或分位(11h)清0预定时位(22h)加1,22h是否为24返回YYYNNN 图 10所利用资源:内部寄存器R0 A内部存储器 20h22h 25h所调用子程序:CHANGE DISP
11、5、日期显示子程序(RILI)按键0是否按下按键4是否按下按键1是否按下按键2是否按下调用断码转化子程序调用显示子程序开始日位(30h)加1月位(31h)加1年位(32h)加1返回NNNNYYYY 图 11所利用资源:内部寄存器R0 R2内部存储器 30h32h 25h所调用子程序:CHANGE DISP 6、警报子程序(WARN):开始P3.2清0蜂鸣器工作预定时位(22h)与实际时位(12h) 是否相等预定分位(21h)与实际分位(11h) 是否相等拨键7是否拨动P3.2置1关闭蜂鸣器返回NNYYNY 图 12所利用资源:内部寄存器R0 A内部存储器 20h22h 25h 10h12h7、
12、断码转化子程序开始设置指针R0指向(10h,20h,30h)R1=70hR7=3A=R0 B=10 A/BR1=A R1加1R1=B R1加1R1=10(存“断码) R1加1 R7-1=?0返回NY 图 13所利用资源:内部寄存器R0 R1 R7 A B内部存储器 70h77h 25h六、 源程序清单(详细注释)ORG 0000H LCALL DELAY LJMP MAIN ORG 000BH LJMP JISHI ORG 0100HMAIN: MOV SP,#60H ;堆栈首地址设置 MOV R2,#10 : 装入中断次数 MOV 30H,#27 ; (日) 日期暂存地址初始化 MOV 31
13、H,#2 ; (月) MOV 32H,#00 ; (年) MOV 20H,#0 ; (秒) 预定时间暂存地址初始化 MOV 21H,#58 ; (分) MOV 22H,#9 ; (时) MOV 10H,#0 ; (秒) 实际时间暂存地址初始化 MOV 11H,#58 ; (分) MOV 12H,#23 ; (时) KAISHI:MOV TMOD,#01H ; 选择T0为方式一计时 SETB ET0 ; 允许T0申请中断 SETB EA ; 总中断允许 MOV TL0,#0B0H ; 初始值设定 MOV TH0,#3CH SETB TR0 ; 开始计时HERE: LCALL CHANGE ; 调
14、用断码转化子程序 LCALL DISP : 调用显示子程序 LCALL TIAO ; 调用调时子程序 LCALL WARN ; 调用警报子程序 MOV DPTR,#0FD03H ; 8255初始化 MOV A,#8BH MOVX DPTR,A MOV DPTR,#0FD01H MOVX A,DPTR JNB ACC.2,LPP ;判断按键2是否按下,按下转移 JNB ACC.3,LPP1 ;判断按键3是否按下,按下转移 LJMP HERE ;等待中断 LPP: LCALL DELAY1 ;延时10ms,用于按键防抖动 LCALL DING ;调用定时子程序 LJMP HERE ; 等待中断LP
15、P1: LCALL DELAY1 ; 延时10ms,用于按键防抖动 LCALL RILI ; 调用日历显示子程序 LJMP HERE ; 等待中断*日历显示子程序RILI: PUSH PSW ; 断点地址保护 PUSH AccYEAR: MOV 25H,#30H ; 设置断码转化内容首地址 LCALL CHANGE ; 调用断码转化子程序 LCALL DISP ; 调用显示子程序 MOV DPTR,#0FD03H ; 8255初始化 MOV A,#8BH MOVX DPTR,A MOV DPTR,#0FD01H MOVX A,DPTR JNB ACC.0,SYEAR ; 判断按键0是否按下,按
16、下转移 JNB ACC.1,SMON ; 判断按键1是否按下,按下转移 JNB ACC.2,SDAY ; 判断按键2是否按下,按下转移 JNB ACC.4,LOVER ; 判断按键4是否按下,按下转移 LJMP YEARSYEAR: LCALL DELAY1 ;年份调节 MOV R0,#32H INC 32H CJNE R0,#100,YEAR MOV 32H,#0 LJMP YEARSMON: LCALL DELAY1 ; 月份调节 MOV R0,#31H INC 31H CJNE R0,#13,YEAR MOV 31H,#01 LJMP YEARSDAY: LCALL DELAY1 ; 日
17、期调节 MOV R0,#30H INC 30H CJNE R0,#31,YEAR MOV 30H,#01 LJMP YEARLOVER :POP Acc POP PSW RET*警报子程序WARN: PUSH PSW ; 断点地址保护 PUSH Acc MOV A,11H CJNE A,21H, OVER2; 预定时间与实际时间小时部分比较,不相等转移 MOV A,12H CJNE A,22H, OVER2; 预定时间与实际时间分钟部分比较,不相等转移 CLR P3.2 ; 蜂鸣器工作 MOV DPTR,#0FD03H ;8255初始化 MOV A,#8BH MOVX DPTR,A MOV D
18、PTR,#0FD02H MOVX A,DPTR MOV DPTR,#0FD00H MOVX DPTR,A JNB ACC.7, OVER2 ; 拨键开关是否拨动,拨动则转移 CLR P3.2 SJMP OVER2 OVER2: POP Acc POP PSW RET*定时设置子程序DING: PUSH PSW ;断点地址保护 PUSH AccSHEZHI1: MOV 25H,#20H ;设置断码转化内容首地址LCALL CHANGE ;调用断码转化子程序 LCALL DISP ;调用显示子程序 MOV DPTR,#0FD03H ;8255 初始化 MOV A,#8BH MOVX DPTR,A
19、MOV DPTR,#0FD01H MOVX A,DPTR JNB ACC.1,DINGF ;按键1是否按下,按下转移 JNB ACC.0,DINGS ;按键0是否按下,按下转移 JNB ACC.4,OVER1 ;按键4是否按下,按下转移 LJMP SHEZHI1DINGF: LCALL DELAY1 ;预定时间分钟部分调整 MOV R0,#21H INC 21H CJNE R0,#60,SHEZHI1 MOV 21H,#0 LJMP SHEZHI1DINGS: LCALL DELAY1 ;预定时间小时部分调整 MOV R0,#22H INC 22H CJNE R0,#24,SHEZHI1 MO
20、V 22H,#0 LJMP SHEZHI1OVER1: LCALL DELAY1 POP Acc POP PSW RET日期子程序RIQI: PUSH PSW ;断点地址保护 PUSH Acc MOV R0,#31H MOV R1,#30H LOOP: INC 30H ;日期部分自加1月份判断LOOP1:CJNE R0,#01,LOOP2 ;判断是否是一月,不是转移 LJMP LP1LOOP2:CJNE R0,#02,LOOP3 ;判断是否是二月,不是转移 LJMP LP2LOOP3:CJNE R0,#03,LOOP4 ;判断是否是三月,不是转移 LJMP LP1LOOP4:CJNE R0,#
21、04,LOOP5 ;判断是否是四月,不是转移 LJMP LP3LOOP5:CJNE R0,#05,LOOP6 ;判断是否是五月,不是转移 LJMP LP1LOOP6:CJNE R0,#06,LOOP7 ;判断是否是六月,不是转移 LJMP LP3LOOP7:CJNE R0,#07,LOOP8 ;判断是否是七月,不是转移 LJMP LP1LOOP8:CJNE R0,#08,LOOP9 ;判断是否是八月,不是转移 LJMP LP1LOOP9:CJNE R0,#09,LOOP10 ;判断是否是九月,不是转移 LJMP LP3LOOP10:CJNE R0,#10,LOOP11 ;判断是否是十月,不是转
22、移 LJMP LP1LOOP11:CJNE R0,#11,LOOP12 ;判断是否是十一月,不是转移 LJMP LP3LOOP12:CJNE R0,#12,LOOP1 ;判断是否是十二月,不是转移 LJMP LP1LP1: CJNE R1,#32,ROVER ;大月天数判断(有31天的月份) CJNE R0,#12,LP12 MOV 30H,#01 MOV 31H,#01 INC 32H LJMP ROVERLP12: INC 31H MOV 30H,#01 LJMP ROVERLP2: MOV A,32H ;闰年判断 (二月的29天或28天的判断) MOV B,#4 DIV AB MOV A
23、,B CJNE A,#0,KA1 CJNE R1,#30,ROVER MOV 30H,#01 INC 31H LJMP ROVERKA1 :CJNE R1,#29,ROVER MOV 30H,#01 INC 31H LJMP ROVERLP3: CJNE R1,#31,ROVER ;小月天数判断(有30天的月份) MOV 30H,#01 INC 31HROVER:POP Acc POP PSW RET*时间调整子程序 TIAO: PUSH PSW ;断点地址保护 PUSH Acc MOV 25H,#10H ;设置断码转化内容首地址SHEZHI:LCALL CHANGE ;调用断码转化子程序 L
24、CALL DISP ;调用显示子程序 MOV DPTR,#0FD03H ;8255初始化 MOV A,#8BH MOVX DPTR,A MOV DPTR,#0FD01H MOVX A,DPTR JNB ACC.1,TIAOF ;按键1是否按下,按下转移 JNB ACC.0,TIAOS ;按键0是否按下,按下转移 LJMP TOVERTIAOF: LCALL DELAY1 ;实际时间分钟部分调节 MOV R0,#11H INC 11H CJNE R0,#60,SHEZHI MOV 11H,#0 LJMP TOVERTIAOS: LCALL DELAY1 ;实际时间小时部分调节 MOV R0,#1
25、2H INC 12H CJNE R0,#24,SHEZHI MOV 12H,#0TOVER: POP Acc POP PSW RET*中断子程序JISHI: PUSH PSW ;断点地址保护 PUSH Acc MOV TL0,#0B0H ;重载计数初始值 MOV TH0,#3CH DJNZ R2,JLOOP3 ;循环十次 MOV R2,#10 ;重新装入中断次数 INC 10H ;十次过后秒位自加1 MOV R0,#10H CJNE R0,#60,JLOOP3 ;是否进行60次 没有转移 MOV 10H,#0 ;60次后秒位清0 INC 11H ;分位自加1 INC R0 ;间接寻址位自加1
26、CJNE R0,#60,JLOOP3 ;是否进行60次 没有转移 MOV 11H,#0 ;60次后分位清0 INC 12H ;小时位自加1 INC R0 ;间接地址位自加1 CLR P3.2 ; 整点警报 CJNE R0,#24,JLOOP3 ;是否进行24次 MOV 12H,#0 ;24次后小时位清0 LCALL RIQI ;调用日期子程序JLOOP3:MOV 25H,#10H ;实际时间首地址转存 POP Acc POP PSW RETI*断码转化子程序CHANGE:PUSH PSW ;断点地址保护 PUSH Acc MOV R1,#70H MOV R0,25H ;选择需要转化的内容 MO
27、V R7,#03HCLOOP2: MOV A,R0 ;间接寻址指针存入寄存器 MOV B,#10 DIV AB ;高四位与低四位分离采用除于10 MOV R1,B INC R1 MOV R1,A INC R1 MOV R1,#10H INC R1 INC R0 DJNZ R7,CLOOP2 ;R7自减是否为0,不为0转移 POP Acc POP PSW RET*显示子程序DISP: PUSH PSW PUSH Acc MOV DPTR,#0FE03H MOV A,#81H MOVX DPTR,A MOV R7,#0 MOV R0,#70H MOV R3,#01HKA2: MOV A,R0 MO
28、V DPTR,#TBL MOVC A,A+DPTR MOV DPTR,#0FE00H MOVX DPTR,A MOV DPTR,#0FE01H MOV A,R3 MOVX DPTR,A DJNZ R7,$ INC R0 MOV A,R3 RL A MOV R3,A JNB ACC.0,KA2 POP Acc POP PSW RET*延时1s子程序(系统初始化运行)DELAY:MOV R6,#20KAKA3:MOV R5,#100KAKA2:MOV R4,#250KAKA1:DJNZ R4,KAKA1 DJNZ R5,KAKA2 DJNZ R6,KAKA3 RET*延时80ms子程序(用于按键开
29、关的防抖动)DELAY1:MOV R5,#200KAKA5 :MOV R4,#200KAKA4 :DJNZ R4,KAKA4 DJNZ R5,KAKA5 RETTBL: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0BFH END七、 调试记录及调试结果在本次课程设计的调试和修正过程中,主要出现过以下三种异常情况:第一:数码管显示秒单位的部分没有工作,整个系统的最小计数单位为分钟,经过一系列的调试和修改,发现,在调用实际时间的内存单元出现异常,没有调用秒部分的内容进行转化和显示,导致无
30、法显示秒的跳变,经过对程序的修改和51单片机的内存的重新规划和利用,可以很好的改善。第二:在秒部分的计数方面,不能正常的显示,主要异常表现为,计时不均匀长短不一,时停时走,没有一个合理而正常的标准时间,通过对标准时间的校对可以发现,平均每过一分钟会产生30次的停滞和30次的过快跳变,导致的时间偏差为每分钟20秒左右,在通过对中断子程序和段码转化子程序的逐条执行和调试发现,中断子程序与段码转化子程序的一个寄存器(R7工作寄存器)发生重复运用而产生的数值发生覆盖导致计数和计时的异常,从而出现以上异常。解决异常的方法与第一种异常的方法相同:对51单片机的内部寄存器进行重新规划和使用,达到不重复使用或
31、者使用前初始化。经过改进和修改,秒部分的计时达到正常,不会产生停滞和过快跳变,平均每分钟的计时和标准时间没有太大误差,基本认为与标准时间同步。第三:按键抖动消除,由于按键输入的固有特点,在每次输入的时候不能产生标准的高低电平,而是呈现一系列干扰脉冲,导致系统无法正常识别,对此,本次课程设计采用软件延时来消除抖动的影响,当延时太短(如10毫秒到50毫秒范围)则会导致防抖动效果不佳,调节时会跳变频繁和数码管频繁闪动:如果延时太长(如300毫秒以上),则会导致数码管显示在调节时的有熄灭的趋势,造成在时间调节方面的不方便。经过多次的反复测试和试验,延时控制在80毫秒左右所表现的效果最佳。因此,在本次设
32、计的所有按键控制程序中,都以80毫秒为延时标准!综上所诉,就是本次课程设计所出现的主要异常特点,其中以计时功能模块出现的异常为主,常表现为数码管显示紊乱和时间的非正常走动,解决异常原因的主要方法基本为调整合理单片机内的寄存器运用和分配。八、 系统实现功能与操作说明 根据设计任务,本次课程设计以51单片机为基础,通过汇编语言进行程序编写实现时间的显示和可调,另外还有闹钟、日期显示以及整点报时功能。按键开关K0K4、拨键开关S7构成系统的控制模块,8个数码管构成系统显示模块。控制模块主要用来调节时间、日期、闹钟,数码管主要实现时间、日期、闹钟的显示。操作说明: 按键开关K0:调节实际时间的小时部分
33、 按键开关K1:调节实际时间的分钟部分 按键开关K2:进入闹钟时间设置, K0设置闹钟小时部分,K1控制闹钟分钟部分,拨键开关S7设置闹钟的开关与否 按键开关K3:进入日期显示及调节 K0设置日期年份部分, K1设置日期月份部分, K2设置日期具体日期部分, 按键开关K4:跳出当前设定进入实际时间显示本系统未进行具体操作的时候的显示内容为具体的实际时间,当按下相应按键开关的时候进入相应的调节设置类别,每次调节完毕后应该跳出设置(按下按键开关K4)进入实际时间显示,才能进行下一项调节设置。本系统在两种状态下会出现报警功能,一种是到达预定时间并且拨动开关S7开启就会产生蜂鸣效果,报警持续时间为一分钟,期间如果拨键开关S7关闭则报警结束;另一种状态为整点时刻,报警持续时间为2秒。九、 课程设计总结 本次课程设计为期两周,在学习和调试的两周期间,本人对51单片机和汇编语言程序有了更进一部分的了解,特别是在程序编写的同时更应该注意和分配单片机内有限的寄存器和内部存储器。对这两项硬件资源进行分配主要是为让程序在运行当中能够正常的进行调用并进行执行,以便程序在运行之后能够达到预