资源描述
单片机课程设计报告
多功能电子数字钟
姓 名 :
学 号 :
班 级 :
指导教师:
目 录
一 课程设计题目-------------------------------- 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) 单片机网络资源
八.程序:
SHAN EQU 20H ;秒闪烁标志
BUFF_KEY EQU 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 ;分钟值缓存
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 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_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,#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,#060H
MOV NHOR,#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 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_KEY
SW4_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
MOV 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
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
LCALL 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 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
MOV 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 DEL
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
SW6_OVER:DEC SEC ;秒减1
SETB F_BEEP
LCALL DEL
CLR F_BEEP
JMP WAIT_KEY
;--------------------------------------------------------------------
DEL: MOV R5,#07 ;按一次键处理一次
DEL01: MOV R6,#200
DEL02: 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,#0F0H ;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 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 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 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+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
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 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
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
MOV 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
展开阅读全文