单片机原理与接口设计数字钟伟福实现.docx
- 文档编号:5800913
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:72
- 大小:35.54KB
单片机原理与接口设计数字钟伟福实现.docx
《单片机原理与接口设计数字钟伟福实现.docx》由会员分享,可在线阅读,更多相关《单片机原理与接口设计数字钟伟福实现.docx(72页珍藏版)》请在冰豆网上搜索。
单片机原理与接口设计数字钟伟福实现
题目:
数字时钟的设计与实现
一.功能要求:
1.用单片机和6位LED数码管显示时、分、秒,实现从00时00分00秒----23时59分59秒循环运行。
2.用按键实现时、分、秒的调整。
3.整点提醒:
0、1、2……23和短蜂鸣。
4.省电功能:
关闭显示。
5.定时设定提醒:
时间到时发出五次蜂鸣声
6.秒表功能:
显示XX分XX秒XX
按“复位”键:
显示00分00秒00;
按“启动”键:
从00分00秒00开始计时
按“停止”键:
显示实际计时XX分XX秒XX。
二.硬件设计要求:
1.用伟福6000实验装置上8255的A囗作显示段码锁存器,B囗作位码锁存器,利用发的实验器材6位LED数码管显示时、分、秒。
2.利用伟福6000实验装置上8255的B囗的6根位码输出线和8255C囗中的PC0作按键的输入囗线,实现最多6个按键的识别,作为实现上述功能要求的硬件保证。
3.伟福6000实验装置上提供给该课题的硬件是:
AT89C51单片机(包括P1囗、P3囗)、8位可编程並行I/O囗8255(包括A囗、B囗、C囗)、地址译码电路、蜂码器及直流电源。
4.本次设计提供给各组的器材有:
(1)印刷电路板一块
(2)7406集成电路3片
(3)LED数码管6个
(4)1K排阻2个,4.7K电阻一个。
(5)40芯IC插座2个、14芯IC插座3个
(6)按键6个
(7)焊锡、导线若干。
三.软件设计(仅供参考):
1.主程序流桯图
2.显示子程序的设计:
(1)釆用十进制BCD
(2)显示缓冲区的分配
(3)要显示的数据送显示缓冲区
(4)把显示的数据置换出段码
(5)送段码和位码,进行显示
(6)延时
3.定时中断服务子程序的设计
(1)利用定时器T0定时10毫秒,累计到1秒时秒计数加1,累计到60秒时分计数加1,累计到60分时时计数加1,累计到24小时从头开始。
(2)注意保护现场和恢复现场
(3)注意设置毫秒、秒、分、时的存放单元
四、软件仿真
仿真部分由Protues实现。
Protues可以嵌入单片机的二进制代码,便于程序调试。
本次仿真的电路图如下所示:
其中,按键为输入电路,为行列式设计,行线接入8255芯片的PC0口,列线分别对应接入8255芯片的PB0~PB3口,与数码管的位选线共享端口。
数码管为输出电路。
本次实验一共要使用6个数码管,以动态显示方式轮番输出字符,6个数码管的段码线相互并联后接入8255芯片的PA端口,a、b、c、d、e、f、g端口分别连接PA0~PA6端口,在8255芯片引脚和段码线之间分别一一串联7406芯片、并联一个排阻以提供激励,使数码管发亮。
位选线则以数码管的接地线组成,从时十位、时个位、分十位、分个位、秒十位、秒个位分别接入8255芯片的PB0~PB5端口,其中PB0~PB3这四个端口分别并联上四个按键。
同理,每个引脚和8255芯片之间都一一串联上7406芯片和并联上排阻。
位选线负责选取某一时间片要显示哪一个数码管,显示间隔由源程序决定。
五、焊接
本次实验由于没有提供8051芯片、8255芯片。
上述芯片均由伟福实验箱提供,焊接的时候需要在万用板上面预留PA、PB接线口。
另外,万用板上面同时需要预留电源的正负极、PC0口接线,共计17个接线口。
由于万用板的大小的限制及芯片引脚定义的影响,实际上的电路图不会和仿真软件的电路图完全一致,不过大体上还是一样的。
还有,本次焊接实际上需要比较多的电线,尤其是数码管部分,由于相邻引脚非常贴近,在焊接的时候要非常留心,谨防相邻两点短路。
在焊接完成后,由于背板上面线路众多,需要用胶纸固定整理,防止导线脱落。
焊接完成后,万用板上面已经有相应的接线,于是进行硬件实现部分。
六、硬件实现
本次硬件实现部分由伟福Lab6000实验箱提供8051芯片和8255芯片,分别连接万用板相应的接线。
由伟福的Wave6000软件向实验箱上面的8051芯片烧入时钟的程序。
另外,电源的正负极也是由Lab6000提供。
电路板中有6个按键,不过实际上使用的有4个,就是离PA、PB连接端口较远的4个起作用,离PA、PB连接端口较近的两个没有定义。
从远离端口的按键开始依次编号K1、K2、K3、K4,每个按键都有如下功能:
1)当先按K1的时候,系统就进入调节时间状态,数码管上就显示时钟。
K2、K3、K4的功能依次为选择调整的单元(时、分、秒),单元数值加1,退出调整状态,单元数值减1;
2)当先按K2的时候,系统不作出任何反应,等待用户按K1、K3、K4;
3)当先按K3的时候,系统就进入省电模式,数码管熄灭,然后按K1、K2、K3、K4任意一键即可点亮数码管并还原到上次的显示状态;
4)当先按K4的时候,系统就进入秒表状态,数码管上面就显示秒表。
K1、K2、K3、K4的功能依次为切换至时钟、显示暂停变化(内部继续计时)或者数码管继续变化、复位清零、暂停计时。
七、程序
所有程序如下所示
ORG
0000H
AJMP
MAIN
ORG
000BH
;T0的中断入口
AJMP
IT0P
MAIN:
MOV
SP,#70H
;设置堆栈
MOV
36H,#00H
;秒
MOV
37H,#00H
;分
MOV
38H,#00H
;时
MOV
43H,#99H
;给闹钟一个初值
MOV
A,#89H
;工作方式
MOV
DPTR,#0FF7FH;
MOVX
@DPTR,A
;工作方式
MOV
TMOD,#01H
;设T0为方式1
初始状态
MOV
39H,#100
;装入中断次数
SETB
ET0
;允许T0申请中断
SETB
EA
;总中断允许
MOV
TH0,#0D8H
;给T0装入计数初值
MOV
TL0,#0F0H
;
START:
SETB
TR0
;启动T0
MOV
3AH,#36H
;给数据处理一个初值
LCALLDATAT
;数据处理
LCALLDISPLAY
;显示
MOV
A,38H
;判断闹钟的时
CJNE
A,43H,KEYI
;不相等就跳
MOV
A,37H
;判断闹钟的分
CJNE
A,42H,KEYI
;
MOV
A,36H
;判断闹钟的秒
CJNE
A,41H,KEYI
;
CLR
P1.0
;启动蜂鸣
KEYI:
LCALLKS1
;判断有没键按下
判断键按下?
JZ
LK1
;有按下,是抖动?
LJMP
START
;回主程序
LK1:
LCALLDIR
;停一下
防抖动
LCALLDIR
;
LCALLKS1
;再检查有没键按下
JZ
LK2
;有按下则扫描并处理
LJMP
START
;回主程序
LK2:
ACALLLK
;扫描键
扫描
MOV
40H,#00H
;按键次数
LK3:
LCALLKS1
;是否松手
松手检测
JZ
LK3
;
MOV
A,3DH
;扫描得来的键位
JB
Acc.0,CHTIMEI;从左到右数键1
调时
{主菜单}
JB
Acc.1,CLOCKI;
闹钟
JB
Acc.2,SAVEI;
省电
JB
Acc.3,WATCHI;
秒表
LJMP
START
;
CHTIMEI:
LJMP
CHTIME
;调时入口地址
CLOCKI:
LJMP
CLOCK
;闹钟入口地址
SAVEI:
LJMP
SAVE
;省电入口地址
WATCHI:
LJMP
WATCH
;秒表入口地址
CHTIME:
CLR
TR0
;暂停时钟时钟
调时-------功能
MOV
3AH,#36H
;给数据处理一个初值
LCALLDATAT
;数据处理
LCALLDISPLAY
;显示
LCALLKS1
;判断有没键按下
判断键按下?
JZ
LK4
;有按下,是抖动?
LJMP
CHTIME
;返回调时
LK4:
LCALLDIR
;停一下
调时防抖动
LCALLDIR
;
LCALLKS1
;再检查有没键按下
JZ
LK6
;有按下则扫描并处理
LJMP
CHTIME
;返回调时
LK6:
LCALLLK
;扫描键
LK5:
LCALLKS1
;是否松手
JZ
LK5
;
MOV
A,3DH
;扫描得来的键位
JB
Acc.0,XUANW;从左到右数键1
选位
{调时菜单}
JB
Acc.1,ADDBCD;
加1
JB
Acc.2,OUT
;
退出
JB
Acc.3,SUBCD;
减1
LJMP
CHTIME
;返回调时
XUANW:
MOV
A,#36H
;选位的初值
调时选位
INC
40H
;累加偏移量
ADD
A,40H
;
CJNE
A,#39H,CHTIME;判断是否选位过度
OUT:
LJMP
START
;回主程序
调时退出
ADDBCD:
MOV
A,#36H
;操行位初值
调时加1
ADD
A,40H
;求出操作位
MOV
R0,A
;
INC
@R0
;+1
LJMP
CHTIME
;返回调时
SUBCD:
MOV
A,#36H
;操行位初值
调时减1
ADD
A,40H
;求出操作位
MOV
R0,A
;
DEC
@R0
;-1
LJMP
CHTIME
;返回调时
CLOCK:
MOV
41H,#00H
;闹钟初值
闹钟-------功能
MOV
42H,#00H
;
MOV
43H,#00H
;
CLOCK1:
MOV
3AH,#41H
;给数据处理一个初值
LCALLDATAT
;数据处理
LCALLDISPLAY
;显示
LCALLKS1
;判断有没键按下
判断键按下?
JZ
LK14
;有按下,是抖动?
LJMP
CLOCK1
;返回闹钟
LK14:
LCALLDIR
;停一下
闹钟防抖动
LCALLDIR
;
LCALLKS1
;再检查有没键按下
JZ
LK16
;有按下则扫描并处理
LJMP
CLOCK1
;返回闹钟
LK16:
LCALLLK
;扫描键
LK15:
LCALLKS1
;是否松手
JZ
LK15
;
MOV
A,3DH
;扫描得来的键位
JB
Acc.0,XUANW1;从左到右数键1
选位
{闹钟菜单}
JB
Acc.1,ADDBCD1;
加1
JB
Acc.2,OUT1
;
退出
JB
Acc.3,SUBCD1;
减1
LJMP
CLOCK1
;返回闹钟
XUANW1:
MOV
A,#41H
;选位的初值
闹钟选位
INC
40H
;累加偏移量
ADD
A,40H
;判断是否选位过度
CJNE
A,#44H,CLOCK1;返回闹钟
OUT1:
LJMP
START
;回主程序
闹钟退出
ADDBCD1:
MOV
A,#41H
;操行位初值
闹钟加1
ADD
A,40H
;求出操作位
MOV
R0,A
;
INC
@R0
;+1
LJMP
CLOCK1
;返回闹钟
SUBCD1:
MOV
A,#41H
;操行位初值
调时减1
ADD
A,40H
;求出操作位
MOV
R0,A
;
DEC
@R0
;-1
LJMP
CLOCK1
;返回闹钟
SAVE:
MOV
A,#0FFH
;段码置1
省电-------功能
MOV
DPTR,#0FF7CH;
MOVX
@DPTR,A
;
黑屏省电
LCALLKS1
;判断有没键按下
判断键按下?
JZ
LK24
;有按下,是抖动?
LJMP
SAVE
;返回省电
LK24:
LCALLDIR
;停一下
省电防抖动
LCALLDIR
;
LCALLKS1
;再检查有没键按下
JZ
LK25
;有按下则扫描并处理
LJMP
SAVE
;返回省电
LK25:
LCALLKS1
;是否松手
松手检测
JZ
LK25
;
LJMP
START
;回主程序
省电退出
WATCH:
MOV
44H,#00H
;秒表初值
秒表-------功能
MOV
45H,#00H
;
MOV
46H,#00H
;
GOO:
MOV
A,45H
;继点和暂停的保存
MOV
49H,A
;
MOV
A,46H
;
MOV
4AH,A
;
MOV
A,44H
;
MOV
48H,A
;
CJNE
A,#100,STOP;是否到1秒,未到则返回
MOV
44H,#00H
;脉动清0
INC
45H
;增加秒
MOV
A,45H
;
CJNE
A,#60,STOP
;是否到60秒,未到则返回
MOV
45H,#00H
;秒单元清0
INC
46H
;增加分
STOP:
MOV
3AH,#44H
;给数据处理一个初值
LCALLDATAT
;数据处理
LCALLDISPLAY
;显示
LCALLKS1
;判断有没键按下
判断键按下?
JZ
LK34
;有按下,是抖动?
LJMP
GOO
;返回秒表
LK34:
LCALLDIR
;停一下
防抖动
LCALLDIR
;
LCALLKS1
;再检查有没键按下
JZ
LK36
;有按下则扫描并处理
LJMP
GOO
;返回秒表
LK36:
LCALLLK
;扫描键
LK35:
LCALLKS1
;是否松手
JZ
LK35
;
MOV
A,3DH
;扫描得来的键位
JB
Acc.1,HOLDON;从左到右数键2
继点
{秒表菜单}
JB
Acc.2,WATCH;
秒表复位
JB
Acc.3,STOPI;
连续暂停
OUT3:
LJMP
START
;回主程序
秒表退出
GOON1:
MOV
3AH,#44H
;给数据处理一个初值
秒表连续
LCALLDATAT
;数据处理
MOV
A,45H
;继点和连续暂停的保存
MOV
49H,A
;
MOV
A,46H
;
MOV
4AH,A
;
MOV
A,44H
;
MOV
48H,A
;
STOPI:
MOV
A,44H
;
秒表暂停
CJNE
A,#100,GOON;是否到1秒,未到则返回
MOV
44H,#00H
;脉动清0
INC
45H
;增秒
MOV
A,45H
;
CJNE
A,#60,GOON
;是否到60秒,未到则返回
MOV
45H,#00H
;秒单元清0
INC
46H
;增分
GOON:
LCALLDISPLAY
;显示
LCALLKS1
;判断有没键按下
判断键按下?
JZ
LK44
;有按下,是抖动?
LJMP
STOPI
;返回秒表暂停
LK44:
LCALLDIR
;停一下
防抖动
LCALLDIR
;
LCALLKS1
;再检查有没键按下
JZ
LK46
;有按下则扫描并处理
LJMP
STOPI
;返回秒表暂停
LK46:
LCALLLK
;扫描键
LK45:
LCALLKS1
;是否松手
JZ
LK45
;
MOV
A,3DH
;扫描得来的键位
JB
Acc.1,HOLDON;从左到右数键2继点(秒表之连续暂停菜单)
JB
Acc.2,WATCH1;
复位
JB
Acc.3,GOON1;
连续暂停之连续暂停
LJMP
START
;
退出
WATCH1:
LJMP
WATCH
;
连续暂停的秒表复位
HOLDON:
MOV
A,48H
;把保存值放回秒表
秒表继点
MOV
44H,A
;
MOV
A,49H
;
MOV
45H,A
;
MOV
A,4AH
;
MOV
46H,A
;
LJMP
GOO
;返回秒表
KS1:
MOV
DPTR,#0FF7DH;给PB送0
;子程序之测键按下否
MOV
A,#03FH
;
MOVX
@DPTR,A
;
INC
DPTR
;到PC口
MOVX
A,@DPTR
;取PC值
ANL
A,#01H
;只取第一位
RET
;返回
LK:
MOV
A,#20H
;给初始位选码
;子程序之扫描键
LK9:
MOV
3DH,A
;保存位选码
MOV
DPTR,#0FF7DH;
MOVX
@DPTR,A
;位选码给PB口
INC
DPTR
;到PC口
MOVX
A,@DPTR
;把PC给A
JNB
Acc.0,LK8
;扫到键就跳
MOV
A,3DH
;恢复位码
RR
A
;右移
CJNE
A,#7FH,LK9
;扫了6次?
LK8:
MOV
A,3DH
;恢复位选码
RET
;返回
DATAT:
MOV
R0,3AH
;
;子程序之数据处理
MOV
A,@R0
;
MOV
B,#10
;
DIV
AB
;
MOV
30H,B
;
MOV
31H,A
;
INC
3AH
;
MOV
R0,3AH
;
MOV
A,@R0
;
MOV
B,#10
;
DIV
AB
;
MOV
32H,B
;
MOV
33H,A
;
INC
3AH
;
MOV
R0,3AH
;
MOV
A,@R0
;
MOV
B,#10
;
DIV
AB
;
MOV
34H,B
;
MOV
35H,A
;
DISPLAY:
MOV
A,#20H
;初始化
;子程序之显示
MOV
R0,#30H
;显示初地址
ld0:
MOV
3BH,A
;保存位选
MOV
DPTR,#0FF7DH;
MOVX
@DPTR,A
;位选码给PB口
MOV
A,@R0
;
MOV
DPTR,#TAB
;取表地址
MOVC
A,@A+DPTR
;查表
MOV
DPTR,#0FF7CH;
MOVX
@DPTR,A
;段选给PA
MOV
3CH,#0FFH
;显示的延时
del1:
DJNZ
3CH,del1
;
INC
R0
;
MOV
A,3BH
;恢复位选
RR
A
;
JNB
Acc.7,ld0
;判断是否显示了6次
RET
;返回
DIR:
MOV
3EH,#0AH
;
;子程序之延时
DIR1:
MOV
3FH,#0F0H
;
DIR2:
DJNZ
3FH,DIR2
;
DJNZ
3EH,DIR1
;
RET
;返回
TAB:
DB
0C0H,0F9H,0A4H,0B0H,99H
;LED的字模
DB
92H,82H,0F8H,80H,90H
;0123456789
IT0P:
PUSH
A
;保存A
;时钟中断
MOV
TH0,#0D8H
;重装初值
MOV
TL0,#0F0H
;
INC
44H
;脉动
DJNZ
39H,RETURN
;1秒未到,返回
MOV
39H,#100
;重置中断次数
INC
36H
;增加秒
MOV
A,36H
;
CJNE
A,#60,RETURN;是否到60秒,未到则返回
MOV
36H,#00H
;秒单元清0
SETB
P1.0
;停蜂鸣
INC
37H
;增加分
MOV
A,37H
;
CJNE
A,#60,RETURN;是否到60分,未到则返回
MOV
37H,#00H
;分单元清0
CLR
P1.0
;整点蜂鸣
INC
38H
;增加时
MOV
A,38H
;恢复A中的时
CJNE
A,#24,RETURN;是否到24时,未到则返回
MOV
38H,#00H
;时单元清0
RETURN:
POP
A
;恢复A
RETI
;中断返回
END
八、心得感想
XX1(电路图):
电路图的时候其实也并非简单,为了焊接方便,在了解了电路原理以后,我需要多次重新排版,一次次地连线,然后将每次重新排版的电路图保存下来比较,最后才得出最简单的连接图。
XX2(焊接):
我觉得焊接最首先要做的就是了解芯片的用途,引脚,把电路图看明白,大体回路怎样连线有个谱,怎样编排电路元件才使焊接最容易,这都要对引脚的接法熟悉才行,在焊接时每一步都很重要,我都先会把芯片和数码管的反面图画出来,先找引脚,然后用线连起来,焊接时我最怕两条回路的焊锡连在一起,焊接时我经常把锡焊的太大块以至产生不少错误,不过一熟悉了就会比较快了,不过一焊久了,就会感到烦,特别是焊错时,所以我觉得焊接时心态很重要,这也让我明白做事要认真,特别是我们这个专业,耐心要很好,哪怕错了都要慢慢找,直到纠正过来,虽然过程很辛苦,但焊好那一刻真的感到很满意,因为毕竟是自己做的。
XX3(焊接):
做了焊接以后,我发现动手能力完全不同于平时的课本学习体验的,是一种实践。
有助于对理论知识的理解。
而在操作过程中,熟悉了就能生巧。
XX杰(软件):
一程序的基础
程序的基础很重要。
程序的基础是指程序中所包含的子程序和中断程序。
写一个程序通常要从基本的做起然后不断地累加上去。
每加一层,都要以之前的为基础。
所以如果之前的是正确的,但现在不正确,那就容易显现出问题,方便修改。
如先写显示,再写显示时钟,接着写按键测量和扫描,最后才是功能的实现。
每更加一种,我都会确保之前的为正确。
所以程序的基础很重要。
这个程序的基础包括有数据处理,显示程序,按键检测,按键扫描,延时程序还有时钟的中断。
虽然程序中防抖动和松手检测没有写成子程序,但也是程序的基础。
数据的处理。
这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 接口 设计 数字 钟伟福 实现