1、 单片机课程设计报告
2、 多功能电子数字钟 姓 名 : 学 号 : 班 级 : 指导教师:
3、 目 录 一 课程设计题目--------------------------
4、 3 二 电路设计--------------------------------------- 4 三 程序总体设计思路概述------------------- 5 四 各模块程序设计及流程图---------------- 6 五 程序及程序说明见附录------------------- ** 六 课程设计心得及体会---------------------- 11 七 参考资料--------------------------------------- 1
5、2 一 题目及要求 本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。具体要如下: 用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能: (1)走时 (能实现时分秒,年月日的计时) (2)显示 (分屏切换显示时分秒和年月日,修改时能定位闪烁显示) (3)校时 (能用按键修改和校准时钟) (4)定时报警(能定点报时) 本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时
6、能操作演示。最后验收检查 结果,评定成绩分为: (1)完成“走时+显示+秒闪”功能 ----及格 (2)完成“校时修改”功能----中等 (3)完成“校时修改位闪”----良好 (4)完成“定点报警”功能,且使用资源少----优秀 二 电路设计(电路设计图见附件电路图) (1)采用89C51型号单片机 (2)采用8位共阴数码管 (3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管 (4)P2口与数码管选择位直接加74LS138译码器 (5)蜂鸣器接P3.7口。因为单片机输出高电平时输出的电流不足以
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)口。所有按键的另一端接地。
8、三 总体设计思路概述 (1), 数码管显示使用动态显示,每四毫秒轮流显示一个数码管.一个循环耗时32ms(这样会有微闪烁可设置更快的动态显示) (2), 设置四个中断,高 底:定时器1溢出中断 外部中断0 外部中断1 定时器1溢出中断. A.首先允许前三个中断,当没有出现T0, T1中断时主程序在判键并且计时器0在计时.每隔4ms定时器0溢出中断,动态轮流显示一个数码管.用LED_LP做标志,计中断次数.每中断250次秒加一,每60秒分加一, 时 日 月 年依规律类推(不用判断平润年). B.当出现T0(显示日期并做修改)或T1(显示闹钟定
9、时时间并可修改定时时间)中断时都会自动关闭计时器0,此时软件控制打开计数器1,用它继续计时并且如A中用来动态显示日期或闹钟设置的时间,同时每个中断子程序都是在判键,通过按键修改日期或设置闹钟时间.此时已经是计数器1中断级别最高,同样每4ms动态轮流显示数码管,此时数码管显示的是日期或定时时间.当修改完时间或定时时间,人工弹出按键,中断结束返回主程序,在返回前关闭定时器1.这样,在没有T0,T1中断时计数器0中断级别最高. 四 各模块程序设计及流程图 (
10、1) 主程序判键修改时间及走时: 开 始 流程图: 是否到闹钟预置时间 ban Y N 打开蜂鸣器一分钟后再关闭
11、 时间修改控制键是否按下
12、 N
13、 Y N
14、 是否有修改键按下 Y
15、 处理相应按键对应时间的修改(加1减1) 并给出相应的修改闪烁标志(SXX)
16、
17、 (2) 定时器0每隔4ms溢出中断(优先级别最低) 流程图:进入中断 压栈 判断是
18、否有秒闪和修改闪烁标志 结束中断 出栈 Y 轮流动态显示一位数码管4ms,并且秒闪位每隔一秒熄灭一次修改闪烁的两位每隔半秒熄灭一次 N 轮流动态显示一位数码管动态4ms 计中断次数(led_lp)并处理时分秒日月年的加1,中断次数记到250 led_lp清0 (3) 外部中断0(优先级别第二) 流程图: 进入中断 压栈 开定时器1并设置其工
19、作在方式1状态 是否有修改日期按键 N 处理日期的对应位修改(加1减1) Y 关闭定时器1 出栈 结束中断 (4) 外部中断1(优先级别第三) 进入中断 流程图: 压栈 开定时器1并设置其工作 在方式1状态 是否有预置闹钟按键
20、 N 处理对闹钟预置位(加1减1) Y 关闭定时器1 出栈 结束中断 (5) 定时器0每隔4ms溢出中断(优先级别最高) 进入中断 流程图: 压栈 计中断次数(led_lp)并处理时分秒日月年的加1,中断次数记到250 led_lp清0 是否显示日期
21、 Y N 轮流动态显示4ms一位日期的缓存 轮流动态显示4ms一位闹钟的缓存 出栈 结束中断 六 课程设计心得体会: 此次课程设计是大学里来第二次课程设计,于我的感觉是这是一次与实际最贴切的一次课程设计,亦或是说实践。首先我的心得体会有如下几点 (1)万事开头难,要做好单片机课程设计必须要有足够的耐心与兴趣。要反复编程调试,检验。而本次软件编程我反复调试了多达几十次。 (2)要想全面的做好这次课程设计,必须要全面统筹,细心规划好自己所需使用的单片机内部资源以及硬件资源。并尽量做到
22、少用资源而达到最大实用效果。同时也要单个功能慢慢编程调试,而不要好高骛远,急功心切。 (3)第一次设计编写这样较为难而大的课程设计必须要做到对单片机基础硬件与软件的熟练掌握,尤其单片机里汇编语言指令。只有做到融汇贯通方能运筹帷幄。 (4) 做好课程设计要学会借鉴别人好的思想与技巧,而教材上就有许多很好的例子。同时要将每次单片机实验灵活运用于此次课程设计。 七 参考资料: (1) 单片机授课教材 (2) 单片机网络资源 八.程序: SHAN EQU 20H ;秒闪烁标志 BUFF_KEY EQU
23、21H ;键盘键 LED1 EQU 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 ;分钟值
24、缓存 SEC EQU 32H ;秒值缓存 NHOR EQU 33H ;闹钟时间缓存 NMIN EQU 34H NSEC EQU 35H YER EQU 36H ;年月日缓存 MOT EQU 37H DAT EQU 38H SXX EQU 39H F_BEEP BIT 01H LED_PORT EQU P0 DIG_PORT
25、 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 ;--------------
26、 ORG 0000H LJMP MAIN ORG 000BH LJMP T0_INT ORG 0003H LJMP T_0 ORG 0013H LJMP T_1 ORG 001BH LJMP T1_INT ORG 100H MAIN: MOV SP ,#40H MOV PSW,#00H MOV R0,#7
27、FH ;初始化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,#060H MOV NHOR,
28、100 MOV YER,#12 MOV MOT,#06 MOV DAT,#17 CLR C MOV P3.7,C SETB PT1 ;定时器1中断级别最高 CLR PT0 ;定时器0中断级别最低 SETB TR0 ;开定时器0 SETB ET0 ;允许定时器0中断 SETB EX0 ;允许外部中断0 SETB EX1 ;允许外部中断1 SETB
29、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
30、 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_KEY SW
31、4_OKA: JMP SW4_OK SW5_OKA: JMP SW5_OK SW6_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_KEY SW1_OVER:INC HOR ;时加1 M
32、OV R7,HOR SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY SW2_OK: MOV SXX,#01 MOV A,HOR CJNE A,#00,SW2_OVER MOV HOR,#23 SETB F_BEEP LCALL DEL CLR F_BEEP
33、 JMP WAIT_KEY SW2_OVER:DEC HOR ;时减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY SW3_OK: MOV SXX,#02 MOV A,MIN CJNE A,#59,SW3_OVER MOV MIN,#00H SETB F_BEEP L
34、CALL DEL CLR F_BEEP JMP WAIT_KEY SW3_OVER:INC MIN ;分加1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY SW4_OK: MOV SXX,#02 MOV A,MIN CJNE A,#00,SW4_OVER MOV
35、 MIN,#59 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY SW4_OVER:DEC MIN ;分减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY SW5_OK: MOV SXX,#03 M
36、OV A,SEC CJNE A,#59,SW5_OVER MOV SEC,#00H SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY SW5_OVER:INC SEC ;秒加1 SETB F_BEEP LCALL DE
37、L CLR F_BEEP JMP WAIT_KEY SW6_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_KEY S
38、W6_OVER:DEC SEC ;秒减1 SETB F_BEEP LCALL DEL CLR F_BEEP JMP WAIT_KEY ;-------------------------------------------------------------------- DEL: MOV R5,#07 ;按一次键处理一次 DEL01: MOV R6,#200 D
39、EL02: MOV R7,#200 DJNZ R7,$ DJNZ R6,DEL02 DJNZ R5,DEL01 RET BIN_BCD: MOV B,#10 DIV AB RET ;-------------------------------------------------------------------- T0_INT: PUSH ACC PUSH PSW MOV TH0,#0
40、F0H ;T0=4MS MOV TL0,#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
41、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
42、 A,#12,CONT_SCAN MOV MOT,#00 INC YER MOV A,YER CJNE A,#99,CONT_SCAN LCALL DEL CONT_SCAN:MOV A,SEC MOV B,#02 DIV AB MOV A,B CJNE A,#00,LOPK MOV SHAN,#10 LOPK: CJNE A,#01,LOPL MOV SHAN,#11 LOPL:MOV
43、 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 MO
44、V 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
45、 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
46、 MOV DPTR,#TAB_SCAN JMP @A+DPTR TAB_SCAN: AJMP SCAN_L1 AJMP SCAN_L2 AJMP SCAN_L3 AJMP SCAN_L4 AJMP SCAN_L5 AJMP SCAN_L6 AJMP SCAN_L7 AJMP SCAN_L8 SCAN_L1: MOV DIG_PORT,#0 MOV A,LED1
47、 JMP END_SCAN SCAN_L2: MOV DIG_PORT,#1 MOV A,LED2 JMP END_SCAN SCAN_L3: MOV DIG_PORT,#2 MOV A,#11 JMP END_SCAN SCAN_L4: MOV DIG_PORT,#3 MOV A,LED3 JMP END_SCAN SCAN_L5: MOV DIG_PORT,#4 MOV
48、 A,LED4 JMP END_SCAN SCAN_L6: MOV DIG_PORT,#5 MOV A,SHAN JMP END_SCAN SCAN_L7: MOV DIG_PORT,#6 MOV A,LED5 JMP END_SCAN SCAN_L8: MOV DIG_PORT,#7 MOV A,LED6 END_SCAN: MOV DPTR,#TAB_LED MOVC A,@A+DPTR
49、 MOV LED_PORT,A POP PSW POP ACC RETI TAB_LED: DB 3FH,06H,5BH,4FH ;共阴0-9和(-)字码表 DB 66H,6DH,7DH,07H DB 7FH,6FH,00H,48H,40H ;--------------------------------------------------进入日期显示 T_0:PUSH ACC PUSH PSW M
50、OV TH1,#0F0H ;T1=4MS MOV TL1,#060H SETB TR1 SETB ET1 ;--------------------------------------- RWAIT_KEY:JNB SW0,RLOOP CLR TR1 POP PSW POP ACC RETI RLOOP:JNB SW1,RSW1_OK JNB SW2,RSW2_OK JNB SW3,RSW3_OK






