作息时间控制系统.docx
- 文档编号:10349343
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:21
- 大小:49.26KB
作息时间控制系统.docx
《作息时间控制系统.docx》由会员分享,可在线阅读,更多相关《作息时间控制系统.docx(21页珍藏版)》请在冰豆网上搜索。
作息时间控制系统
河北工业大学计算机硬件技术基础课程
综合性、开放性实验考试内容
考试题目:
作息时间控制系统
班级:
姓名:
学号:
同组人:
指导老师:
河北工业大学计算机硬件技术基础(MCS-51单片机原理及应用)
课程设计任务书
学院班级设计人_成绩____
一、题目:
作息时间控制系统
二、问题的提出
一般机关、部队、企业等部门尤其是学校,对作息时间有严格的控制,可采用MCS-51单片机设计一个控制作息时间的系统。
作业时间控制系统,由8051内部的定时器,设计一个电子时钟,当电子时钟达到作息时间的点钟时,用实验开发系统中的输入输出设备模拟早晨喇叭在唱歌,提醒晨练,模拟上课下课的打铃,模拟晚上熄灯等。
分析题目,作息时间自己模拟,利用实验开发系统进行设计。
要求用定时器、I/O口以及中断。
具体使用什么器件完全由自己确定。
3、总体设计
本次实验的设计可以分为6个部分:
时间的在八段显示器显示,定时报时
系统,电灯供电系统,以及报时声响中断系统,紧报警系统,中断复位系统。
1.时间的在八段显示器上显示:
通过编写程序代码,实现时间在八段显示器上的显示。
2.定时报时:
在时间的在八段显示器显示模块中加入编写好的定时报时系统,报时装置为蜂鸣器。
3.报时声响中断系统:
通过软件查询方式,来实现此功能,放置在时间的在八段显示器显示模块。
4.紧急报警系统:
通过软件查询方式,来实现此功能,放置在时间的在八段显示器显示模块。
5.电灯供电控制系统:
通过软件查询方式,来实现此功能,放置在时间的在八段显示器显示模块。
6.紧急中断系统:
通过硬件开关控制,来实现程序中断功能
7.人工定时输入系统:
通过硬件键盘输入设备,进行电子时钟任意时间输入,并由紧急中断系统实现随时中断,随时设置时间的功能
四、详细设计:
1、硬件详细设计:
(1)所需设备:
八段显示器,蜂鸣器,LED1,开关sw1,sw2,sw3,定时器0,键盘
(2)连线方式:
占用P1口,以及八段显示器,键盘,蜂鸣器开关sw1,sw2,sw3和LED1。
(3)资源分配:
将P1口合理的分配给八段显示器、蜂鸣器以及开关来完成软件中对硬件的操作。
将地址20h,21h,23h,24h,25h,27h提出使用用于存储时钟的分位,秒位以及时钟的时位,并且使用了第二组的工作寄存器组的r2作为计数器使用,使用了计时器0做定时使用。
2.所需硬件电路图;
P1.0
RST_L
P1.1
SW3
P1.2
BUZZ
P1.3
LED1
P1.4
SW1
P1.5
SW2
P1.6
SCL
P1.7
SDA
P3.2
INT_KEY
五、程序清单
SDABITP1.7;I2C总线定义串行数据存取位
SCLBITP1.6;I2C总线定义串行时钟位
RSTBITP1.0;MCU复位输出信号,低电平复位ZLG7290
INT_KEYBITP3.2;MCU中断信号输入,有效的按键动作使该引脚信号变为低电平
MTDEQU40H;I2C总线发送数据缓冲区(8字节)
MRDEQU48H;I2C总线接收数据缓冲区(8字节)
DisBufEQU38H;显示缓冲区(8字节,可对应8位数码管显示)
;定义ZLG7290器件地址及子地址
ZLG7290EQU70H;ZLG7290的器件地址
ACKBIT10H;应答标志位
SLADATA50H;器件的从地址
SUBADATA51H;器件的子地址
NUMBYTEDATA52H;读/写的字节数变量
KeyDATA53H;返回用户按键值
SystemRegEQU00H;系统寄存器地址,保存ZLG7290系统状态
KeyRegEQU01H;键值寄存器,表示被压按键的键值
CmdBuf0EQU07H;命令缓冲区0
CmdBuf1EQU08H;命令缓冲区1
DpRamEQU10H;显示缓存寄存器
M1EQU20h;定义秒针位
M2EQU21h;定义秒针位2
F1EQU27h;定义分针位
F2EQU23h;定义分针位2
S1EQU24h;定义时针位
S2EQU25h;定义时针位2
ORG8000H
LJMPMAIN
ORG800bh
AJMPtos;定时计数器0的中断程序的入口
ORG8100H
;-------主程序如下:
MAIN:
MOVSP,#70H;堆栈区从70H开始
CLRRST;复位ZLG7290
LCALLDELAY;等待复位完成,ZLG7290复位周期比较长,必须等待
SETBRST;结束复位
LCALLDELAY
lcallClsDisp;清除显示
MainLoop:
movDisBuf+0,#0;上电运行时,8位数码管显示00000000
movDisBuf+1,#0;给显示缓冲区赋值,00000000
movDisBuf+2,#1fh
movDisBuf+3,#0
movDisBuf+4,#0
movDisBuf+5,#1fh
movDisBuf+6,#0
movDisBuf+7,#0
lcallDisplay;调用显示子程序,显示内容
;用按键赋予初值
WaitKey:
JBINT_KEY,WaitKey;查询按键
lcallgetkey
mova,key
jzwaitkey
deckey
movS2,key
movdisbuf+7,key
lcallDisplay
ljmpWaitKey1
WaitKey1:
JBINT_KEY,WaitKey1;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey1
movS1,key
movdisbuf+6,key
lcallDisplay
ljmpWaitKey2
WaitKey2:
JBINT_KEY,WaitKey2;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey2
movF2,key
movdisbuf+4,key
lcallDisplay
ljmpWaitKey3
WaitKey3:
JBINT_KEY,WaitKey3;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey
movF1,key
movdisbuf+3,key
lcallDisplay
ljmpWaitKey4
WaitKey4:
JBINT_KEY,WaitKey4;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey4
movM2,key
movdisbuf+1,key
lcallDisplay
ljmpWaitKey5
WaitKey5:
JBINT_KEY,WaitKey5;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey5
movM1,key
movdisbuf+0,key
lcallDisplay
clrp1.3;开启电灯
movtmod,#01h
movth0,#4ch;开启50ms中断
movtl0,#01h;
movr2,#00h;计数器设置
movIE,#10000010B;开启中断系统
setbtr0;开始计时
sjmp$;程序原地执行,等待中断的产生
tos:
;响应中断
movth0,#04ch
movtl0,#01h
incr2;计数器加一
cjner2,#20,cc
lcallshizhong;一秒中断
movr2,#00h;计数器清零
cc:
jbp1.1,fanhui
jbp1.5,baojing
mova,S1
cjnea,#08h,next
mova,F1
cjnea,#00h,next
mova,F2
cjnea,#00h,next
mova,M2
cjnea,#00h,next
jbp1.4,next
cplp1.2;响铃
setbp1.3;八点关灯
next:
mova,S1
cjnea,#08h,next1
mova,F1
cjnea,#01h,next1
mova,F2
cjnea,#00h,next1
mova,M2
cjnea,#00h,next1
jbp1.4,next2
cplp1.2;响铃
clrp1.3;八点零一开灯
next1:
mova,S1
cjnea,#08h,next2
mova,F1
cjnea,#02h,next2
mova,F2
cjnea,#00h,next2
mova,M2
cjnea,#00h,next2
jbp1.4,next1
cplp1.2;响铃
setbp1.3;八点零二关灯
next2:
reti
baojing:
cplp1.2;报警
sjmpnext2
;返回初始,输入时间
fanhui:
WaitKey6:
JBINT_KEY,WaitKey6;查询按键
lcallgetkey
mova,key
jzwaitkey6
deckey
movS2,key
movdisbuf+7,key
lcallDisplay
ljmpWaitKey7
WaitKey7:
JBINT_KEY,WaitKey7;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey7
movS1,key
movdisbuf+6,key
lcallDisplay
ljmpWaitKey8
WaitKey8:
JBINT_KEY,WaitKey8;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey8
movF2,key
movdisbuf+4,key
lcallDisplay
ljmpWaitKey9
WaitKey9:
JBINT_KEY,WaitKey9;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey9
movF1,key
movdisbuf+3,key
lcallDisplay
ljmpWaitKey10
WaitKey10:
JBINT_KEY,WaitKey10;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey10
movM2,key
movdisbuf+1,key
lcallDisplay
ljmpWaitKey11
WaitKey11:
JBINT_KEY,WaitKey11;查询按键
lcallgetkey
mova,key
deckey
jzwaitkey11
movM1,key
movdisbuf+0,key
lcallDisplay
reti
;电子钟程序
shizhong:
clrrs0;开启电子钟的显示子程序
clrrs0
;控制时间
incM1
mova,M1
cjnea,#10,A0
movM1,#00h
movDisBuf+0,M1
incM2
mova,M2
cjnea,#6,A1
movM2,#00h
movDisBuf+1,M2
incF1
mova,F1
cjnea,#10,A2
movF1,#00h
movDisBuf+3,F1
incF2
mova,F2
cjnea,#6,A3
movF2,#00h
movDisBuf+4,F2
incS1
mova,S1
cjnea,#10,A4
movS1,#00h
movDisBuf+6,S1
incS2
mova,S2
cjnea,#03,A5
A0:
movDisBuf+0,M1
A1:
movDisBuf+1,M2
A2:
movDisBuf+3,F1
A3:
movDisBuf+4,F2
A4:
movDisBuf+6,S1
A5:
movDisBuf+7,S2
mova,S1
;24小时清零
cjnea,#04h,xianshi
mova,S2
cjnea,#02h,xianshi
movM1,#00h
movM2,#00h
movF1,#00h
movF2,#00h
movS1,#00h
movS2,#00h
movDisBuf+0,M1
movDisBuf+1,M2
movDisBuf+3,F1
movDisBuf+4,F2
movDisBuf+6,S1
movDisBuf+7,S2
xianshi:
lcallDisplay
ret
;子程序名:
ClsDisp
;功能:
清除显示内容
;调用:
VI2C_ASM.INC
;入口参数:
无
;出口参数:
无
;占用资源:
R0,R1,R2,R3(工作寄存器组1),ACC,Cy,R5(当前工作寄存器组)
ClsDisp:
movR5,#8;循环计数器初值,8位数码管
movA,#01100000B;按位下载数据且译码指令01100A2A1A0
;A2~A0:
对应显示位置1~8位数码管
Cls1:
MOVSLA,#ZLG7290;指定器件地址
MOVSUBA,#CmdBuf0;指定子地址
MOVMTD,A;命令送I2C总线发送数据缓冲区
movMTD+1,#1FH;命令参数,1FH:
无显示
MOVNUMBYTE,#02H;待发送数据2字节
pushACC;保护ACC
pushPSW;保护PSW
setbRS0;切换工作寄存器,I2C通信软件使用工作寄存器组1
clrRS1
LCALLIWRNBYTE;调用写2字节数据程序(VI2C_ASM.INC,I2C模拟软件包)
popPSW;恢复PSW
popACC;恢复ACC
incA;按位下载数据且译码指令地址部分+1
LCALLDELAY;延时,等待ZLG7290执行上述命令
djnzR5,Cls1;没有达到8次,继续循环
ret;子程序返回
;子程序名:
Display
;功能:
在8段LED数码管显示
;调用:
VI2C_ASM.INC
;入口参数:
Disbuf+0~Disbuf+7,8字节显示缓冲区
;出口参数:
无
;占用资源:
R0,R1,R2,R3(工作寄存器组1),ACC,Cy,R0,R5(当前工作寄存器组)
Display:
movR5,#8;循环计数器初值,8位数码管
movA,#01100000B;按位下载数据且译码指令01100A2A1A0
;A2~A0:
对应显示位置1~8位数码管
movR0,#Disbuf;R0->Disbuf
Disp1:
MOVSLA,#ZLG7290;指定器件地址
MOVSUBA,#CmdBuf0;指定子地址
MOVMTD,A;命令送I2C总线发送数据缓冲区
movMTD+1,@R0;命令参数,待显示数据送I2C总线发送数据缓冲区
MOVNUMBYTE,#02H;待发送数据2字节
pushACC;保护ACC
pushPSW;保护PSW
setbRS0;切换工作寄存器,I2C通信软件使用工作寄存器组1
clrRS1
LCALLIWRNBYTE;调用写2字节数据程序(VI2C_ASM.INC,I2C模拟软件包)
popPSW;恢复PSW
popACC;恢复ACC
incA;按位下载数据且译码指令地址部分+1
incR0;R0+1,指向下一个待显示数据
LCALLDELAY;延时,等待ZLG7290执行上述命令
djnzR5,Disp1;没有达到8次,继续循环
ret;子程序返回
;子程序名:
GetKey
;功能:
获取用户按键值(Key)
;调用:
VI2C_ASM.INC
;入口参数:
无
;出口参数:
Key
;占用资源:
R0,R1,R2,R3(工作寄存器组1),ACC,Cy
GetKey:
MOVSLA,#ZLG7290;指定器件地址
MOVSUBA,#01H;指定子地址
MOVNUMBYTE,#01H;读1字节数据
pushACC;保护ACC
pushPSW;保护PSW
setbRS0;切换工作寄存器,I2C通信软件使用工作寄存器组1
clrRS1
LCALLIRDNBYTE;调用读1字节数据程序
popPSW;恢复PSW
popACC;恢复ACC
movKey,MRD;读取的数据送Key
ret;子程序返回
;子程序名:
DELAY
;功能:
延时约36.5ms(11.0592MHz时钟)
;调用:
YS500US
;入口参数:
无
;出口参数:
无
;占用资源:
R7,R6
DELAY:
MOVR7,#80H
MIN:
LCALLYS500US
DJNZR7,MIN
RET
;子程序名:
YS500US
;功能:
延时约279us(11.0592MHz时钟)
;调用:
无
;入口参数:
无
;出口参数:
无
;占用资源:
R6
YS500US:
MOVR6,#80H
DJNZR6,$;延时128×2T=256T(T=1/1159200)
RET
$INCLUDE(VI2C_ASM.INC);将VIIC软件包加入到本段代码后
END
流程图:
六、调试程序的方法
通过调试,两次运行的方式进行调试
七、你所设计的程序最终完成的功能
⑴说明你编制的程序能完成的功能;
在八段显示器上显示设定的时间,当时间运行到程序所指定的时间时蜂鸣器进行蜂鸣和电灯供电,并且可以在紧急状况下通过开关控制蜂鸣器使其蜂鸣,也可以在蜂鸣状态下通过开关控制使其不蜂鸣,如果时间不正确,手动重置系统。
⑵准备的测试数据,并记录运行结果。
设计手动输入时间,从00:
59:
50开始计时,给电灯供电,零点整蜂鸣并且熄灯。
零点零一分再次供电,并且蜂鸣。
零点零二分再次蜂鸣停止供电。
且在蜂鸣时将开关1置1使其停止蜂鸣,不蜂鸣状态下将开关2置于1使其蜂鸣。
系统重置通过开关三,重新输入时间,实现重置系统功能。
八、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
程序基本完成了课程设计要求,能在指定时间报时,并且能够随时开始报时和停止报时,并伴随电灯供电功能。
为完善功能,添加了系统重置功能。
程序易于操作和理解,但是键盘输入有局限性,仅仅实现了显示初始时间的功能,对报时时间的输入有待完善。
2、对课题收获和提出更完善的方案。
单片机作息时间控制系统的课程设计,是我大学生涯的一次自我学习与实践的重要部分。
通过学习,我增强了自我学习能力和创新能力。
在程序的编写过程中,我和我的同组人遇到了很多问题,但通过看书,查资料,我们都一一解决,并且不断将课题完善与创新。
日期:
2013年01月04日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作息 时间 控制系统
![提示](https://static.bdocx.com/images/bang_tan.gif)