单片机课程设计校园作息时间系统Word文档下载推荐.docx
《单片机课程设计校园作息时间系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计校园作息时间系统Word文档下载推荐.docx(49页珍藏版)》请在冰点文库上搜索。
P3。
2接用户自设定报时/作息时间报时的选择开关,开关闭合(P3。
2为低电平)时,仅对用户自设定的时间点进行报时;
开关断开时,则进行固定的作息时间表报时。
P3。
3端口接夏令/冬令作息时间表,P3。
3=1时选择择冬令作息时间表。
4端口外接光电隔离器,驱动扩音机电源的控制开关,低电平有效。
图2.1单片机原理框图
2.2系统工作流程
本单片机报时控制系统具备以下功能:
时钟显示。
5位LED从左到右依次显示时、分,采用24H计时。
图2.2时间显示图
(4)键盘功能。
采用4个独立按键,包括:
移位键、加1键、减1键、校时置入键。
(5)移位键:
(P1。
0=0)每按动移位键一次,小数点从左向右移动1位。
(6)加1键:
1=0)对小数点所在位的数什进行十进制加1。
(7)减1键:
(P1。
2=0)对小数点所在位的数值进行十进制减1。
(8)校时置入键:
3=0)将显示的时间值置入实时时钟的计时缓冲区。
图2.3键盘功能
(9)扬声器驱动电路:
图2.4扬声器驱动电路
2.3系统的使用说明
(1)时间显示。
通电后,系统自动进入时钟显示,从00:
00:
开始计时,此时可以设定当前时间。
(2)时间校对。
按下“移位”键,小数点从左向右移动,每按动1次,小数点便移动1位;
要修改设置哪一位,只需将小数点移到该位,便可用“加1键”或“减1键”对该位进行数字设定;
时间的校对设定一共有5位,从左到右依次为星期、小时十位、小时个位、他的十位、分的个位。
设置正确后“校时置入键”,时间校正便设置完成,报时钟开始按新设置的时间值开始走时和显示。
(3)用户报时时间设置/显示。
用户可以自行设定10组报时时间点,这时LED显示的最高位定义为组编号其他位定义不变;
按下“报时设定键”,系统根据“组编号”将用记设定的报时时间点(小时和分)存入内部RAM相应存储单元中,用户如需修改和检查这些报时时间。
如需修改,可用“移位键”、“加1键”,“减1键”来重新设定,然后用“报时设定键”来转入并结束显示。
(4)报时输出的驱动过程。
在报时处理程序上中,一旦当前时间与作息时间表中的某一时间点(时、分值)相同时,则建立F0报时标志,建立F1放音标志,扩音机播放报时音乐,并在26H中设置放音时间,放音时间到,则关闭驱动及清除F1标志位,完成1次报时驱动.
第3章软件设计
3.1系统资源分配
(1)为方便阅读程序,先对系统的资源分配加以说明。
1)定时器。
定时器0用作时钟定时,按方式1工作,每隔100MS溢出中断1次。
2)片内RAM及标志位的分配与定义见表1
表1:
地址
功能
名称
初始化值
2FH~2BH
显示缓冲区,星期、小时、分(高位在前)
DISP0~DISP4
00H
24H~20H
计时缓冲区,星期、时、分、秒、100ms
WEEK,HOUR,MIN,SEC,MSEC
40H~53H
用户报时时间值寄存区(时、分)
AHOUR、AMIN
61H~7FH
堆栈区
F0H
报时开始标志位
F1H
放音开始标志位
F3H
分钟值变更标志位
F4H
键处理标志位
25H
扩音机预热时间
26H
播放报时音乐时间
(2)软件流程。
根据上述工作流程,软件设计可分为以下几个功能模块:
1)主程序:
初始化与键盘监控。
2)计时:
为定时器0中断服务子程序,完成刷新计时缓冲区的功能。
3)时间设置与报时设置:
由键盘输入设置当前时间与定时启闭时间。
4)显示:
完成5位LED动态显示。
5)键盘扫描:
判断是否有键按下,并求取键号。
6)定时比较:
判断报时时间到否,如时间到,则启动报时处理程序。
7)其他辅助功能程序,如键盘设置、拆字、合字、冬季或夏季时间表选择及假日停止报时等。
第4章程序模块设计
程序的模块设计非常重要,有很多功能的程序,列表如表2
表2:
主程序
程序的主体,调用其他子程序
定时中断服务程序
进行秒,分,时的累计计数,到时间到时,驱动蜂鸣器及继电器
显示模块
P0口作为段码,P2口作为位码输出,控制数码管。
键扫描子程序
检测P1口,判断是否有键按下,如有键按下,进进行延时去抖动并读取键值,存入A中
键值处理子程序
判断A中的值,根据A来选择调用哪个子程序
4.1主程序模块(MAIN)
在主程序模块中,先对各端口进行初始化,对内部RAM区清零,设置堆栈和定时器初值,关闭显示器,启动定时及其中断。
然后检测时钟分值变更标志位F3是否建立,如果已建立,则进行报时处理,否则再检测有无按键按下,若有则进行按键处理,无则返回循环点。
ORG0000H
START:
AJMPMAIN;
跳转入主程序0030H
ORG000BH
AJMPCTCINT;
跳转到定时器T0的中断服务程序入口
ORG0030H
MAIN:
NOP;
主程序入口地址:
0030H
NOP
MOVA,#OFFH;
关闭各输出口
MOVP0,A;
P0口为字形口,低电平有效
MOVP1,A;
P1口作为6个键输入口
MOVP2,A;
P2口是字位口,低电平有效
MOVP3,A;
P3口报时方式控制和驱动输出口
SETBT0;
关闭报时音乐输出(T0=1)
SETBT1;
关闭报时扩音机电源(T1=1)
CJNESP,#07H,NOT1
MOVR0,#7FH
MOVR1,#7DH;
否则RAM清零初始化
CLRA
LOOP0:
MOV@R0,A
DECR0
DJNZR1,LOOP0;
从内部RAM区03H到7FH均清零
NOT1:
MOVSP,#60H;
设置栈指针
MOVIP,#02H;
设置定时器T0为最高中断优先级
MOVIE,#82H;
定时器T0开中断
MOVTMOD,#01H;
设置定时器T0为方式1
MOVTL0,#0B0H;
设置定时器T0初值
MOVTH0,#3CH
SETBTR0;
启动定时
NOP
NEXTT:
重置堆栈底位置
LCALLDISP;
调用显示子程序
NOP;
检测标志是否出现,F3为定时分钟值变化的标志位
JNB0F3H,NEXT1;
F3=0,则转键扫描,判断有无键按下
F3=1,调用报时处理子程序
SETBINT0
JNBINT0,USERS;
如INTO=0,则调用用户自设定报时点
LCALLTIMERA;
INTO=1,调用TIMERA,按作息时间表报时
USERS:
LCALLTIMERB;
TIMERB为用户自设定报时点报时
NEXT1:
LCALLCHECKEY;
调用按键扫描子程序,判断有无键按下
JZNEXTT;
无键按下,返回重新扫描
LCALLKEYACC;
有键按下,调用按键处理子程序
SJMPNEXTT
4.2定时中断服务程序模块
该多好模块完成下述工作:
①对100毫秒(20H)、秒(21H)、分(22H)、小时(23H)进行累计计数,如果分值有计数变化并且无键按下,则将小时和分钟送显示缓冲区更新显示目录;
②如有报是处理标志,则对报时扩音机电源和报时音乐输出分别进行定时控制。
CTCINT:
NOP;
T0的中断服务子程序
MOVTL0,#0B4H;
PUSHACC;
保护主程序现场数据
PUSHPSW
SETBRS0;
选择新的工作寄存器区(1区)
CLRRS1;
SELECT1AREA
INC20H;
0.1S单元加1
MOVA,20H
JBOF4H,LCA;
(F4H)为键处理标志位,在键处理过程中不显示秒点
CJNEA,#05H,CTNUC
CTNUC:
JCLC2;
小于0.4S则秒点闪亮,大于0.4S则秒点熄灭
CLR6CH
SJMPLCA
LC2:
SETB6CH
LCA:
CJNEA,#0EH,RTNH;
未计满1S则退出中断
MOV20H,#00H;
毫秒计数单元清零
JNB0F0H,NEXTE;
F0H=1为报时扩音机预热延时标志位
MOVA,25H;
(25H)中存放报时扩音机预热延时时间值
JNZNEXTF
CLROFOH
SETBOF1H
MOV26H,#1OH;
(26H)中存放报时放音的延时时间值
CLRTO
NEXTE:
JNBOF1H,NEXTF;
(F1H=1)为报时放音的延时标志位
MOVA,26H
DECA
MOV26H,A
JNZNEXTF;
判断报时放音延时是否结束
CLROF1H;
延时时间到,清除报时放音标志位,关闭报时电源
SETBT1
SETBT2
SETBTO
NEXTF:
MOVA,21H;
对秒计数单元(21H)进行累计计数
ADDA,#01H
DAA
MOV21H,A
CJNEA,#06H,RTNH;
判断分计数是否计满
SETB0F3H;
(F3H)为分值有变更标志位
NEXT:
MOVA,22H;
对分(22H)进行累计计数
ADDA,#01H;
MOV22H,A
CJNEA,#60H,RTDN
MOV22H,#00H
MOVA,23H
ADDA,#01H;
时单元加1
MOV23H,A;
对时(23H)进行累计计数
CJNEA,#24H,TRND
MOV23H,#00H
MOVA,24H
星期计数单元(24H)加1
MOV24H,A
CJNEA,#07H,RTDN
MOV24H,#00H
RTDN:
JNBOF3H,RTDH;
确认(F3=0)分值无变更,则返回
JBOF4H,RTNH;
确认(F4=0)正在键处理,则返回
LDDA:
NOP;
将当前的时间值显示缓冲区
MOVR0,#24H;
(24H、23H、22H、)送(2FH~2BH)
MOVR1,#2FH
MOVR2,#02H
MOVA,@R0
ANLA,#0FH
MOV@R1,A
DECR0
DECR1
LD1:
MOVA,@R0;
将1字节压缩的BCD码拆成两个字节,数数值存放在低字节内
ANLA,#OF0H
SWAPA
MOV@R1,A
MOVA,@R0
ANLA,#0FH
DJNZR2,LD1
RTNH:
中断返回,并恢复现场数据
POPPSW
POPACC
RETI
4.3扫描显示模块
该模块为5位LED扫描显示模块。
P0口为字形码输出口,低电平有效;
P2口为字位码输出口,高电平有。
显示缓冲区为2FH~2BH等5个字节,2FH存放显示的星期数,2EH、2DH存放显示的小时数,2CH、2BH存放显示的分钟数,其数值范围在00H~0FH内时不显示该位的小数点,在10H~1FH时则显示小数点。
DISP:
DISP为显示子程序
NOP
MOVA,#00H;
关闭显示
MOVP2,A;
P2口为字位码输出口
MOVA,#0FFH
P0口为字形码输出口
MOVR0,#2FH;
显示子程序
MOVR1,#10H;
位控制字
LOOP1:
MOVA,R1
输出位控制字
MOVP2,A
MOVDPTR,#TABLE
MOVA,@R0;
取显示缓冲区中的显示字符数
MOVCA,@A+DPTR;
查表转换成字型代码
CPLA
MOVP0,A;
输出字形码
MOVR2,#00H
LOOP2:
DJNZR2,LOOP2;
延时2MS
DECR0;
显示下一个字符
MOVA,R1
CLRC
RRCA
MOVR1,A
JNZLOOP1;
判断5位扫描显示一遍是否完成
RET
TABLE:
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
DB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H;
带小数点时的字符显示字形表
DB0FFH,0EFH、0F7H,0FCH,0B9H,0F9H,0F1H
4.4键扫描子程序
检测P1口,判断是否有键按下,如有键按下,进进行延时去抖动并读取键值,存入A中。
CHECKEYA:
MOVP1,#0FFH
MOVA,P1;
判断是否有键按下
ANLA,#3FH
JZRETX
LCALLDISP;
延时去抖动
LCALLDISP
MOVA,P1
MOVR6,A;
当前值存放在R6中
K1:
LCALLDISP;
等待释放按键
JNZK1
MOVA,R6
RETX:
RET
i.用户自设定报时时间点置入键程序模块。
将显示缓冲区2FH~2BH中的内容压缩后存入40H为首地址的片内RAM中,其中2FH为定时时间点的编号,2EH、2DH为小时值,2CH、2BH为分钟数值。
USESET:
MOVR0,#2FH
MOVR1,#40H;
本次用户设定报时点首址为40H
ANLA,#OFH
RLA
ADDA,R1;
报时点编号乘2加首址,为本次存放的实际地址
定时设定时间置入子程序
LDD:
MOVR7,A
ADDA,R7
INCR1
DJNZR2,LDD
CLR0F4H
ii.减1键处理。
在小数点点亮的对应位上进行十进制减1处理。
SUBONE:
JNB7CH,SCH74
SJMPSUB1
SCH74:
JNB74H,SCH6C
MOVR0,#2EH
SCH6C:
JNB6CH,SCH64
MOVR0,#2DH
SCH5C:
NOP
JNB64H,SCH5C
MOVRO,#2CH
JNB5CH,ERR1
MOVR0,#2BH
ERR1:
SUB1:
ADDA,#99H
XCHDA,@R0
iii.用户自设定报时时间点显示键处理模块。
由(2FH)指定的用户自设定报时点编号,计算其在RAM中存放的地址,再根据此地址找出该报时时间点的2个字节码,将其4个半字节分别存入2EH~2BH单元低半字中。
DSPUSE:
自设定报时点编号由(2FH)指定
MOVR1,#40H;
用户设定报时点首址为40H
ADDA,R1;
报时点编号乘2加首址,为其存放的实际地址
取定时设定时间并置入显示缓冲区
LDR:
MOVA,@R1;
将小时和分钟值解压缩后装入相应显示单元中
DJNZR2,LDR
4.5键值处理子程序
KEYACC:
按键处理子程序
JBACC.0,SHIFTP;
是移位功能键转SHIFTP
JBACC.1,ADDONE;
是加1键,转ADDONE
JBACC.2,SUBONE;
是减1键,转SUBONE
JBACC.3,TIMSET;
是时钟校对键转TIMSET
JBACC.4,USESET;
设置用户定时时间点
JBACC.5,DSPUSE;
显示用户定时时间点
iv.加1键处理程序。
在小数点点亮的对应位上进行十进制加1处理。
ADDONE:
JNB7CH,SECH74
SJMPADD1
SECH74:
JNB74H,SECH6C
SECH64C:
JNP6CH,SECH64
ERR2:
RET
ADD1:
v.校时时间置入程序模块。
将设定的时间值置入相应的时间计数单元,并以该时间为起点开始计时。
TIMSET:
校时时间置入程序段
MOVR1,#24H
MOVA,·
R0
ANLA,0FH
MOV21H,#00H
4.6移位键处理程序模块
将小数点从左向右依次移动1位。
小数点移动哪一位,那一位便可用加1或减1键进行修改数值。
小数点如移到最右边1位,若再按1次移位键,小数点自动返回到最左边一位上。
SHIFTP:
JB0F4H,NXT
ERR:
SETB0F4H
SETB5CH
NXT:
JNB7CH,CHK74
CLR7CH
SETB74H