KA KB KC 确定键 退格键 取消键 L13 L15 P3.2接蜂鸣器 602 开门信号灯 K12:(取消键)无论数码管工作在什么状态,按下取消键都要回到时钟显示。
键盘表
0 4 8 1 5 9 无 2 6 3 7 确定 退格 无 无 取消 4.2片内数据存储空间的分配: 00H-07H:工作寄存器R0—R7 16H-1BH: 输入数字缓存 20H:工作进程码单元
22H:存送到L8---L15显示暂存单元 29H-2FH:用来消抖用的单元 21H.0确定键按下就置1 21H.1 退格键按下置1 21H.2 取消键按下置1 21H.3出错置1 21H.4管理员密码正确置1 21H.5 三次密码错误置1
21H.6有按键按下置1 21H.7 用户密码这确或PB7按下置1 25H.0 为1显示温度,为0显示时钟
30H-37H单元为显示更新内容缓冲区,如下表所示: 显示实时钟,显示更新内容缓冲区对应的内容,如表所示:: 37H 36H 35H “-” 34H 33H 32H “-” 31H 30H 时高位 时低位
分高位 分低位 秒高位 秒低位 10
38H-3DH单元为定时器计时单元,如表所示:
38H 39H 3AH 3BH 3CH 计时计时实时钟秒实时钟分实时钟时200us 10ms 计时单元 计时单元 计时单元 40H----45H:存储管理员密码 46H-----4BH:存储用户密码 50H----55H:修改管理员密码时第一次输入缓存 24H:101-601房号对讲延时,赋值100延时1S 3DH:判断密码错误3次
56H:102-602房号对讲延时,赋值100延时1S 57H:报警次数
58H:锁门延时赋值100,延时约1S 59H:锁门延时赋值30,延时约30S 3EH:判断数码管显示到第几位 68H:开门信号灯延时更长约5S 69H:报警延时0.5S
26H:显示温度与时钟延时0.5S 27H:显示温度与时钟延时5S 4DH:无操作返回延时20S
6FH--7FH:用于堆栈,用于定时器T0中断和LCALL语句中。 4.3 AT89S51片上I/O端口分配:
P0口:P0.0-P0.7作为扩展外面数据存储器82C55片选低八位地址。P1口:P1.0-P1.7驱动L0-L7灯(自检)。 P2口:P2.0为82C55A (U3)片选信号输入端 。 P2.1为82C55A (U5)片选信号输入端 。 P2.2为ADC0809芯片片选信号输入端 。 P3口:P3.2为自检蜂鸣器检测端。
P3.6、P3.7分别为外部数据存储器写和读选通信号。
11
五、局部程序设计说明
5.1消抖动子程序
用几个连续的单元存放最近几次的电平值,比较几个电平值,若相等则存起来与原态相比较,若新态与原态不等则认为一次电平变化。
2FH 2EH 2DH 2CH 2BH 2AH 29H 消抖动原理示意图
源程序清单如下:
XDPB : MOV 2FH,2EH ;PB口输入并消抖子程序。原新态存为前态
MOV 2DH,2CH ;前4次输入的电平值前推至2AH~2DH单元
MOV 2CH,2BH MOV 2BH,2AH
MOV 2AH,29H ;29H-2FH递存
MOV DPTR,#0FDFDH ;输入PB0~7新电平值存29H单元 MOVX A,@DPTR ;取P0到P7的值 MOV 29H,A ;存入首单元
MOV A,2DH ;比较近5次输入的电平值不一致则新态照旧
CJNE A,2CH,XDR CJNE A,2BH,XDR CJNE A,2AH,XDR
CJNE A,29H,XDR ;取29H-2CH与2DH分别比较 MOV 2EH,A ;递存 XDR:RET ;循环子程序
12
说明: 执行这条子程序时,先把前4次输入的电平值前推至2AH~2DH单元,然后从地址0FDFDH中读取P0到P7的值,然后对29H,2AH,2BH,2CH,2DH这五个单元进行比较,只有这五个单元的内容一样时,才能把2DH中的内容存入2EH中,这样就比较有效地避免开关量抖动的影响了。 5.2显示更新子程序: 源程序如下:
DISP:MOV A,3EH ;3EH为00H则把数码管关闭,不为0则显示更新 CJNE A,#00H,DISPP MOV DPTR,#0FEFDH
MOVX @DPTR,A
RET
DISPP:MOV R0,#30H ;显示更新子程序。置显示缓冲单元首地址(对应最右位)
MOV R3,#01H ;位码初值(从最右位起) MOV A,R3
DISP1:MOV DPTR,#0FEFDH ; 8255-B口(位码输出口)
MOVX @DPTR,A ; 输出当前字位码 MOV A,@R0 ; 取当前位显示数据码
ADD A,#TAB-NEXTPC ; 加TAB与NEXTPC差址 MOVC A,@A+PC ; 查表得相应字段码
NEXTPC:MOV DPTR,#0FEFCH ; 8255-A口(字段码输出口) MOVX @DPTR,A ; 输出字段码
LCALL D1MS ; 保持显示1毫秒 INC R0 ; 指向下一显示缓冲单元 MOV A,R3 ; 取出原来的位码
CJNE A,3EH,DISP2 ; 判断若已显示到最左位则结束
RET
DISP2:RL A ; 未完,字位码左移1位
MOV R3,A ; 回存新的位码 LJMP DISP1 ; 转下一位的显示驱动
13
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;显示字段码表
;\~\
DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,00H,9CH ;\~\全亮\\圆圈\DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H ;显示字段码表0-9有小数点 说明:在更新前要先判断3EH单元,若为00H则数码管全暗并结束,若不为00H则根据3EH单元的内容把显缓单元的内容显示到数码管上,3EH是用来判断数码港要显示几位。
5.3 有按键时发出按键声子程序: 源程序如下:
AJS:JNB 21H.6,AJSN ;按键声子程序 CLR P3.2 ;开蜂鸣器 CLR 21H.6 ;标志位清零 AJSNN:RET
AJSN:SETB P3.2 ;关蜂鸣器 SJMP AJSNN
说明:在键盘扫描检测到按下键,21H.6置1.调用到按键声子程序是就判断21H.6的状态,若为1开蜂鸣器,标志位清零,延时一个主流程时间,再关蜂鸣器。 5.4 调用报警子程序: 源程序如下:
BJ:JNB 21H.3,BJN ;检测到错误报警,让蜂鸣器产生响0.5S DJNZ 69H,BJN ;69H单元的内容减1不为0则返回 MOV 69H,#50
CPL P3.2 ;对P3.2求反 MOV R0,#57H
INC @R0 ;对57H单元的内容加1 MOV A,57H
CJNE A,#3,BJN ;57H单元的内容与立即数3比较不等返回 MOV 57H,#00H ;57H单元存储求反次数 SETB P3.2 ;关蜂鸣器 CLR 21H.3 ;将21H.0清0
BJN:RET
14