单片机课程设计报告
题目:简易数字秒表的设计与仿真
教学单位:机电工程系
专业:机械设计制造及其自动化班级:
学号:
姓名:
1.项目设计目的与要求。
(1) 熟悉单片机定时/计数器电路和中断的功能与编程。
(2) 熟悉8051与8255与LED的接口技术、LED动态显示的控制过程。
(3) 通过调试简易秒表整体程序,学会如何编制含LED动态显示、键盘扫描和定时器中断等多种功能的综合程序,体会大型程序的编制和调试技巧。
2.实验设备及所需元器件
(1)DJ-598KC 单片机开发系统 1台
(2)仿真器(EASYPROBE) 1只
(3)PC机1台
3.项目内容及实验方法。
(1)内容与要求:
利用DJ—598KC单片机仿真实验系统进行模拟,用六位LED数码管显示实时计时值,其中时、分、秒、十分秒值从左到右各用1至两位LED数码显示,显示值为分、秒值0~59,时和十分秒值为0~9,使用KEY0、KEY1、KEY2等3键分别实现启动、停止、清零等功能。
(2)方法:
用单片机定时器0中断方式,实现100ms定时作为实时时基信号,编程实现十分秒、秒、分计数。
用动态显示方式实现秒表计时显示,采用中断或查询方式取得KEY0、KEY1、KEY2的按键输入,实现秒表的启动、停止、清零等功能。
4.项目电路设计及原理介绍
(1)实验电路及接线图
(2)实验步骤:(实验线路原理及接线)
将KEY0、KEY1、KEY2按键用实验系统上的K1~K3键代起,分别和P1.0~P1.2连接,实现秒表的启动、停止、清零等功能。
电路中,8255 B口的8个I/O引脚PB0~PB7通过反相器驱动电路连接六位LED的阳极a~g,及dp;8255的A口的六个I/O引脚PA0~PB5通过同相驱动,对6位LED的阴极进行分时选通;这样在任一时刻,可以只有一位LED是点亮的。
只要扫描的频率足够高(一般大于25Hz),由于人眼的视觉暂留特性,直观上感觉却是连续点亮的,这就是我们常说的动态扫描电路。
LED实现动态显示时,动态扫描的频率有一定的要求。
频率太低,LED将出现闪烁现象;如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清。
所以一般均取几个ms 左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。
在C51指令中,延时子程序是相当简单的,并且延时时间也很容易更改,可参见程序清单中的DELAY延时子程序。
5.控制程序流程图
(1)主程序框图:
LED显缓单元清零
定时∕计数器0、中断初始化
调用LED动态显示子程
启动键按下否停止键按下否复位键按下否开定时器0中断启动定时开始
关定时器0中断停止定时
NO
NO NO YES YES YES
(2)100ms定时中断程序框图:
恢复初值,保护
0.1秒加1
1秒到吗?
0.1秒单元清零,分加1
60秒到吗?
秒单元清零,分加1
60分到吗?
分单元清零,时加1
24小时到吗?
时单元清零
退栈返回N N N N
Y Y Y Y
6.项目调试总结及改进意见:
将程序输入单片机仿真试验系统进行模拟,用六位LED数码管实时计时,将KEYO0置于低电位并返回时,计时开始,将KEYO1置于低电位并返回时,计时停止,将KEYO2置于低电位并返回时,计时清零,通过调试,可实时观察所编程序的对错,如果程序错误,将不会实时显示秒分值;调试时一定要记得将按钮置于低电位时返回,否则通过按钮验证,将不会出现预期效果,
7.控制程序:
主程序:
ORG 0000H
START:AJMP MAIN
ORG 000BH
AJMP CTC0
ORG 0100H
MAIN:MOV SP,#60H
MOV DPTR,#0FF23H
MOV A,#88H
MOVX @DPTR,A MAIN1:MOV R0,#79H MOV R7,#06H
ML1:MOV @R0,#00H
INC R0
DJNZ R7,ML1
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA
CLR ET0
CLR TR0
ML0:LCALL DISP
MOV P1,#0FFH
JNB P1.0,KEY0
JNB P1.1,KEY1
JNB P1.2,KEY2
SJMP ML0
KEY0:SETB ET0
SETB TR0
SJMP ML0
KEY1:CLR ET0
CLR TR0
SJMP ML0
KEY2:CLR EA
SJMP MAIN1
定时中断程序:
ORG 0200H
CTC0:PUSH PSW
PUSH ACC
SETB PSW.3
MOV TL0,#0B0H
MOV TH0,#3CH
MOV R0,#79H
MOV A,@R0
INC A
MOV @R0,A XRL A,#20
JNZ RETO
CLR A
MOV @R0,A
MOV R0,#7BH
ACALL DAAD1
MOV A,R2
XRL A,#60H
JNZ RETO
ACALL CLR0
MOV R0,#7DH
ACALL DAAD1
MOV A,R2
XRL A,#60H
JNZ RETO
ACALL CLR0
MOV R0,#7EH MOV A,@R0
INC A
MOV @R0,A XRL A,#0AH
JNZ RETO
ACALL CLR0
RETO:POP ACC
POP PSW
RETI
十进制秒、分值加1子程序:
DAAD1:MOV A,@R0
DEC R0
SWAP A
ORL A,@R0
ADD A,#01H
DA A
MOV R2,A
ANL A,#0FH
MOV @R0,A
MOV A,R2
INC R0
ANL A,#0F0H
SWAP A
MOV @R0,A
RET
CLR0:CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
LED显示子程序:
ORG 0300H
DISP:MOV R0,#79H
MOV R3,#0FEH
LD0:MOV A,R3
MOV DPTR,#0FF20H
MOVX @DPTR,A
MOV DPTR,#SEG
MOV A,@R0
DIR0:MOVC A,@A+DPTR
MOV DPTR,#0FF21H
DIR1:MOVX @DPTR,A
ACALL DL
INC R0
MOV A,R3
JNB ACC.5,LD1
RL A
MOV R3,A
LJMP LD0
LD1:RET
延时子程序:
DL:MOV R6,#01FH
DELAY2:MOV R7,#018H
DELAY1:DJNZ R7,DELAY1
DJNZ R6,DELAY2
RET
字符’0’~’9‘的七段LED代码表:
SEG:DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H,80H,90H DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H,80H,90H END。