设计题目 电子钟
机电工程 院(系) 机械设计制造及其自动化 专业
班级 机械1102班 学号 0806110417
设计人
指导教师
完成日期 2015 年 1 月 日
中南大学机电工程学院
一、课程设计任务书
题目:用8031的P1口和一片8255作输出口控制六个数码管显示(二个数码管显示“时”、二个数码管显示“分”、二个数码管显示“秒”),作输入口控制按键输入,74LS138译码器作8255的片选信号,做一台电子钟。要求:
方案一:1、用一个按键控制作时钟调整状态输入(按下一次进入时钟调整状态下的“时”调整,再按下一次进入“分”调整,再按下一次进入“秒”调整,再按下一次退出时钟调整状态),一个按键用于调整时钟(在时钟调整状态下有效)。
2、在时钟调整状态下,正在调整的“时”或“分”或“秒”要进行闪烁显示指示。
3、完成设计时,交设计说明书和详细电子钟系统电路原理图。说明书书的要求见设计指导书。
我选择方案一 、题目1
用8255的A口和B口作输出口控制六个数码管显示(二个数码管显示“时”、二个数码管显示“分”、二个数码管显示“秒”),单片机P1口的P1.7、P1.6、P1.5作输入控制按键输入,请选用方案一或方案二做一台电子钟。要求:
8255的A口地址为0900H, 8255的B口地址为4900H
二、设计方案
1、模块设计
电子钟功能分模块实现,靠标志连接,便于编写调试。共五个模块。
模块1:按键扫描模块:循环扫描键1键2,扫描时同时调用显示子程序。
模块2:定时器中断模快:判断FLAG.1标志决定是秒加1还是反相FLAG.0。
模块3:转换段码模块:将时分秒查表转换为段码放在缓冲区,根据标志FLAG.0决定是时分秒全部转换还是部分转换,根据STATUS标志的内容决定不转换那部分(STATUS=3不转换时,STATUS=2不转换分,STATUS=1不转换秒,不转换部分段码置0),即实现闪烁显示。
模块4:段码位码送入8255:A口送段码,B口送位码,完成动态显示。
模块5:修改模块:扫描到键2按下则根据STATUS标志的内容修改相应的时分秒(STATUS=3时加1,STATUS=2分加1,STATUS=1秒加1,其它值不动作)
2、标志设置及RAM地址分配
序号 | 名 称 | 注 释 |
1 | DISM0~DISM5 | 显示缓冲区,用于显示程序中存放要显示的段码,占六个单元。 |
2 | HH | 小时时间存放单元,占一个单元,初始值赋0 |
3 | MM | 分时间存放单元,占一个单元,初始值赋0 |
4 | SS | 秒时间存放单元,占一个单元,初始值赋0 |
5 | HSEC | 小于0.5秒计数延时单元,占一个单元,用于时间调整时,闪烁指示状态用。定时器定时为50ms,该单元初始值赋10 |
6 | SEC | 小于1秒计数延时单元,占一个单元,用于时钟计时用,定时器定时为50ms,该单元初始值赋20 |
7 | FLAG | 标志存储器单元,占一个单元,单元中的每一位可用作标志,该单元必须定位在单片机片内20~2FH中(在这些单元中的每一位可按位寻址访问)。 |
8 | STATUS | 时钟调整时的状态指针,在时钟调整状态下有效。为“3”时指示“时”调整,为“2”时指示“分”调整,为“1”时指示“秒”调整。 |
序号 | 标志名称 | 注 释 |
1 | FLAG.1 | 每隔0.5秒将此标志反相一次。在时钟调整状态下,用此标志控制数码管进行闪烁指示当前正在调整的是哪一个时钟单元。 |
2 | STAUS | 按下时钟调整键后,此标志置“1”,进入时钟调整状态,先进行“时”调整((STATUS)=3),再按下时钟调整键,进行“分”调整((STATUS)=2),再按下时钟调整键,进行“秒”调整((STATUS)=1),再按下时钟调整键,则此标志置“0”,退出时钟调整状态。 |
3 | FLAG.1 | 按键按下后,此标志置“1”,键松开,此标志置“0” |
1)定时器初值:使用定时器0定时50ms,工作在方式0,初值为65535-5000=15535=3CAFH,故TH0=3CH、TL0=0AFH,在中断服务程序里通过减1判断20次实现定时1秒(SEC),判断10次实现定时0.5秒(HSEC)
2)七段数码管段码:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 灭 |
3FH | 06H | 5BH | 4FH | 66H | 6DH | 7DH | 07H | 7FH | 6FH | 00H |
高八位对应关系如下表
P2 | P2.7 | P2.6 | P2.5 | P2.4 | P2.3 | P2.2 | P2.1 | P2.0 |
A1 | A0 | G2B | G2A | G | C | B | A | |
A | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
B | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
Control | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
三、流程图
1、模块1---按键扫描模块
2、模块2--定时器中断模快
3、模块3--转换段码模块
4、模块4--段码位码送入8255
5、模块5--修改模块
四、硬件电路设计
1、ATC51
2、74LS138
当G2B_、G2_A为低电平,G1为高电平时芯片正常工作,根据输入ABC端口的电平由真值表可以查得输出值。
74LS138真值表
G1 | G2A | G2B | C | B | A | Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 |
0 | X | X | X | X | X | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
X | 1 | X | X | X | X | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
X | X | 1 | X | X | X | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
8255是可编程的并行输入/输出接口芯片,通用性强且使用灵活。8255按功能可分为三个部分,即:总线接口电路,I/O口电路和控制逻辑电路。
1.I/O口电路:8255共有三个八位口,其中A口和B口是单纯的数据口,供数据I/O口使用。
2.总线接口电路:它用于实现8255和单片机芯片的信号连接。
(1)CS——片选信号。
(2)RD——读信号。
(3)WR——写信号。
(4)A0、A1——端口选择信号。8255共有四个可寻址的端口,用二位编码可以实现。
3.控制逻辑电路:它是控制寄存器,用于存放各口的工作方式控制字。
本课程设计是利用8255可编程并行口芯片,实现数据的输入、输出。可编程通用接口芯片8255A有三个八位的并行的I/O口,它有三种工作方式。本实验采用的方式为0:PA口输出段码,PB口输出位码。故控制字为1000 0000H。
工作方式0是一种基本的输入输出方式。在这种方式下,三个端口都可以由程序设置为输入或输出,其基本功能可概括如下:
A、可具有两个八位端口(A、B)和两个4位端口(C口的上半部分和下半部)。
B、数据输出时可锁存,输入时没有锁存功能。
4、7段数码管(共阴极)
故有如下对应关系
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 灭 |
3FH | 06H | 5BH | 4FH | 66H | 6DH | 7DH | 07H | 7FH | 6FH | 00H |
实验台提供了8个按钮的小键盘,可接到单片机的并行口,如果有键按下,则相应输出为低,否则输出为高。
本次电子钟设计使用了P1.7和P1.6口分别控制按键1和按键2.
6、电路原理图
五、程序源代码
CLOCK-MAIN.ASM
FLAG EQU 21H
HH EQU 30H
MM EQU 31H
SS EQU 32H
STATUS EQU 33H
HSEC EQU 34H
SEC EQU 35H
DISM0 EQU 40H
DISM1 EQU 41H
DISM6 EQU 42H ;段码为00H使得时分秒间隔显示更好看
DISM2 EQU 43H
DISM7 EQU 45H
DISM3 EQU 44H
DISM4 EQU 46H
DISM5 EQU 47H
DISM8 EQU 48H
K1 EQU P1.7
K2 EQU P1.6
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INT_0
MAIN:
MOV SP,#50H
MOV DPTR,#0C900H
MOV A,#80H
MOVX @DPTR,A ;写入控制字
MOV SEC,#20 ;SET TIME=50MS *20
MOV HSEC,#10 ;SET TME=50MS *10
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0AFH
SETB EA
SETB ET0
SETB TR0
KEYTEST:
MOV STATUS,#4
CLR FLAG.1
TEST10:
LCALL DISBUF
LCALL DISP
JNB K2,TEST20 ;键2按下则跳出循环
JB K1,TEST10 ;键1不按下则循环并显示
TEST11:
LCALL DISBUF
LCALL DISP
JNB K1,TEST11 ;键1不松开则循环并显示
DEC STATUS
SETB FLAG.1
START:
MOV R0,STATUS
CJNE R0,#0,TEST10 ;每按键1一次STATUS+1,按4次跳出循环
SJMP KEYTEST
TEST20:
LCALL DISBUF
LCALL DISP
JNB K2,TEST20 ;键2不松开则循环并显示
LCALL MODIFY
SJMP TEST10 ;键2按下一次则修改一次并跳出循环去进入按键1和2的测试循环
MODIFY:
MOV A,STATUS
CLR CY
SUBB A,#3
JZ MODFH
MOV A,STATUS
CLR CY
SUBB A,#2
JZ MODFM
MOV A,STATUS
CLR CY
SUBB A,#1
JZ MODFS ;判断STATUS 为3时修改时 为2时修改分 为1时修改秒
SJMP RET_0
MODFH:
MOV A,HH
ADD A,#1
DA A
MOV HH,A
CJNE A,#24H,NEXTH
MOV HH,#0
NEXTH:
AJMP RET_0
MODFM:
MOV A,MM
ADD A,#1
DA A
MOV MM,A
CJNE A,#60H,NEXTM
MOV MM,#0
NEXTM:
AJMP RET_0
MODFS:
MOV A,SS
ADD A,#1
DA A
MOV SS,A
CJNE A,#60H,NEXTS
MOV SS,#0
NEXTS:
RET_0:
LCALL DISBUF
LCALL DISP
RET
INT_0:
JNB FLAG.1,TIME
MOV A,HSEC
DEC A
MOV HSEC,A
JNZ RET_A
CPL FLAG.0
MOV HSEC,#10
SJMP RET_A
TIME:
MOV A,SEC
DEC A
MOV SEC,A
JNZ RET_A
MOV A,SS
ADD A,#1
DA A
MOV SS,A
MOV SEC,#20
SJMP RET_A
RET_A:
MOV TH0,#3CH
MOV TL0,#0AFH
RETI
DISBUF:
JNB FLAG.0,LAB0 ;标志为0清除相应的时分秒
SJMP LAB1
LAB0:
LJMP NORMAL
LAB1:
MOV A,STATUS
CLR CY
SUBB A,#3
JZ FLICH ;判断status
MOV A,STATUS
CLR CY
SUBB A,#2
JZ FLICM
MOV A,STATUS
CLR CY
SUBB A,#1
JZ FLICS
SJMP NORMAL
FLICH:
MOV DISM0,#00H
MOV DISM1,#00H
SJMP NORMALM
FLICM:
MOV DISM2,#00H
MOV DISM3,#00H
MOV A,HH
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM0,A
MOV A,HH
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM1,A
MOV DISM4,#00H
MOV DISM5,#00H
MOV A,SS
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM4,A
MOV A,SS
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM5,A
SJMP RET_3
FLICS:
MOV DISM4,#00H
MOV DISM5,#00H
MOV A,HH
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM0,A
MOV A,HH
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM1,A
MOV A,MM
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM2,A
MOV A,MM
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM3,A
SJMP RET_3
NORMAL:
MOV A,HH
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM0,A
MOV A,HH
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM1,A ;HH>>DISM0 DISM1
NORMALM:
MOV A,MM
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM2,A
MOV A,MM
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM3,A ;MM>>DISM2 DISM3
NORMALS:
MOV A,SS
ANL A,#0F0H
SWAP A
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM4,A
MOV A,SS
ANL A,#0FH
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV DISM5,A ;SS>>DISM4 DISM5
RET_3:
RET
DISTAB:DB 3FH,06H,5BH,4FH
DB 66H,6DH,7DH,07H
DB 7FH,6FH,3FH,3FH
DISP:
MOV A,SS
CJNE A,#60H,NEXT0 ;判断是否到60
MOV SS,#0
MOV A,MM
ADD A,#1
DA A
MOV MM,A
NEXT0:
MOV A,MM
CJNE A,#60H,NEXT1
MOV MM,#0
MOV A,HH
ADD A,#1
DA A
MOV HH,A
NEXT1:
MOV A,HH
CJNE A,#24H,NEXT2
MOV HH,#0
NEXT2:
MOV R0,#DISM0
MOV DISM8,#7FH
MOV R1,#8
DISP0:
MOV DPTR,#0900H
MOV A,@R0
MOVX @DPTR,A ;A口送段码
MOV DPTR,#4900H
MOV A,DISM8
MOVX @DPTR,A ;B口送位码
RR A
MOV DISM8,A
MOV R2,#3
DEL:MOV R3,#250
DJNZ R3,$
DJNZ R2,DEL ;延时
INC R0
DJNZ R1,DISP0
RET
RET
END
六、操作说明
运行后电子钟从00:00:00开始计时
用键1控制作时钟调整状态输入:按下一次进入时钟调整状态下的“时”调整,再按下一次进入“分”调整,再按下一次进入“秒”调整,再按下一次退出时钟调整状态。处于调整状态时相应的调整部分闪烁显示。
用键2调整时钟:在时钟调整状态下有效,按下一次闪烁的部分加1。
七、设计总结
1、本设计的优缺点
●优点:满足方案一所有要求。按键测试部分精彩。模块化设计思路清晰,易于编程调试。
●缺点:
1.本来坚持不重复自己原则(DRY),但是由于8051汇编指令缺少相等则转移、不带进位的减法等指令,使得其做多路判断不便。做判断调试未果,只好在模块3转换段码模块中使用了几处重复代码。
2.在写报告时发现源代码中的修改模块也做了到60H判断,实际上这是没有必要的,因为在转换段码模块已经做了判断。
2、心得体会
此次课程设计有了老师的设计指南起点高了很多,思路也更清晰。通过此次电子钟的设计,我掌握了如何运用设置标志来模块化优化设计,如何充分利用μvision IDE工具里的设置断点、单步运行(F11)、运行(F5)、查看/修改RAM、查看端口、定时器等来调试程序,了解了proteus电路图绘制与仿真,在程序设计和程序调试方面收获很大,通过十道思考题,提升了举一反三的能力。当程序写完后认为理论上是对的一运行却无法正常工作时无比懊恼,只能说服自己静下心耐心分模块一步一步调试,调试的过程中很明显地感受到到标志设置与模块化带来的优越性,这使得通过调试反馈修改让电子钟从不显示到显示一位到显示八位到按键一正常工作再到按键二正常工作完成设计,当自己编写的程序运行良好性能不错时无比喜悦,也是一小成就。此次课程设计还让我明白了算法设计与注重调试方法的重要性,在算法思路上多思考会带来代码编写的效率提升,充分利用调试的各种工具可以大大缩短调试程序的时间。
八、参考文献
[1] 万福君. 单片微机原理系统设计与应用. 中国科学技术大学出版社. 2005
[2] 李继灿. 新编微型计算机原理及应用. 清华大学出版社. 2008