资源描述
. .
西南科技大学
2021级微机原理与接口技术
课程设计报告
课题名称
微机原理与接口技术
姓 名
学 号
院、系、部
制造科学与工程学院
专 业
指导教师
2021年月日
. .word.zl.
. .
一、设计任务及要求:
设计任务:
1、利用MCS-51部定时器定时,编程实现年、月、日、时、分、秒的显示,显示格式为: 年月日: 10-06-18
时分秒: 09-12-35
也可自行设定显示格式,两局部可按键切换显示;
2、能按键调整日期、时间的数值;
3、可设定时间报警,报警的时间至少有2个,报警时应有报警指示。
4、要求至少调试出任务的前两项。
要 求:
首先进展预设计,根据设计的任务要求,先确定设计的硬件电路案,然后进展硬件电路的初步设计,在计算机上画出硬件电路图,在教师的指导下进展修正硬件电路图,并对所涉及的参数进展计算。
在确定硬件的根底上,要进展软件的总体设计,包括软件主流程的设计以及各子程序的设计,同时,要写出详细的操作说明,如时间的调整法,显示窗口的时间切换等,以配合软件的设计。
然后进入硬件的调试及编程工作,设计组的同学可根据任务分工,有调试硬件各功能模块的,如键盘子程序、显示子程序等,有进展整体程序的编制的,各模块的编制过程中要注意资源的衔接。
最后进入联机调试,联机调试的原那么也要采用分步走的原那么,各个功能模块要逐步套入,通过一个再增加一项功能,从而到达设计的总体要求,不要上来编制个最大的程序,最后无法查找错误。
最后写出设计报告。
指导教师签名:
2021年月日
三、成绩
指导教师签名:
年 月 日
目 录
一、 绪 言…………………………………………………………………………………………1
二、系统设计………………………………………………………………………………………1
2.1系统整体流程图…………………………………………………………………………1
2.2日历时钟的控制案论证……………………………………………………………1
2.3单片机的选择案论证…………………………………………………………………2
2.4键盘选择案论证………………………………………………………………………2
2.5显示模块的选择案论证………………………………………………………………2
2.6模块的选择案论证……………………………………………………………………2
三、硬件电路设计………………………………………………………………………………2
3.1日历时钟的控制电路图…………………………………………………………………2
3.2行列式键盘的设计……………………………………………………………………3
3.3数码管显示电路的设计…………………………………………………………………3
3.4蜂鸣器驱动电路的设计…………………………………………………………………4
3.5主要元器件选择…………………………………………………………………………4
四、程序流程图…………………………………………………………………………………5
五、 c语言程序设计……………………………………………………………………………5
六、日历时钟的控制器仿真……………………………………………………………………19
6.1 Keil调试………………………………………………………………………………19
6.2 Proteus调试……………………………………………………………………………19
七、 完毕语………………………………………………………………………………………20
八、 参考文献……………………………………………………………………………………21
1、绪 言
近年来随着科技的飞速开展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机面知识是不够的,还应根据具体硬件构造,以及针对具体应用对象特点的软件结合,加以完善。 电子时钟是现代社会中的主要计时工具之一,广泛应用于手机,电脑,汽车等社会生活需要的各个面,及对时间有要求的场合。本设计采用AT89C51单片机作为主要核心部件,附以上电复位电路,时钟电路及按键调时电路组成。数字钟已成为人们日常生活中: 必不可少的必需品, 广泛用于个人家庭以及车站、 码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的便。 由于数字集成电路技术的开展和采用了先进的英技术,使数字钟具有走时准确、性 能稳定、携带便等优点,它还用于计时、自动报时及自动控制等各个领域。
2、系统设计
2.1 设计任务
1、利用MCS-51部定时器定时,编程实现年、月、日、时、分、秒的显示,显示格式为: 年月日: 10-06-18
时分秒: 09-12-35
也可自行设定显示格式,两局部可按键切换显示;
2、能按键调整日期、时间的数值;
3、可设定时间报警,报警的时间至少有2个,报警时应有报警指示。
4、要求至少调试出任务的前两项。
2.2 案比较与论证
2.2.1 系统整体流程图
人机接口
显示电路
软件控制程序
电源电路
单片机控制电路
2.2.2 电子密码锁的控制案论证
用4*3的行列式键盘组成0-9数字键及确认键、删除键,从矩阵键盘输入8位数密码,起始密码由程序设定,输入完后按确定键开锁,取消键去除所有输入。用8位数码管组成显示电路提示信息,当输入密码时,只显示“-〞,当密码位输入完毕按下确认键时,对输入的密码与设定的密码进展比较,假设密码正确,那么开锁,此处用LED发光二极管亮一秒钟做为提示。当密码不正确时,制止按键输入3秒,同时启动蜂鸣器发出“嘀、嘀〞报警声。
2.2.3 单片机的选择案论证
案一:采用可编程逻辑期间CPLD 作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进展功能扩展。采用并行的输入输出式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高,且从使用及经济的角度考虑我们放弃了此案
案二:采用Atmel公司的AT89S52单片机作为控制器。AT89S52是一个低功耗,高性能的51核的CMOS 8位单片机,片含8k空间的可反复擦些1000次的Flash只读存储器,具有256 bytes的随机存取数据存储器〔RAM〕,32个IO口,2个16位可编程定时计数器。
综合考虑,选择案二,采用Atmel公司的AT89S52单片机作为控制器。
2.2.4 键盘选择案论证
案一:采用独立式键盘。由于各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可以很容易的判断哪个按键被按下。此种键盘适用于按键较少或操作速度较高的场合。但此题发挥局部要求12个功能键,按键数目较多,这就需要较多的输入口线,而且电路构造复杂。故此案不可取。
案二:采用行列式键盘。它由行线和列线组成,按键位于行列的穿插点上,行线信号和列线信号分别通过两个接口和CPU相连,通过行列扫描法判定按键的位置,此案适用于按键较多的场合。
通过对电子密码锁题目的分析,采用4*3行列式键盘。
2.2.5 显示模块的选择案论证
案一:采用带字库LCD模块显示。能显示复杂的信息,具有质量轻,体积小,功耗低,指令功能强,接口简单,可靠性强等优点,显示容丰富,图形美观,易于人机交流。但是价格昂贵。
案二:采用LED数码管显示。数码管能显示数字和符号,但是占用IO口资源较多,对于简单的电路可以选用此案。
电子密码锁,电路简单,选用案二,显示所需信息。
2.2.6 模块的选择案论证
当输入密码时,假设密码正确,那么开锁,此处用LED发光二极管亮一秒钟做为提示。当密码不正确时,制止按键输入3秒,同时发出“嘀、嘀〞报警声,为实现此功能我们选用LED发光二极管和蜂鸣器混合使用。
3 硬件电路设计
3.1 电子密码锁控制电路图
图2 电子密码锁控制线路图
3.2 行列式式键盘的设计
键盘电路如图3所示。设计数字键0~9 的键号依次为0~9,取消键的键号为10,确认键的键号为11,键号可按键值=行首键号〔0、4、8、12〕+列键号〔0、1、2、3〕公式计算。
图3 键盘电路
3.3 数码管显示电路的设计
数码管驱动采用8 个共阴极数码管显示, 由于单片机的驱动能力有限,采用74LC245 作为数码管的驱动,在7 段码输出线上串联100 欧姆电阻起限流作用。其电路如图3所示。
图4 数码管显示电路
3.4 蜂鸣器驱动电路的设计
蜂鸣器的驱动采用NPN 三极管2484 来驱动,低电平有效。其电路如图5 所示。
图5 蜂鸣器电路图
3.5 主要元器件选择
主要元器件选用型号和数量如表1所示:
表1 主要元器件清单
序号
材料名称
规格型号
数量
元件代号
1
单片机
AT89C51
1
U1
2
晶振
12MHz
1
X1
3
电容
22PF
2
C1、C2
4
键盘
4*3
12
5
数码管
MPX8
1
6
蜂鸣器
1
7
发光二极管
1
D1
8
驱动
74LS45
1
U2
9
三级管
2484
1
Q1
10
排阻
10k
1
RP1
4 程序流程图
时间程序流程图
5 C语言程序设计
程序清单:
设置变量缓冲区
SEC EQU 30H
MIN EQU 31H
HOUR EQU 32H
DAY EQU 33H
MON EQU 34H
YEAR EQU 35H
;*************************************************************************
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INT_T0
ORG 0030H
MAIN: LCALL CHUSHI
MOV TMOD,#01H
MOV TH0,#4CH
MOV TL0,#00H
MOV IE,#82H
SETB TR0 ;开启定时器T0
MOV 50h,#00H ;启用定时器T0的初始值
MOV 37H,#0 ;显示日期和时间的标志
MOV 38H,#0 ;12进制和24进制的标志
MOV 39H,#23 ;默认时间为24进制
CLR F0 ;日历定时0和1的标志
LOOP: MOV A,37H
JZ SHIJIAN
MOV R1,#33H
LJMP BEGIN1
SHIJIAN:MOV R1,#30H ;初始化显示
BEGIN1: MOV A,38H
JZ JZ24
MOV 39H,#11
LJMP BEGIN2
JZ24: MOV 39H,#23
BEGIN2: LCALL DISPLAY
LCALL KEY ;扫描键盘
CJNE A,#05H,DINGS ;判断键值是否为5号键
LCALL DY1MS ;假设是,那么实现调整LCALL TIAOT
LCALL TIAOT
LCALL DISPLAY
LJMP DOWN
DINGS: CJNE A,#06H,QIEH ;判断键值是否为6号键,定时
LCALL DY1MS ;假设是,那么实现调整
CPL F0
JNB F0,DI0 ;F0=0,定时器0
LCALL DISHI1 ;F0=1,定时器1
LCALL DISPLAY
LJMP DOWN
DI0: LCALL DISHI0
LCALL DISPLAY
LJMP DOWN
QIEH: CJNE A,#07H,BIANH ;判断键值是否为7号键,切换
LCALL DY1MS ;假设是,那么切换显示,年月日与时分秒切换
LCALL DISPLAY
MOV A,37H
CPL A
MOV 37H,A
LJMP DOWN
BIANH: CJNE A,#08H,DOWN ;判断是否为八号键,变换进制
LCALL DY1MS
LCALL DISPLAY
MOV A,38H
CPL A
MOV 38H,A
DOWN: LJMP loop
;调整子程序**********************************************************************
TIAOT: push acc
CLR PSW.1 ;初始化标志位
TOP1: LCALL KEY ;扫描键盘
CJNE A,#08H,PANFAN ;判断键值是否为8号键,不是8键,那么继续判断
CPL PSW.1 ;取反标志位
PSW.1,TC ;标志位为1,调整时间change0
LCALL CHG1 ;标志位为0,调整日期change1
LCALL DISPLAY
LJMP TOP1
TC: CLR TR0
LCALL CHG0
LCALL DISPLAY
PANFAN: CJNE A,#5,TOP1
pop acc
RET
;调整时间子程序******************************************************************
CHG0: MOV R1,#30H
LCALL DISPLAY
LCALL KEY
S: CJNE A,#01H,M ;判断键值,是否为1号键
MOV R0,#SEC ;键值为01,即1号键调整秒
MOV A,R0 ;进制
CJNE A,#59,L0 ;判断秒是否为59
MOV SEC,#00 ;假设是,秒清零
LCALL DISPLAY
LJMP CHG0
L0: INC A
MOV R0,A
LCALL DISPLAY
LJMP CHG0
M: CJNE A,#02H,H ;判断键值,是否为02H
MOV R0,#MIN ;假设是,即2号键,那么调整分钟
MOV A,R0
CJNE A,#59,L2 ;判断分是否为59
MOV MIN,#00 ;假设是,分钟清零
LCALL DISPLAY
LJMP CHG0
L2: INC A
MOV R0,A
LCALL DISPLAY
LJMP CHG0
H: CJNE A,#03H,K ;判断键值,是否为03H
MOV R0,#HOUR ;键值为03,即3号键调整小时
MOV A,R0
CJNE A,39H,L4 ;判断小时是否为23
MOV HOUR,#00
LCALL DISPLAY
LJMP CHG0
L4: INC A
MOV R0,A
LCALL DISPLAY
LJMP CHG0
K: CJNE A,#04H,CHG0
SETB TR0
RET
;调整日期**********************************************************************
CHG1: MOV R1,#33H
LCALL DISPLAY
LCALL KEY
R: CJNE A,#01H,Y ;判断键值,是否为1H
MOV R0,#DAY ;键值为01,调整日期
MOV A,R0 ;进制
CJNE A,#31,B0 ;判断30
MOV DAY,#00
LCALL DISPLAY
LJMP CHG1
B0: INC A
MOV R0,A
LCALL DISPLAY
LJMP CHG1
Y: CJNE A,#02H,N ;判断键值,是否为2
MOV R0,#MON
MOV A,R0
CJNE A,#12,B1 ;判断月是否12
MOV MON,#00
LCALL DISPLAY
LJMP CHG1
B1: INC A
MOV R0,A
LCALL DISPLAY
LJMP CHG1
N: CJNE A,#03H,K1 ;判断键值,是否为FB
MOV R0,#YEAR ;键值为3,调整年
MOV A,R0
CJNE A,#99,B2
MOV YEAR,#0
LCALL DISPLAY
LJMP CHG1
B2: INC A
MOV R0,A
LCALL DISPLAY
LJMP CHG1
K1: CJNE A,#04H,CHG1
RET
;第一次定时子程序*****************************************************************
DISHI0: MOV 40H,SEC ;保存原值
MOV 41H,MIN
MOV 42H,HOUR
LCALL CHG0 ;调用调整子程序
MOV 43H,SEC
MOV 44H,MIN
MOV 45H,HOUR
LCALL DI
RET
;第二次定时子程序*****************************************************************
DISHI1: MOV 40H,SEC
MOV 41H,MIN
MOV 42H,HOUR
LCALL CHG0
MOV 46H,SEC
MOV 47H,MIN
MOV 48H,HOUR
LCALL DI
RET
DI: MOV SEC,40H ;恢复原值
MOV MIN,41H
MOV HOUR,42H
LCALL DISPLAY
RET
;定时器T0子程序*******************************************************************
INT_T0: INC 50h
mov r5,50h
CJNE R5,#20,DUAN11 ;判断是否到一秒
LJMP DUAN12
DUAN11: LJMP NEXT0
DUAN12: MOV 50h,#0 ;假设是,那么重新初始化循环次数
MOV A,SEC
CJNE A,#59,DUAN21 ;判断秒是否为59
LJMP DUAN22
DUAN21: LJMP N0
DUAN22: MOV SEC,#00 ;假设是那么秒清零
lcall display
MOV A,MIN
CJNE A,#59,DUAN31 ;判断分钟是否为59
LJMP DUAN32
DUAN31: LJMP N1
DUAN32: MOV MIN,#00 ;假设是,那么分钟清零
lcall display
MOV A,HOUR
CJNE A,39H,DUAN41 ;判断小时是否23
LJMP DUAN42
DUAN41: LJMP N2
DUAN42: MOV HOUR,#00 ;假设是,小时清零
lcall display
MOV A,DAY
PUSH ACC
MOV A,MON
CJNE A,#1,YUE3
POP ACC
LJMP RR2
YUE3: CJNE A,#3,YUE5 ;1,3,5,7,8,10,12月31天
POP ACC
LJMP RR2
YUE5: CJNE A,#5,YUE7
POP ACC
LJMP RR2
YUE7: CJNE A,#7,YUE8
POP ACC
LJMP RR2
YUE8: CJNE A,#8,YUE10
POP ACC
LJMP RR2
YUE10: CJNE A,#10,YUE12
POP ACC
LJMP RR2
YUE12: CJNE A,#12,YUE4
POP ACC
LJMP RR2
YUE4: CJNE A,#4,YUE6 ;4,6,9,11月30天
POP ACC
LJMP RR1
YUE6: CJNE A,#6,YUE9
POP ACC
LJMP RR1
YUE9: CJNE A,#9,YUE11
POP ACC
LJMP RR1
YUE11: CJNE A,#11,YUE2
POP ACC
LJMP RR1
YUE2: MOV A,YEAR ;2月:是闰年29天,是平年28天
MOV B,#4
DIV AB
MOV A,B
JZ RYUE
PYUE: POP ACC
LJMP RR00
RYUE: POP ACC
LJMP RR01
RR00: CJNE A,#28,N3
MOV DAY,#1
LCALL DISPLAY
LJMP RR3
RR01: CJNE A,#29,N3
MOV DAY,#1
LCALL DISPLAY
LJMP RR3
RR1: CJNE A,#30,N3
MOV DAY,#1
LCALL DISPLAY
LJMP RR3
RR2: CJNE A,#31,N3
MOV DAY,#1
LCALL DISPLAY
LJMP RR3
RR3: MOV A,MON
CJNE A,#12,N4 ;判断月份是否为11
MOV MON,#1 ;假设是,那么月份清零
lcall display
MOV A,YEAR ;年份加一
CJNE A,#99,N5
MOV YEAR,#0
lcall display
LJMP NEXT0
N0: INC A ;否那么,秒加一
MOV SEC,A
lcall display
LCALL DFG
LJMP NEXT0
N1: INC A ;分钟加一
MOV MIN,A
lcall display
LCALL DFG
LJMP NEXT0
N2: INC A ;小时加一
MOV HOUR,A
lcall display
LCALL DFG
LJMP NEXT0
N3: INC A ;日期加一
MOV DAY,A
lcall display
LJMP NEXT0
N4: INC A ;月份加一
MOV MON,A
lcall display
LJMP NEXT0
N5: INC A
MOV YEAR,A
LCALL DISPLAY
NEXT0: MOV TH0,#4CH
MOV TL0,#00H
RETI
;判断是否到定时时间子程序*******************************************************
DFG: MOV A,SEC ;判断是否到第一个定时时间
CJNE A,43H,DOWN1
MOV A,MIN
CJNE A,44H,DOWN1
MOV A,HOUR
CJNE A,45H,DOWN1
CLR P3.6 ;假设到第一个定时时间,那么亮灯
DOWN1: MOV A,SEC ;判断是否到第二个定时时间
CJNE A,46H,DOWN2
MOV A,MIN
CJNE A,47H,DOWN2
MOV A,HOUR
CJNE A,48H,DOWN2
CLR P3.6 ;假设到第二个定时时间,那么亮灯
DOWN2: LCALL KEY
LCALL DY1MS ;扫描键盘
CJNE A,#04H,DO ;假设键值为4号键,那么灭灯
setb p3.6
DO: LCALL DISPLAY
RET
;延时1ms **********************************************************************
DY1MS: MOV R5,#0FAH
LOOP7: NOP
NOP
DJNZ R5,LOOP7
RET
;初始化CHUSHI******************************************************************
CHUSHI: MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
MOV DAY,#26
MOV MON,#1
MOV YEAR,#11
RET
;子程序 KSI :判定有无闭合键的*************************************************
KSI: MOV A, #00H
MOV P1, A ;P2口送00H
LCALL DY1MS
MOV A,P3
CPL A
ANL A, #03H ;屏蔽高6位
RET
;键盘扫描**********************************************************************
key: LCALL KSI ;检查是否有键闭合
JNZ LK1
LJMP END1
LK1: LCALL DY1MS
LCALL KSI ;再检查是否有键闭合
JNZ LK2 ;有键闭合转移到LK2
LJMP END1 ;无键闭合,延时12ms后转KEY1
LK2: MOV A,#0FEH
MOV P1,A
MOV R3,A
MOV R4,#00H
LK4: MOV A,P3
ACC.0, LONE ;ACC.3=1,第一列无键闭合,转LONE
MOV A, #01H
lJMP LKP
LONE: ACC.1, NEXT ;ACC.2=1,第二列无键闭合,转LTWO
MOV A, #05H
lJMP LKP
LKP: ADD A, R4 ;计算键码
PUSH ACC ;保护键码
LK3: lCALL DY1MS ;延时1ms
lCALL KSI ;检查是否继续闭合,假设闭合再延时
JNZ LK3
POP ACC ;假设键起,那么键码送A
RET
NEXT: INC R4
MOV A,R3
JNB ACC.3,END1
RL A
MOV R3,A
MOV P1,A
lJMP LK4 ;进展下一列扫描
END1: RET
;显示子程序********************************************************************
DISPLAY: push acc
MOV R3,#03H
MOV R2,#0FEH
DISLOOP: MOV A,R2
MOV P2,A
MOV A,R1
MOV B,#10
DIV AB
MOV 36h,A
MOV A,B
MOV DPTR,#KEYBOARD
MOVC A,A+DPTR
MOV P0,A ;显示低位
LCALL DY1MS
MOV A,R2
RL A
MOV R2,A
MOV P2,A
MOV A,36h
MOV DPTR,#KEYBOARD
MOVC A,A+DPTR
MOV P0,A ;显示高位
LCALL DY1MS
MOV A,R2
RL A
JNB ACC.0,EXIT
MOV R2,A
MOV P2,A
MOV A,#10
MOV DPTR,#KEYBOARD
MOVC A,A+DPTR
MOV P0,A
LCALL DY1MS
MOV A,R2
RL A
MOV R2,A
INC R1
DJNZ R3,DISLOOP
EXIT: pop acc
RET
;断码值***********************************************************************
KEYBOARD: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
END
}
6 电子密码锁控制器仿真
在完成了电子密码锁硬件设计和软件设计以后,便进入系统的调试阶段。系统的调试步骤和法根本上是一样的,但具体细节和所采用的开发系统以及用户系统选用的单片机型号有关,如可选用Keil软件进展软件调试,用Proteus软件完成硬件调试。
6.1 Keil调试
6.2 Proteus调试
7 完毕语
通过这次课程设计,使我得到了一次用专业知识和专业技能去分析问题、解决问题全面系统的锻炼。使我在单片机的根本原理、单片机应用系统开发过程,以及用c语言设计程序的思路技巧等面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的根底。
8 参考文献
1.期刊类
【格式】[序号]作者.篇名[J].刊名,出版年份,卷号〔期号〕:起止页码.
【举例】
[1] 海粟.浅议会计信息披露模式[J].财政研究,2004,21(1):56-58.
[2] 夏惠.高等学校毕业论文教学情况调研报告[J].高等理科教育,2004(1):46-52.
[3] Heider, E.R.& D.C.Oliver. The structure of color space in naming and memory of two languages [J]. Foreign Language Teaching and Research, 1999, (3): 62 – 67.
2.专著类
【格式】[序号]作者.书名[M].出版地:,出版年份:起止页码.
【举例】[4] 家澍,林志军.现代西财务会计理论[M].:大学,2001:42.
[5] Gill, R. Mastering English Literature [M]. London: Macmillan, 1985: 42-45.
3.报纸类
【格式】[序号]作者.篇名[N].报纸名,出版日期〔版次〕.
【举例】
[6] 大伦.经济全球化的重要性[N]. 光明日报,1998-12-27(3).
[7] French, W. Between Silences: A Voice from China[N]. Atlantic Weekly, 198
展开阅读全文