基于51单片机多功能电子时钟设计报告(43页).doc
-基于51单片机多功能电子时钟设计报告-第 42 页单片机课程设计报告 多功能电子数字钟姓 名 : 学 号 : 班 级 : 指导教师: 目 录一 课程设计题目- 3二 电路设计- 4三 程序总体设计思路概述- 5四 各模块程序设计及流程图- 6 五 程序及程序说明见附录- * 六 课程设计心得及体会- 11七 参考资料- 12一 题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能:(1)走时 (能实现时分秒,年月日的计时)(2)显示 (分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时 (能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示。最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能 -及格(2)完成“校时修改”功能-中等(3)完成“校时修改位闪”-良好(4)完成“定点报警”功能,且使用资源少-优秀二 电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3.7口。因为单片机输出高电平时输出的电流不足以驱动蜂鸣器所以蜂鸣器,所以P3.7口与蜂鸣器直接接反相器再接蜂鸣器的一端,蜂鸣器的另一端接5V电源。这样当P3.7口给高电平时蜂鸣器导通名声。否则反之。(6)单片机XTAL1,XTAL2端接外部时钟电路(时钟电路参考课本),RAT端接复位电路(复位电路参考课本)。EA端接5V电源,使得单片机读取片内程序。(7)修改时间控制开关key1接p1.0口,key2至key7用来对时间,日期,闹钟时间的修改,依次于p1.1至p1.6。key2用来显示日期并做修改的开关,接于INT0(p3.2)口。key3用来显示闹钟时间并做预置的开关,接于INT1(p3.3)口。所有按键的另一端接地。 三 总体设计思路概述(1), 数码管显示使用动态显示,每四毫秒轮流显示一个数码管.一个循环耗时32ms(这样会有微闪烁可设置更快的动态显示)(2), 设置四个中断,高 底:定时器1溢出中断 外部中断0 外部中断1 定时器1溢出中断. A.首先允许前三个中断,当没有出现T0, T1中断时主程序在判键并且计时器0在计时.每隔4ms定时器0溢出中断,动态轮流显示一个数码管.用LED_LP做标志,计中断次数.每中断250次秒加一,每60秒分加一, 时 日 月 年依规律类推(不用判断平润年).B.当出现T0(显示日期并做修改)或T1(显示闹钟定时时间并可修改定时时间)中断时都会自动关闭计时器0,此时软件控制打开计数器1,用它继续计时并且如A中用来动态显示日期或闹钟设置的时间,同时每个中断子程序都是在判键,通过按键修改日期或设置闹钟时间.此时已经是计数器1中断级别最高,同样每4ms动态轮流显示数码管,此时数码管显示的是日期或定时时间.当修改完时间或定时时间,人工弹出按键,中断结束返回主程序,在返回前关闭定时器1.这样,在没有T0,T1中断时计数器0中断级别最高.四 各模块程序设计及流程图(1) 主程序判键修改时间及走时:开 始 流程图:是否到闹钟预置时间 ban Y N打开蜂鸣器一分钟后再关闭 时间修改控制键是否按下 N Y N 是否有修改键按下 Y 处理相应按键对应时间的修改(加1减1)并给出相应的修改闪烁标志(SXX) (2) 定时器0每隔4ms溢出中断(优先级别最低) 流程图:进入中断压栈判断是否有秒闪和修改闪烁标志 结束中断出栈Y 轮流动态显示一位数码管4ms,并且秒闪位每隔一秒熄灭一次修改闪烁的两位每隔半秒熄灭一次 N 轮流动态显示一位数码管动态4ms计中断次数(led_lp)并处理时分秒日月年的加1,中断次数记到250 led_lp清0 (3) 外部中断0(优先级别第二) 流程图: 进入中断压栈开定时器1并设置其工作在方式1状态是否有修改日期按键 N处理日期的对应位修改(加1减1) Y 关闭定时器1出栈结束中断(4) 外部中断1(优先级别第三)进入中断 流程图:压栈开定时器1并设置其工作在方式1状态是否有预置闹钟按键 N处理对闹钟预置位(加1减1) Y关闭定时器1出栈结束中断(5) 定时器0每隔4ms溢出中断(优先级别最高) 进入中断 流程图:压栈计中断次数(led_lp)并处理时分秒日月年的加1,中断次数记到250 led_lp清0是否显示日期 Y N轮流动态显示4ms一位日期的缓存轮流动态显示4ms一位闹钟的缓存出栈结束中断六 课程设计心得体会:此次课程设计是大学里来第二次课程设计,于我的感觉是这是一次与实际最贴切的一次课程设计,亦或是说实践。首先我的心得体会有如下几点(1)万事开头难,要做好单片机课程设计必须要有足够的耐心与兴趣。要反复编程调试,检验。而本次软件编程我反复调试了多达几十次。(2)要想全面的做好这次课程设计,必须要全面统筹,细心规划好自己所需使用的单片机内部资源以及硬件资源。并尽量做到少用资源而达到最大实用效果。同时也要单个功能慢慢编程调试,而不要好高骛远,急功心切。 (3)第一次设计编写这样较为难而大的课程设计必须要做到对单片机基础硬件与软件的熟练掌握,尤其单片机里汇编语言指令。只有做到融汇贯通方能运筹帷幄。(4) 做好课程设计要学会借鉴别人好的思想与技巧,而教材上就有许多很好的例子。同时要将每次单片机实验灵活运用于此次课程设计。七 参考资料: (1) 单片机授课教材 (2) 单片机网络资源八.程序:SHANEQU 20H ;秒闪烁标志 BUFF_KEY EQU 21H ;键盘键 LED1EQU 22H ;数码管显示缓存 LED2 EQU 23H LED3 EQU 24H LED4 EQU 25H LED5 EQU 26H LED6 EQU 27H LED_LP EQU 28H ;计时标志 HOR EQU 30H ;小时值缓存 MIN EQU 31H ;分钟值缓存 SEC EQU 32H ;秒值缓存 NHOR EQU 33H ;闹钟时间缓存 NMIN EQU 34H NSEC EQU 35H YEREQU 36H ;年月日缓存 MOTEQU 37H DATEQU 38H SXXEQU 39H F_BEEPBIT 01H LED_PORT EQU P0 DIG_PORT EQU P2 SW0 BIT P3.2 SW8 BIT P1.0 SW1 BIT P1.1 SW2 BIT P1.2 SW3 BIT P1.3 SW4 BIT P1.4 SW5 BIT P1.5 SW6 BIT P1.6 SW7 BIT P3.3 ORG 0000H LJMP MAIN ORG 000BH LJMP T0_INTORG 0003HLJMP T_0ORG 0013HLJMP T_1ORG 001BHLJMP T1_INT ORG 100HMAIN: MOV SP ,#40H MOV PSW,#00H MOV R0,#7FH ;初始化RAM区,CLR_RAM:MOV A,#00H MOV R0,A DJNZ R0,CLR_RAM MOV P1,#0FFH MOV P2,#0FFH MOV P0,#0FFH MOV P3,#0FFH MOV TMOD,#11H MOV TH0,#0F0H ;T0=4MS MOV TL0,#060HMOV NHOR,#100MOV YER,#12MOV MOT,#06MOV DAT,#17CLR CMOV P3.7,CSETB PT1 ;定时器1中断级别最高CLR PT0 ;定时器0中断级别最低 SETB TR0 ;开定时器0 SETB ET0 ;允许定时器0中断SETB EX0 ;允许外部中断0SETB EX1 ;允许外部中断1 SETB EA ;允许所有中断;-按键预置时间WAIT_KEY:MOV A,NHOR CJNE A,HOR,LNNN MOV A,NMIN CJNE A,MIN,LMNN MOV A,NSEC CJNE A,SEC,LNNN SETB C MOV P3.7,C LJMP LNNN LMNN:MOV A,NMIN ADD A,#01 CJNE A,MIN,LNNN MOV A,NSEC CJNE A,SEC,LNNN CLR C MOV P3.7,C LNNN:JNB SW8,LSNN MOV SXX,#0 LJMP WAIT_KEY LSNN:JNB SW1,SW1_OK JNB SW2,SW2_OK JNB SW3,SW3_OK JNB SW4,SW4_OKA JNB SW5,SW5_OKA JNB SW6,SW6_OKA JMP WAIT_KEYSW4_OKA: JMP SW4_OKSW5_OKA: JMP SW5_OKSW6_OKA: JMP SW6_OK SW1_OK: MOV SXX,#01 MOV A,HOR CJNE A,#23,SW1_OVER MOV HOR,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW1_OVER:INC HOR ;时加1 MOV R7,HOR SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW2_OK: MOV SXX,#01 MOV A,HOR CJNE A,#00,SW2_OVER MOV HOR,#23 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW2_OVER:DEC HOR ;时减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW3_OK: MOV SXX,#02 MOV A,MIN CJNE A,#59,SW3_OVER MOV MIN,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW3_OVER:INC MIN ;分加1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW4_OK: MOV SXX,#02 MOV A,MIN CJNE A,#00,SW4_OVER MOV MIN,#59 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW4_OVER:DEC MIN ;分减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW5_OK: MOV SXX,#03 MOV A,SEC CJNE A,#59,SW5_OVER MOV SEC,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW5_OVER:INC SEC ;秒加1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW6_OK: MOV SXX,#03 MOV A,SEC CJNE A,#00,SW6_OVER MOV SEC,#59 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYSW6_OVER:DEC SEC ;秒减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEYDEL: MOV R5,#07 ;按一次键处理一次DEL01: MOV R6,#200DEL02: MOV R7,#200 DJNZ R7,$ DJNZ R6,DEL02 DJNZ R5,DEL01 RETBIN_BCD: MOV B,#10 DIV AB RETT0_INT: PUSH ACC PUSH PSW MOVTH0,#0F0H ;T0=4MS MOVTL0,#060H INC LED_LP MOV A,LED_LP CJNE A,#250,CONT_SCAN ;250*4MS=1S MOV LED_LP,#00H INC SEC MOV A,SEC CJNE A,#60,CONT_SCAN MOV SEC,#00H INC MIN MOV A,MIN CJNE A,#60,CONT_SCAN MOV MIN,#00H INC HOR MOV A,HOR CJNE A,#24,CONT_SCAN MOV HOR,#00H INC DAT MOV A,DAT CJNE A,#30,CONT_SCAN MOV DAT,#00 INC MOT MOV A,MOT CJNE A,#12,CONT_SCAN MOV MOT,#00 INC YER MOV A,YER CJNE A,#99,CONT_SCAN LCALL DELCONT_SCAN:MOV A,SEC MOV B,#02 DIV AB MOV A,B CJNE A,#00,LOPK MOVSHAN,#10 LOPK: CJNE A,#01,LOPL MOVSHAN,#11 LOPL:MOV A,SXX CJNE A,#01,LK1 MOV A,LED_LP MOV B,#125 DIV AB CJNE A,#0,LLL1 MOV LED1,#10 MOV LED2,#10 LJMP LLL2 LK1:MOV A,SXX CJNE A,#02,LK2 MOV A,LED_LP MOV B,#125 DIV AB CJNE A,#0,LLL1 MOV LED3,#10 MOV LED4,#10 LJMP LLL3 LK2:MOV A,SXX CJNE A,#03,LLL1 MOV A,LED_LP MOV B,#125 DIV AB CJNE A,#0,LLL1 MOV LED5,#10 MOV LED6,#10 LJMP LKMM LLL1:MOV A,HOR LCALL BIN_BCD MOV LED2,B MOV LED1,A LLL2:MOV A,MIN LCALL BIN_BCD MOV LED4,B MOV LED3,A LLL3:MOV A,SEC LCALL BIN_BCD MOV LED6,B MOV LED5,A LKMM:MOV A,LED_LP MOV B,#08 DIV AB MOV A,B RL A MOV DPTR,#TAB_SCAN JMP A+DPTRTAB_SCAN: AJMP SCAN_L1 AJMP SCAN_L2 AJMP SCAN_L3 AJMP SCAN_L4 AJMP SCAN_L5 AJMP SCAN_L6 AJMP SCAN_L7 AJMP SCAN_L8SCAN_L1: MOV DIG_PORT,#0 MOV A,LED1 JMP END_SCANSCAN_L2: MOV DIG_PORT,#1 MOV A,LED2 JMP END_SCANSCAN_L3: MOV DIG_PORT,#2 MOV A,#11 JMP END_SCANSCAN_L4: MOV DIG_PORT,#3 MOV A,LED3 JMP END_SCANSCAN_L5: MOV DIG_PORT,#4 MOV A,LED4 JMP END_SCANSCAN_L6: MOV DIG_PORT,#5 MOV A,SHAN JMP END_SCANSCAN_L7: MOV DIG_PORT,#6 MOV A,LED5 JMP END_SCANSCAN_L8: MOV DIG_PORT,#7 MOV A,LED6END_SCAN: MOV DPTR,#TAB_LED MOVC A,A+DPTR MOV LED_PORT,A POP PSW POP ACC RETITAB_LED: DB 3FH,06H,5BH,4FH ;共阴0-9和(-)字码表 DB 66H,6DH,7DH,07H DB 7FH,6FH,00H,48H,40H;-进入日期显示 T_0:PUSH ACC PUSH PSWMOV TH1,#0F0H ;T1=4MS MOV TL1,#060H SETB TR1SETB ET1RWAIT_KEY:JNB SW0,RLOOP CLR TR1 POP PSW POP ACC RETI RLOOP:JNB SW1,RSW1_OK JNB SW2,RSW2_OK JNB SW3,RSW3_OK JNB SW4,RSW4_OK JNB SW5,RSW5_OKA JNB SW6,RSW6_OKA JMP RWAIT_KEYRSW5_OKA: JMP RSW5_OKRSW6_OKA: JMP RSW6_OKRSW1_OK: MOV A,YER CJNE A,#99,RSW1_OVER MOV YER,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW1_OVER:INC YER ;年加1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEY RSW2_OK: MOV A,YER CJNE A,#00,RSW2_OVER MOV YER,#99 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW2_OVER:DEC YER ;年减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEY RSW3_OK: MOV A,MOT CJNE A,#12,RSW3_OVER MOV MOT,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW3_OVER:INC MOT ;月加1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW4_OK: MOV A,MOT CJNE A,#00,RSW4_OVER MOV MOT,#12 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW4_OVER:DEC MOT ;月减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW5_OK: MOV A,DAT CJNE A,#30,RSW5_OVER MOV DAT,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW5_OVER:INC DAT ;号加1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW6_OK: MOV A,DAT CJNE A,#00,RSW6_OVER MOV NSEC,#30 SETB F_BEEP LCALL DEL CLR F_BEEP JMP RWAIT_KEYRSW6_OVER:DEC DAT ;号减1