1、目录第1章 绪论1 11 课程设计目的11.2 课程设计内容11.3 课程设计要求11.4 电子时钟的简单介绍1第2章 控制系统的硬件设计42.1 单片机型号的选择22.2 89C51单片机介绍22.3 振荡电路42.4 复位电路42.5 键盘电路42.6 数码管显示工作原理52.7 整个电路原理图5第3章 控制系统的软件设计63.1 程序流程图63.2 程序设计7第4章 软件仿真8 4.1 Proteus软件介绍8 4.2 仿真结果8 第5章 心得体会10参考文献11附录12 27第1章 绪论1.1 课程设计目的:通过单片机原理与应用课程设计,掌握单片机及其扩展系统设计的方法和设计原则及相应
2、的硬件调试的方法。进一步加深单片机及其扩展系统设计和应用的理解。1.2 课程设计内容:电子计时器综合系统设计有6位数码管显示,能按照分秒进制显示时间; 能正确手动复位;有上电指示灯;1.3 课程设计要求:1)独立设计原理图及相应的硬件电路。2)针对选择的设计题目,设计系统软件。软件要做到:操作方便,实用性强,稳定可靠。3)设计说明书格式规范,层次合理,重点突出。并附上设计原理图及相应的源程序。1.4 电子计时器的简单介绍 该电子计时器由AT89C51,BUTTON,八段数码管等构成,采用晶振电路作为驱动电路,有延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时
3、,满二十四小时为一天。有两个按键分别控制小时和分钟,当按下控制分钟的按键时,分钟加一,同理按控制小时的按键时,小时加一。第2章 控制系统的硬件设计2.1 单片机型号的选择 通过对多种单片机性能的分析,最终认为AT89C51时最理想的电子时钟开发芯片。AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口
4、及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。2.2 AT89C51单片机介绍 图1 AT89C51VCC:电源GND:接地P0口:P0口为一个8位漏极开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定能够以为数据/地址的第八位。在FLASH编程时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部上拉为低电平时,P1
5、口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写1时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的原因。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高8位。在给出地址1时,它利用内部上拉优势,当对外部8位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口
6、写入1时,它们被内部上拉位高电平,并用作输入。作为输入,由于外部上拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时 ,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,次引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如果想禁止ALE的输出可在SFR8EH地址上置0.此时,ALE只有在执行MOVX
7、,MOVC指令时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置为无效。/PSEN:外部程序存储器的读选通信号,低电平有效。在由外部程序存储器取值期间,每个机器两次/PSEN有效,但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:/EA为该引脚的第一功能,即外部程序存储器访问控制允许端。当/EA为高电平时,在PC值不超过0FFFFH时,单片机读片内程序存储器(4KB)中的程序;当PC值超出时,将自动转向片外60KB程序存储器空间中的程序。当/EA引脚为低电平时,只读取外部程序存储器中的内容。VPP为该引脚的第二功能,即在对片内FLAS
8、H进行编程时,VPP引脚接入编程电压。2.3 振荡电路 本次设计采用内部振荡电路,瓷片电容采用33pf,晶振采用12MHZ。电路连接如图2所示 图2 震荡电路2.4 复位电路 单片机系统的复位电路在这里采用的是上电复位电路的形式,其中电阻R1采用10K的阻值,电容采用电容值为100u的电容。电路连接如图4所示 图3 复位电路2.5 键盘电路 图4 键盘电路2.6 数码管显示工作原理 数码管是一个把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起,即为公共商。阳极即为
9、二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便设计的,称为A、B、C、D、E、F、G、DP,其中DP是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。即,所有的A段都会连在一起,其它的段也是如此,这是最实际的用法。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在一起,共同占用8位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,早同时
10、给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。2.7 整个电路原理图图6 电路原理图第3章 控制系统的软件设计3.1 程序流程图 本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、延时程序四大模块。主程序流程图:显示数据处理SECOND加1SECOND=60吗?开始 秒按键识别成功否开中断,并允许T0中断TH0,TL0装入初值计数单元清零SECOND=0分按键识别成功否显示数据处理MINIT=0MINITE=60吗?MINITE加1时按键识别成功否HOUR加1HOUR=24吗?HOUR=03.2 程序设计 见附录第4章 软件仿真4.1 P
11、roteus软件介绍 Proteus软件是英国Labcenter electronics公司出版的EDA工具软件,是目前最好的模拟单片机外围器件的工具。可以仿真51系列、AVR、PIC等常用的MCU及其外围电路(如LCD、RAM、ROM、键盘、马达、LED、AD/DA,部分SPI器件,部分IIC器件等)。Proteus是世界上著名的EDA工具,从原理图布图、代码调试到单片机与外围设备协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件PCB设计软件和虚拟模型仿真软件三合一的设计平台。Proteus具有原理布图、PCB自动或人工布线、SPICE电路仿真
12、的功能。4.2 仿真结果图7时钟仿真图图8秒表仿真结果第5章 心得体会 课程设计是对课程的实践与总结,只要做了就会有收获。在这次设计中我加深了程序的阅读能力、程序的灵活调用、单片机的设计制作调试方法。为了能顺利的完成这次的课程设计我找了很多资料也因此知道了不少课本上没深入介绍的东西,提高了我的思维空间,拓宽了我的知识面,加深了对单片机课程的兴趣。最主要的是加强了动手的能力。遇到问题是先思考,解决不了再查资料,实在弄不出来就问老师和同学们,毕竟不耻下问是中华名族的优良美德。只有如此才能不断进步。通过这次课程设计我了解到学好一门汇编语言,最根本的应该是了解所能接触到的程序中最关键的是哪些,实际的应
13、用编写更是非常重要,所以我们一定要自己动手试一下,尝试编写程序。因为做一个旁观者事不能够学到东西的。 此外在此次设计中我对此次设计的内容有一下感触,第一,由于此次设计的过程中设计秒表和时钟的显示,即在一个数码管上显示两种变量,必须确定以下两点:1、必须仔细的核对每一个变量的名字,我曾经在核对变量的名字上面花了很大的力气,由于变量的名字错了,软件编译时很少能检查出,因此仿真时往往不容易发现。2、要每个子程序的调试,这样才能确认某一个部分是正确的,这样才有继续往下做的信心和勇气。参考文献1单片机原理及应用/张毅刚 彭喜元 彭宇主编.高等教育出版社,2010年5月第二版2单片机原理及应用/张毅刚高等
14、教育出版社,20043MCS-51系列单片机实用接口技术/李华主编北京:北京航空航天大学出版社,1993.84单片机C语言轻松入门周坚编 北京航空航天大学出版社5单片机人机接口实例公茂法编著,北京航空航天大学出版社6单片机应用系统设计与实践 陈景初,北京:北京航空航天大学出版社附录DISBEG EQU 30H ;显示单元首地址 TIMCON EQU 2FH ;存放报时次数 ORG 0000H ;程序开始LJMP MAIN ORG 0003H ;关外中断0RETI ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行 ORG 0013H ;关中断1RETI OR
15、G 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行 ORG 0023H ;关串行中断RETI TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH I_TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H DLY1M: MOV R6,#14H ;1毫秒延时 DL_LOOP: MOV R7,#19HDL_LOOP1: DJNZ R7,DL_LOOP1DJNZ R6,DL_LOOP RETDLY20
16、M:LCALL D_II_PLAYLCALLD_II_PLAYLCALLD_II_PLAY RETDL_LOOPS:LCALL DL05SLCALL DL05S RET DL05S: MOV R3,#20H ;8毫秒*32=0.196秒DL05S1: LCALL D_II_PLAYDJNZ R3,DL05S1 RET CTIME: MOV A,#10H MOV B,79H MUL AB ADD A,78H MOV TIMCON,ACLOOP: LCALL DLY20MLCALL DL_LOOPSLCALL DL_LOOPSLCALL DL_LOOPSDJNZ TIMCON,CLOOPCLR 0
17、8H ;清整点报时标志AJMPMLOOP1MAIN: MOV R0,#00H ;清00H-7FH内存单元 MOV R7,#80H ; MLOOP: MOV R0,#00H ; INC R0 ;DJNZ R7,MLOOP ; MOV 20H,#00H ;清20H(标志用) MOV 7AH,#0AH ;放入熄灭符数据 MOV TMOD,#11H ;设T0、T1为16位定时器 MOV TL0,#0B0H ;50MS定时初值(T0计时用) MOV TH0,#3CH ;50MS定时初值 MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用) MOV TH1,#3CH ;50MS定时初值 SET
18、B EA ;总中断开放 SETB ET0 ;允许T0中断 SETB TR0 ;开启T0定时器 MOV R4,#14H ;1秒定时用计数值(50MS20) MOV DISBEG,#70H ;显示单元为70-75HMLOOP1: LCALL D_II_PLAY ;调用显示子程序 JNB P1.0,T_SETSC JNB P1.1,DLY5 ;秒表功能,P1.1按键调时时作减1加 JNB P1.2,FUNBT ;秒表STOP,PUSE,CLR JB 08H, CTIMEAJMP MLOOP1 ;P1.0口为1时跳回MLOOP1FUNBT: LJMP DLY6TSET: LCALL DLY20M JB
19、 P1.3,MLOOP1 ; TS_LOOP: JNB P1.3,TS_LOOP ;等待键释放 MINCHG: SETB EALCALL D_II_PLAY JNB P1.2,DLY1 ;分加1 JNB P1.0,DLY3 ;分减1 JNB P1.3,DLY ;进入时调整AJMPMINCHGCLRBELL: AJMP MLOOP1DLY: LCALL DLY20M ;消抖 JB P1.3, MINCHGT_SETSC: LJMP R_SETTIM ;转到时间调整程序R_SETTIMDLY1: LCALL DLY20M ;消抖 JB P1.2, MINCHGDLY2: LCALL D_II_PL
20、AY ;等键 释放 JNB P1.2, DLY2CLR EA CJNE A,#60H,ADD_M; ADD_M: JC MINCHG ;小于60分时返回ACALLCLR_H ;大于或等于60分时分计时单元清0AJMP MINCHGDLY3 : LCALL DLY20M ;消抖 JB P1.0, MINCHGDLY4: LCALL D_II_PLAY ;等键 释放 JNB P1.0, DLY4CLR EA MOV R0,#53H ;LJMPMINCHGDLY5: LCALL DLY20M JB P1.1,T_MLOOP1 JNB P1.1,$CPL 03H JNB 03H,DIS_SET MOV
21、 DISBEG,#60H ;显示秒表数据单元 MOV 60H,#00H MOV 61H,#00H MOV 62H,#00H MOV 63H,#00H MOV 64H,#00H MOV 65H,#00H MOV TL1,#0F0H ;10MS定时初值() MOV TH1,#0D8H ;10MS定时初值 SETB TR1 SETB ET1T_MLOOP1:LJMP MLOOP1 DIS_SET: MOV DISBEG,#70H ;显示时钟数据单元CLR ET1CLR TR1T_MLOOP11:LJMP MLOOP1DLY6: LCALL DLY20M JB P1.2,T_MLOOP11 T_EST
22、11: JNB P1.2,T_EST11CLR ET1CLR TR1 T_EST22: JNB P1.1,DLY5 JB P1.2,T_EST21LCALL DLY20M JB P1.2,T_EST22 T_EST55: JNB P1.2,T_EST51 MOV 60H,#00H MOV 61H,#00H MOV 62H,#00H MOV 63H,#00H MOV 64H,#00H MOV 65H,#00H T_EST33: JNB P1.1,DLY5 JB P1.2,T_EST31LCALL DLY20M JB P1.2,T_EST33 T_EST44: JNB P1.2,T_EST41 S
23、ETB ET1 SETB TR1AJMP MLOOP1T_EST411: LCALL D_II_PLAYAJMP T_EST11T_EST21: LCALL D_II_PLAYAJMP T_EST22T_EST31: LCALL D_II_PLAYAJMP T_EST33T_EST41: LCALL D_II_PLAYAJMP T_EST44T_EST51: LCALL D_II_PLAYAJMP T_EST55 INTT0: PUSH ACC ;累加器入栈保护 PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0 MOV A,#0B7H ;中断响
24、应时间同步修正 ADD A,TL0 ;低8位初值修正 MOV TL0,A ;重装初值(低8位修正值) MOV A,#3CH ;高8位初值修正ADDC A,TH0 MOV TH0,A ;重装初值(高8位修正值) SETB TR0 ;开启定时器T0DJNZ R4, I_INT0 ;20次中断未到中断退出 A_DDS: MOV R4,#14H ;20次中断到(1秒)重赋初值CPL 07H ;闹铃时间隔呜叫用 MOV R0,#71H ;指向秒计时单元(71H-72H)ACALLADD_1 ;调用加1程序(加1秒操作) MOV A,R3 CLR C CJNE A,#60H,A_DDM A_DDM: JC
25、 I_INT0 ;小于60秒时中断退出ACALLCLR_H MOV R0,#77H ;指向分计时单元(76H-77H)ACALLADD_1 ;分计时单元加1分钟 MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,A_DDH ; A_DDH: JC I_INT0 ;小于60分时中断退出ACALL CLR_H ;大于或等于60分时分计时单元清0LCALL DLY20M ;正点报时 SETB 08H MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD_1 ;小时计时单元加1小时 MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE
26、 A,#24H,RSTART ; RSTART: JC I_INT0 ;小于24小时中断退出ACALLCLR_H ;大于或等于24小时小时计时单元清0 I_INT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移 MOV 73H,77H ;入对应显示单元 MOV 74H,78H ; MOV 75H,79H ; POP PSW ;恢复状态字(出栈) POP ACC ;恢复累加器 SETB ET0 ;开放T0中断RETI ;中断返回 INTT1: PUSH ACC ;中断现场保护 PUSH PSW JB 03H, R_ADDS ;=1时秒表 MOV TL1, #0B0H ;装定时器T
27、1定时初值 MOV TH1, #3CHDJNZ R2,I_INT1 MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反 JB 02H,FLASH0 ;02H位为1时显示单元熄灭 MOV 72H,76H ;02H位为0时正常显示 MOV 73H,77H MOV 74H,78H MOV 75H,79H I_INT1: POP PSW ;恢复现场 POP ACCRETI ;中断退出 FLASH0: JB 01H,FLASH1 ;01H位为1时,转小时熄灭控制 MOV 72H,7AH ;01H位为0时,熄灭符数据放入分 MOV 73H,7AH ;显示单元(7
28、2H-73H),将不显示分数 MOV 74H,78H MOV 75H,79HAJMP I_INT1 ;转中断退出 FLASH1: MOV 72H,76H ;01H位为1时,熄灭符数据放入小时MOV 73H,77H MOV 74H,7AH MOV 75H,7AHAJMP I_INT1 ;转中断退出R_ADDS : CLR TR1 MOV A,#0F7H ;中断响应时间同步修正,重装初值(10ms) ADD A,TL1 ;低8位初值修正 MOV TL1,A ;重装初值(低8位修正值) MOV A,#0D8H ;高8位初值修正ADDC A,TH1 MOV TH1,A ;重装初值(高8位修正值) SE
29、TB TR1 ;开启定时器T0 MOV R0,#61H ;指向秒计时单元(71H-72H)ACALL ADD_1 ;调用加1程序(加1秒操作)CLR C MOV A,R3 JZ R_ADDM ;加1后为00,C=0AJMP I_INT01 ;加1后不为00,C=1R_ADDM: ACALL CLR_H MOV R0,#63H ;指向分计时单元(76H-77H)ACALL ADD_1 ;分计时单元加1分钟 MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,R_ADDH R_ADDH: JC I_INT01 ;小于60分时中断退出LCALL CLR_H ;大于或等于60分时分计时单元清0 MOV R0,#65H ;指向小时计时单元(78H-79H)ACALL ADD_1 ;小时计时单元加1小时 I_INT01: POP PSW ;恢复状态字(出栈) POP ACC ;恢复累加器RETI ;中断返回 ; ADD_1: MOV A,R0 ;取当前计时单元数据