1、湖州师范学院求真学院课程设计总结报告课程名称 单片机应用系统设计 设计题目 基于STC89C51的数字电子钟设计 专 业 电子科学与技术 班 级 080835 姓 名 张静 学 号 12 指导教师 李祖欣 吴小红 报告成绩 求真学院信息与工程系二一一年六月一日21单片机应用系统设计课程设计任务书一、课题名称基于STC89C52的数字电子钟设计二、设计任务 基本任务:1. 采用STC单片机和键盘,设置4位LED数码管显示的电子时钟;2. 上电时,显示12:00并且“:”间隔500ms闪烁,其中“:”代表秒功能;3. 具有闹钟设定、闹铃功能。4. 通过键盘可修改时间。发挥任务:1实现时钟整点“嘟”
2、声提示功能;2实现秒表功能。秒表具有计时开始,计时结束,计时复位等功能。三、设计报告撰写规范单片微机应用系统设计总结报告正文,主要含以下内容(硬件、软件各部分内容也可组合起来进行撰写说明):1. 系统总体设计方案(画出系统原理框图、方案的论证与比较等内容);2. 硬件系统分析与设计(各模块或单元电路的设计、工作原理阐述、参数计算、元器件选择、完整的系统电路图、系统所需的元器件清单。等内容);3. 软件系统分析与设计(各功能模块的程序设计流程图与说明、软件系统设计、软件抗干扰措施、完整的程序等内容);4. 系统仿真调试与参数测量(使用仪器仪表、故障排除、电路硬件和软件调试的方法和技巧、指标测试的
3、参数和波形、测量误差分析);5. 总结(本课题核心内容及使用价值、电路设计、软件设计的特点和选择方案的优缺点、改进方向和意见等);6. 按统一格式列出主要参考文献。基于STC89C51的数字电子钟设计课程设计总结报告一、 系统总体方案本次设计时钟电路,使用了AT89c51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂, 使用键盘上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用汇编程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、单片机芯片、扬声器、显示屏即可满足设计要求。如图1-1为数字钟总体设计框图。本设计的软件程序包括主程
4、序如图1-2、中断子程序如图1-3、打铃子程序、时钟显示子程序、查询时间表切换程序和延时子程序等等。另外,由于电路中有四个按键,还另外设计了防抖动程序来防止干扰本设计的硬件包括89c51芯片,+5V电源,共阳八段数码管4个,三极管,电阻若干,导线若干单 片 机扬声器键盘显示屏芯片图1-1 数字钟总体设计框图 二、单片机概述1、 AT89c51单片机l 单片机的发展及应用单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。单片机由运算器、控制器、存储器、输入输出设备构成单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只
5、读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。工业方面,仪器仪表方面,消费类电子产品,通信方面,武器装备等。l 单片机的引脚图1-4 单片机的引脚40个引脚按功能大致可分为4类:电源、时钟、控制和I/O引脚。 (1)电源: VCC - 芯片电源,接+5V; VSS - 接地端; (2)时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 (3)控制线:控制线共有4根, A
6、LE/PROG:地址锁存允许/片内EPROM编程脉冲 ALE功能:用来锁存P0口送出的低8位地址 PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 PSEN:外ROM读选通信号。 RST/VPD:复位/备用电源。 RST(Reset)功能:复位信号输入端。 VPD功能:在Vcc掉电情况下,接备用电源。 EA/Vpp:内外ROM选择/片内EPROM编程电源。 EA功能:内外ROM选择端。 Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。 (4)I/O线 l 单片机的应用注意事项二、 键盘电路(一)键盘扫描概述此次用到四个键,即K8,K
7、9,K10,K11键。K8和K9键分别是加一和减一键,主要是对时钟和闹钟操作。K11键是对时钟的模式切换,在这里一共有5种模式,当r0=1,对时钟的分加、减一;当R0=2时,对时钟的时加、减一;当R0=3时,对闹钟的分加。减一;当R0=4时,对闹钟的时加、减一;当R0=5时,切换到秒表功能;当R0=6时,返回实时时钟显示。K10键是对秒表的模式切换,当R6=1时,关外部中断一;当R6=2时,开外部中断一,开始秒表计时;当R6=3时,关外部中断一,暂停秒表计时。(二)键盘电路图(三)工作原理先对芯片片。P2.4口置低电平,即表示其接地。再判断P2.3是否为低电平,若为则R0加一。反之,判断P2.
8、0是否为低电平,若为则判断其属于哪一个模式,在进行加一操作。反之,判断P2.1是否为低电平,若为则判断其属于哪一个模式,在进行减一操作。反之,判断P2.2是否为低电平,若为则判断其属于哪一个模式,进行秒表功能。反之,返回。(四)硬件电路注意的问题在编程时要注意键盘的去抖,所以在判断一个键盘的按下之后,进行一段延时。(五)程序流程图:如图1-5三、显示电路(一)显示电路概述 我运用四个共阳极LED显示器,且为8段。并且将所有位的段码线的相应段并联起来,由一个8为I/O口控制,我用的是P0口。而且各位的共阳极分别有相应的I/O线控制,形成各位的分时选通,这里我运用了P1.7,P1.6,P1.5,P
9、1.4分别作为时的十位,时的个位,分的十位和分的个位选通线。且当其端口为低电平时,改位选通。(二)用到的电路图(三)用到动态扫描工作原理时间显示是先分个位计算显示,然后是分十位计算显示,再是时个位计算显示,最后是时十位计算显示。当显示分个位,置P1.4为低电平;当显示分十位,置P1.5为低电平;当显示分时个位,置P1.6为低电平;当显示时十位,置P1.7为低电平。(四)硬件电路注意的问题 要注意你运用的LED显示器,是共阳极的还是共阴极的,在设置TAB表。(五)程序流程:如图1-6(六)、编程注意点 设置TAB表时,要注意有两个LED显示器是反过来的,它的TAB表要根据实际情况自己计算而得。否
10、则显示器的显示值就是错误的。四、蜂鸣器 (一)蜂鸣器电路概述 蜂鸣器电路,由P3.2口控制,当定时的闹钟时间和实时时钟显示时间相同时,则置P3.2口为低电平。此时三极管导通,蜂鸣器响。 (二)蜂鸣器电路五、系统调试(一) 所需软件: PL2303驱动软件包; 各类文本编辑器软件,如Eidt,记事本等,编辑汇编语言源程序*.ASM; 集成环境 WAVE6000 软件:将汇编语言源程序编译成*.hex 文件(也可直接在此环境下编辑汇编语言源程序*.ASM); 官方网站提供的STC-ISP软件(http/www.MCU-M):将汇编语言源程序编译成的*.hex文件在线下载到STC单片机中(二) 其调
11、试技巧与方法:A测试与计算机的通信是否正常,即能否正常下载; B测试LED和LED数码管各段是否正常; C测试蜂鸣器是否正常发声; D测试继电器是否正常吸合与释放;(三) 在调试过程中的问题:在刚开始程序下载时,串口总是找不到,我们通过修改COM.来下载程序。下载好后,发现数码管没有反应,我们通过修改程序来解决这个问题。还有有时按键没有反应,后来发现是接触不好,我们在调试时,把板子放到桌面上来解决这个问题。六、总结 经过两周的努力,在指导老师的帮助下,终于完成了该电子时钟的课程设计,在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。此次的数字钟设计
12、重在于编程,通过这次的设计实验更进一步地增强了实验的动手能力。在设计过程中遇到的问题也是常有发生的,我们能做的就是想办法解决问题。刚开始时,程序编好后,下载到实验板中模块不能够切换显示,我想了很多方法。后来在老师的提醒下,我才发现应该对输入的值进行拆分,即拆分成个位和十位。再送入相应的程序中显示。最后,在编译秒表功能时,无法实现,后来在老师的指导下,重新添加一个外部中断寄存器,最终解决了这个问题。这次的课程设计终于完成了,在此次课程设计中我们获益非浅,其过程中遇到了很多编程问题和操作问题,但最终我们克服了。附录一:源程序清单SECOND EQU 30H ; 定义计数存储单元MBUF EQU 3
13、1H ; 定义分计数存储单元HBUF EQU 32H ; 定义时计数存储单元MBUF0 EQU 33H ; 定义分个位计数存储单元MBUF1 EQU 34H ; 定义分十位计数存储单元HBUF0 EQU 35H ; 定义时个位计数存储单元HBUF1 EQU 36H ; 定义时十位计数存储单元DP BIT 24H.3 ; 定义半秒闪烁位单元naos equ 40h ; 定义闹钟分计数存储单元naof equ 41h ; 定义闹钟时计数存储单元nmBUF0 EQU 42H ; 定义闹钟分个位计数存储单元nmBUF1 EQU 43H ; 定义闹钟分十位计数存储单元nHBUF0 EQU 44H ; 定
14、义闹钟时个位计数存储单元nHBUF1 EQU 45H ; 定义闹钟时十位计数存储单元NMBUF01 equ 70h ; 定义秒时个位计数存储单元NMBUF11 equ 71h ; 定义秒时十位计数存储单元miao equ 72h ; 定义秒毫秒计数存储单元nnhbuf equ 73h ;定义秒计数存储单元nnhbuf0 equ 74h ; 定义秒时个位计数存储单元nnhbuf1 equ 75h ; 定义秒时十位计数存储单元ORG 0000HLJMP MAINORG 000BHljmp itoporg 001Bhljmp itop1ORG 0100H;主程序; MAIN: MOV TL0,#0b
15、0H MOV TH0,#3cH mov tmod,#11h mov tl1,#0f0h mov th1,#0d8h setb et0 setb et1 setb ea MOV R2,#20 mov r0,#00 mov r6,#00h MOV MBUF0,#0 MOV MBUF1,#0 MOV HBUF0,#2 MOV HBUF1,#1 MOV nMBUF0,#0 MOV nMBUF1,#0 MOV nHBUF0,#0 MOV nHBUF1,#0 MOV MBUF,#00H MOV HBUF,#12H MOV naof,#00H MOV naos,#00H SETB TR0 LOOP: NOP
16、 acall key 调用键盘扫描程序 ACALL DISP 调用显示程序 lcall bb 调用闹钟程序 AJMP LOOP ; ;中断程序; ; itop:PUSH ACC ;中断1 MOV TL0,#0b0H MOV TH0,#3cH DJNZ R2, INT03 MOV R2,#20 中断20次,每次中断时间50ms CPL DP DJNZ SECOND,OUTT0 秒减完不为0,则跳到outto, MOV SECOND,#60 对 秒重新赋初值,60 ACALL ADD1 调用add1 AJMP OUTT0INT03:MOV A,R2 CJNE A,#20,OUTT0 CPL DP
17、OUTT0:POP ACC RETIitop1:PUSH ACC ;中断2 mov tl1,#0f0h mov th1,#0d8h ACALL ADD2 AJMP OUTT1 OUTT1: POP ACC RETIADD1: MOV A,mbuf ; 分十进制加 1 子程序, ADD A,#01 DA A 十进制转换为bcd码 MOV mbuf,A CJNE A,#60h,ADD13 ;判断分十位是否到六十,若未到 60,跳转到 ADD13 Clr p3.2 Lcall delay2 Setb p3.2 MOV MBUF0,#0 MOV MBUF1,#0 MOV MBUF,#0 MOV A,H
18、BUF ADD A,#01 ;时十进制加一 DA A MOV HBUF,AADD13: MOV A,MBUF ANL A,#0FH ; 分值拆成分个位和分十位 MOV MBUF0,A MOV A,MBUF SWAP A ;高四位与第四位转换 ANL A,#0FH MOV MBUF1,A MOV A,HBUF CJNE A,#24H,ADD14 ;判断时是否到24,若未到 24,跳转到 ADD14 MOV HBUF0,#0 MOV HBUF1,#0 MOV HBUF,#0ADD14: MOV A,HBUF ANL A,#0FH ; 时值拆成时个位和时十位 MOV HBUF0,A MOV A,HB
19、UF SWAP A ANL A,#0FH MOV HBUF1,A RETADD131: MOV A,NAOF ANL A,#0FH ; 闹钟分值拆成分个位和分十位 MOV NMBUF0,A MOV A,NAOF SWAP A ;高四位与第四位转换 ANL A,#0FH MOV NMBUF1,A retADD141: MOV A,NAOS ANL A,#0FH ; 闹钟时值拆成时个位和时十位 MOV NHBUF0,A MOV A,NAOS SWAP A ANL A,#0FH MOV NHBUF1,A RET ADD2: MOV A,MIAO ; 毫秒十进制加 1 子程序, ADD A,#01 D
20、A A MOV MIAO,A CJNE A,#100h,ADD15 ;判断毫秒是否到100,若未到 100,跳转到 ADD15 MOV NMBUF01,#0 MOV NMBUF11,#0 MOV MIAO,#0 MOV A,NNHBUF ADD A,#01 ;秒十进制加一 DA A MOV NNHBUF,A ADD15:MOV A,miao ANL A,#0FH ; 毫秒拆成个位和十位 MOV nMBUF01,A MOV A,miao SWAP A ;高四位与第四位转换 ANL A,#0FH MOV nMBUF11,A MOV A,nnHBUF CJNE A,#60H,ADD16 ;判断时是秒
21、否到60,若未到 60,跳转到 ADD16 MOV nnHBUF0,#0 MOV nnHBUF1,#0 MOV nnHBUF,#0ADD16:MOV A,nnHBUF ANL A,#0FH ; 秒拆成时个位和时十位 MOV nnHBUF0,A MOV A,nnHBUF SWAP A ANL A,#0FH MOV nnHBUF1,A RET ; ;时钟显示程序; ; DISP: CJNE R0,#00H ,L1 LCALL DISP2 L1:CJNE R0,#01H ,L2 lcall add13 将时拆成个位与十位 LCALL DISP4 ;调用时钟时显示 L2:CJNE R0,#02H, L
22、3 lcall add14 LCALL NEXT ;调用时钟分显示 L3:CJNE R0,#03H ,L4 lcall add131 LCALL DISP41 ;调用闹钟时钟分显示 L4:CJNE R0,#04H,l5 lcall add141 LCALL NEXT1 l5:cjne r0,#05h,exit lcall disp3 exit: retDISP2: MOV DPTR,#TAB2 MOV A,MBUF0 ACALL DSPM0 MOV DPTR,#TAB2 MOV A,MBUF1 ACALL DSPM1 MOV DPTR,#TAB1 MOV A,HBUF0 ACALL DSPH0
23、 MOV DPTR,#TAB1 MOV A,HBUF1 ACALL DSPH1 ; 调用时十位显示子程序 RETDISP3:MOV DPTR,#TAB2 MOV A,nMBUF01 ACALL DSPM0 MOV DPTR,#TAB2 MOV A,nMBUF11 ACALL DSPM1 MOV DPTR,#TAB1 MOV A,nnHBUF0 ACALL DSPH0 MOV DPTR,#TAB1 MOV A,nnHBUF1 ACALL DSPH1 ; 调用时十位显示子程序 RETDISP4:MOV DPTR,#TAB2 ;修改时钟分 MOV A,MBUF0 ACALL DSPM0 MOV DP
24、TR,#TAB2 MOV A,MBUF1 ACALL DSPM1 RETNEXT: MOV DPTR,#TAB1 ;修改时钟时 MOV A,HBUF0 ACALL DSPH0 MOV DPTR,#TAB1 MOV A,HBUF1 ACALL DSPH1 RET DISP41:MOV DPTR,#TAB2 ;修改闹钟分 MOV A,NMBUF0 ACALL DSPM0 MOV DPTR,#TAB2 MOV A,NMBUF1 ACALL DSPM1 RETNEXT1: MOV DPTR,#TAB1 ;修改闹钟时 MOV A,NHBUF0 ACALL DSPH0 MOV DPTR,#TAB1 MOV
25、 A,NHBUF1 ACALL DSPH1 RET DSPM0: MOVC A, A+DPTR ; 分个位显示子程序 MOV P0,A CLR P1.4 ACALL DY1MS SETB P1.4 RET DSPM1: MOVC A, A+DPTR ; 分十位显示子程序 MOV P0,A CLR P1.5 ACALL DY1MS SETB P1.5 RETDSPH0: MOVC A, A+DPTR ; 时个位显示子程 MOV C,DP MOV ACC.7,C MOV P0,A CLR P1.6 ACALL DY1MS SETB P1.6 RETdSPH1: MOVC A, A+DPTR ; 时
26、十位显示子程序 MOV P0,A CLR P1.7 ACALL DY1MS SETB P1.7 RET ; ;时钟调试程序加1; ; key: clr p2.4 jb p2.3,key2 lcall DISP2 jb p2.3,key2 wait1:lcall DISP2 jnb p2.3,WAIT1 inc r0 cjne r0,#06,KEY_EXIT MOV R0,#0 LJMP KEY_EXIT key2:jb p2.0,key3 lcall DISP2 jb p2.0,key3 wait4:lcall DISP2 jnb p2.0,WAIT4 cjne r0,#01h,loop1 M
27、OV A,MBUF ADD A,#01 ; 分十进制加 1 子程序, DA A MOV MBUF,A CJNE A,#60h,KEY_EXIT ;判断分十位是否到六十,若未到 60,跳转到 ADD13 MOV MBUF0,#0 MOV MBUF1,#0 MOV MBUF,#0 对分单元赋初值0 LJMP KEY_EXIT loop1:cjne r0,#02h,loop2 MOV A,HBUF ADD A,#01 ; 时十进制加 1 子程序 DA A MOV HBUF,A CJNE A,#24h,KEY_EXIT;判断分十位是否到24,若未到 24,跳转到 ADD13 MOV HBUF0,#0
28、MOV HBUF1,#0 MOV HBUF,#0 对时单元赋初值 KEY_EXIT: RET ; ;闹钟定时程序加1; ; loop2:cjne r0,#03h,loop3 MOV A,naof ADD A,#01 ; 十进制加 1 子程序, DA A MOV naof,A CJNE A,#60h,KEY_EXI ;判断分十位是否到六十,若未到 60,跳转到 ADD13 MOV nMBUF0,#0 MOV nMBUF1,#0 MOV naof,#0 对闹钟分单元赋初值 LJMP KEY_EXi LOOP3:CJNE R0,#04H,KEY_EXI MOV A,naos ; 分十进制加 1 子程
29、序, ADD A,#01 DA A MOV naos,A CJNE A,#24h,KEY_EXIT;判断分十位是否到24,若未到 24,跳转到 ADD13 MOV nHBUF0,#0 MOV nHBUF1,#0 MOV naos,#0 对闹钟时单元赋初值 KEY_EXI : ret ; ;时钟调试程序减1; ; key3: jb p2.1,KEY4 lcall disp2 jb p2.1,KEY4 wait2: lcall disp2 jnb p2.1,WAIT2 cjne r0,#01h,loop4 MOV A,MBUF ADD A,#99H ; 分十进制减 1 子程序 DA A MOV M
30、BUF,A CJNE A,#99h,KEY_EX MOV MBUF0,#9 MOV MBUF1,#5 MOV MBUF,#59h LJMP keY_EX loop4:cjne r0,#02h,loop5 MOV A,HBUF add A,#99h ; 时十进制减1 子程序 DA A MOV HBUF,A CJNE A,#99h,KEY_EX;判断分十位是否到0,若未到 0,跳转到 ADD13 MOV HBUF0,#3 MOV HBUF1,#2 MOV HBUF,#23h KEY_EX:ret ; ;闹钟定时程序减1; ; loop5:cjne r0,#03h,loop6 MOV A,naof
31、add A,#99h ; 分十进制减 1 子程序 DA A MOV naof,a CJNE A,#99h,KEY_E ;判断分十位是否到六十,若未到 60,跳转到 ADD13 MOV nMBUF0,#9 MOV nMBUF1,#5 MOV naof,#59h LJMP KEY_E LOOP6: CJNE R0,#04H,KEY_E MOV A,naos add A,#99h ; 分十进制减 1 子程序 DA A MOV naos,A CJNE A,#99h,KEY_E ;判断分十位是否到六十,若未到 60,跳转到 ADD13 MOV nhBUF0,#3 MOV nhBUF1,#2 MOV na
32、os,#23h KEY_E: retkey4: cjne r0,#05h, KEY_EXIT1 Jb p2.2,KEY_EXIT1 lcall disp2 jb p2.2,KEY_EXIT1wait8:lcall disp2 jnb p2.2,WAIT8 inc r6 cjne r6,#04,lop1 MOV R6,#0 LJMP KEY_EXIT1lop1: cjne r6,#01h,lop2 mov miao,#00h mov nnhbuf,#00h clr tr1 关外部中断t1 LJMP KEY_EXIT1lop2:cjne r6,#02h,lop3 setb tr1 开外部中断t1
33、LJMP KEY_EXIT1lop3:cjne r6,#03h,lop4 clr tr1 LJMP KEY_EXIT1lop4:cjne r6,#04h,KEY_EXIT1 mov 32h,hbuf mov 31h,mbuf KEY_EXIT1: RET; ;蜂鸣器响程序; ;BB: MOV A,MBUF CJNE A,NAOf,RES 闹钟的分单元是否等于时钟分钟单元, MOV A,HBUF cJNE A,NAOs,RES 闹钟的时单元是否等于时钟时单元 LCALL BEEP RES:RET BEEP:CLR P3.2 p3.2开 ,蜂鸣器响 MOV R6,#200DELAY:DJNZ R6,delay setb p3.2 关蜂鸣器 RET ; ;延时程序; ;