FH2K:CPL A ;点亮相应LED灯 MOV DPTR,#0FDFCH
MOVX @DPTR,A
DJNZ 56H,FHN MOV 56H,#100
JNB 21H.7,FH22 ;判断延时标志位,为1则表示开门灯亮 MOV 23H,#80H ;此时102-602的灯延时已到应只留开门信号灯 DJNZ 68H,FHN ;开门信号灯延时更长时间 MOV 68H,#06 CLR 21H.7 FH22:MOV A,#0FFH
MOVX @DPTR,A
MOV 23H,#00H RET
说明:LED灯的点亮是用低电平,要使对应的灯点亮,置要把标志位的单元取反赋给L0-L15即可是对应的灯点亮。此处由于把对讲信号和开门信号灯放在一起处理,就需要判断开门信号灯的延时。
5.8 无操作30S返回到时钟状态: 源程序如下:
WCZ:MOV A,20H ;无操作返回在进程不为01H时执行 CJNE A,#01H,WCZK MOV 4DH,#20 RET
WCZK:MOV R6,65H ;检测无按键按下才计时,有按键按下则重新计时 CJNE R6,#10H,WCZ3 MOV R6,64H
CJNE R6,#10H,WCZ3
MOV 4EH,3AH ;这里用比较秒单元的前后态来进行计时 MOV A,4EH CJNE A,4FH,WCZ1 RET
WCZ1:MOV 4FH,4EH DJNZ 4DH,WCZ2 MOV 20H,#01H MOV 3EH,#80H MOV P1,#0FFH
20
WCZ3:MOV 4DH,#20 WCZ2:RET
说明:如果检测在非01H进程且没有按键,就进行计时三十秒(程序是用20S方便观察),就返回到时钟显示。但如果一有按键按下,重新给4DH赋值使之延时三十秒。
5.9 输入三次错误用户密码锁开门信号5分钟子程序: 源程序如下:
SM:JNB 21H.5,SMN ;输入连续错误用户密码三次锁开门信号5分钟 CLR 23H.7 ;判断锁门标志为1就把开门信号标志清零 DJNZ 58H,SMN ;进行延时 MOV 58H,#100
DJNZ 59H,SMN MOV 59H,#30 CLR 21H.5 SMN:RET
说明:当检测到错误次数达到三次时的锁门标志位21H.5为1,就将开门信号标志位23H.7清零,进行计时,还没有延时完五分钟(此处约为30S)时,你输入正确的用户密码或按内开门按键也会跳过,不会将开门信号灯打开。要注意的是锁门子程序的调用要放在亮灯子程序前,否则会出错。 5.10 定时器T0中断服务子程序:
IT0P:PUSH ACC ;定时器1服务子程序。保护现场 PUSH PSW
INC 38H ;每200uS加1 MOV A,38H CJNE A,#50,DONE MOV 38H,#0
;满10mS?
;200uS计数单元清0
INC 39H ;每10mS加1 MOV A,39H
CJNE A,#100,DONE ;满1S?
21
MOV 39H,#0 ;10mS计数单元清0
MOV A,3AH ;秒单元(按BCD码)加1 ADD A,#1 DA A MOV 3AH,A
CJNE A,#60H,DONE ;满1分钟? MOV 3AH,#0 ;秒单元清零 MOV A,3BH ADD A,#1 DA A MOV 3BH,A
CJNE A,#60H,DONE ;满1小时? MOV 3BH,#0 ;分钟单元清零
MOV A,3CH ;小时单元(按BCD码)加1 ADD A,#1 DA A MOV 3CH,A
CJNE A,#24H,DONE ;满24小时? MOV 3CH,#0
;小时单元清零
;分钟单元(按BCD码)加1
DONE:POP PSW ;恢复现场 POP ACC
RETI ;中断返回
说明:中断服务程序流程,其中每277.77777778us中断一次对38H单元进行加1.当38H单元满36时,就对39H单元内容加1,同时对38H单元清0,重新计数。当39H单元的内容满100时,就对3AH单元内容加1,同时对39H单元清0,重新计数.当3AH单元的内容满60时,就对3BH单元内容加1,同时对3AH单元清0,重新计数. 当3BH单元的内容满60时,就对3CH单元内容加1,同时对3BH单元清0,重新计数. 当3CH单元的内容满24时,只对3CH单元内容清0,回到初始继续这样循环下去。
22
六、系统功能与操作说明
1.总初始化自检功能:把由keil软件生成的.HEX文件下载到实验板上单板机中,先上电等待各芯片均上电复位后自检,先是数码管每段全亮、L8-L15点亮、蜂鸣器响,1S后关闭蜂鸣器、数码管全暗,L0-L7点亮,1S后L0-L15熄灭,U3和U5芯片初始化,检测设备是否完好。
2.自检完后显示时钟初始为08:59:45,如果不进行任何操作,大约没过5S会在显示时钟和显示温度上转换显示。当你输入正确用户密码,L15会亮,延时5s后熄灭,输入位数不符或密码不正确都会报警。密码在界面上输入三位可看见,超过三位看不见。也可以通过按下PB7(外接开门按钮)来使L15亮,同样延时5s后熄灭。
3.输入正确的房间号(12间)会让对应的LED(对讲门铃)亮1s后熄灭,此后再按下PB0-PB5(对应101、201;301、401;501、601;102、202;302、402;502、602)也可使L15点亮,同样5s后会自动熄灭。没有输入正确房间号,按下PB0-PB5,L15不会亮。
4.无任何操作时,经过30s会自动返回时钟显示。
5.输入管理员密码,如果输入正确,变成时钟界面,并可看到L0亮,可通过键盘进行修改时间,若输入数字超过范围会报警不改变数值,进入下一位的修改。改完时间后按确定键,保存时钟修改,进入住户开门密码参数界面。进入住户开门密码参数界面,当你通过键盘输入六位数时,再按确定键,就把你刚才输入的六位数变成了用户密码,如果不是输入六位数会发出报警仍可继续修改。如果不想改用户密码按取消键即可返回时钟显示。修改完用户密码后按确定进入修改管理员密码界面,然后连续输入两次密码一致的情况下,把输入的六位数替换成管理员密码。如果不一致会报警且不会改掉管理员密码,仍可继续修改,也可按取消键返回时钟界面。
6.当你输入三次错误的密码后,再输入正确的用户密码,L15不亮,被封锁五分钟(约30S),以限制无止境地试探密码,五分钟过后如果输入正确的密码即可进行相应操作。
7.设置了取消键,按下此键无论数码管显示什么,都会返回时钟显示。 8.当输入出错时会报警,就是蜂鸣器连响三声后停止。
23
9.用键盘做输入时,按下键的瞬间,会发出短促的按键声。 10.在任何输入界面下按下退格键都会使进程返回前一状态。 七、课程设计总结
经过两周的课程设计,通过微机的知识和与同学的沟通把基于实验室开发板的小区楼道开门控制系统编写完成,实现了课程设计的基本要求和扩展要求。
在编写程序的过程中学到了很多,也遇到了很多困难。
在设计要有输入和房号密码及修改时钟,引入了进程码的应用,使在不同的进程中实现不懂的位数输入及不同的显示情况。
在写修改用户密码与管理员密码是发现与之前的输入比较房号或密码的显示效果是一致的在程序的设计工程中就直接将其写在一起一同实现。
在编写确定键、退格键、取消键的功能时,我之前是写直接在输入玩数字后判断是否有相应的按键按下,再进行处理,可是,到写到修改时钟与密码时发现这种写法要重复写很多程序,于是就想到把按键的处理单独拿出来做为一个子程序。
在报警子程序时,发现报警的声音一直不对,与其他同学交流发现程序也没错,但声音就是很奇怪,最后突然灵光一现,发现与我写的按键声子程序有冲突,报警的调用顺序要放在按键声后面。
在写对讲信号灯亮和PB按键的检测与使对应的灯亮时,对讲的写完后,在写PB按键功能时,发现能写在一起且对讲信号不用一个个去判断直接用取反的功能就能实现,结果全要改回来。
在设计进程的判断与处理时,原本写的时候是没引入1FH、2FH、3FH、4FH的,直到在设计修改密码是,发现与之前设计的进程的判断和赋值不兼容,于是想到可以在开始输入前引入一个进程来作为输入前的准备。
在编写完温度显示功能后调用,发现一直显示时钟,最后找到问题所在是与报警的相似,缩写的程序在要温度显示时是要覆盖掉时钟的,所以调用顺序要在时钟拆字后面。
在设计无操作30S返回子程序时,原本是用主流程的时间来定时的,但在实际的运行中发现,在房号、密码的输入,修改时钟的界面,修改密码是还没按键按下时,修改密码有按键按下时,等的情况下无操作返回等待的时间是不一致的,最后想到判断秒单元的前后态来计时,就不会出现等待的时间不一致的情况。
还有就是向引入一个单元来作为控制数码管显示的位数等,由于在调试时没把遇见的问题记下都是直接在程序里改也记不全。
总的来说这次是课程设计让我重新对微机复习了一遍,并掌握了一些编写程序的要点,遇到的问题都将成为以后相应情况下的经验。还有就是这种把程序写完功能都实现令人很有成就感,就向以前做数学思考题,解出答案的时候那种感觉。
24
附录1:
25