- 帖子
- 120
- 主题
- 79
- 精华
- 0
- 积分
- 60
- 在线时间
- 5 小时
- 注册时间
- 2010-10-13
|
3楼
发表于 2010-10-17 15:40
| 只看该作者
4.2 密码检测部分
本系统密码校验的基本原理是:在系统初始化的时候把原始密码写入地址为30H开始的存储空间内,密码的位数“5”赋给R7。当系统摘机时,要求输入密码,单片机把解码后的数据(使用者输入的密码)存储在38H开始的存储空间内。然后单片机对进行两个存储地址的内容逐位进行比较,直到完全相等才能转到下一进程,有一位不同,程序就转到出错程序。
子程序代码:
ORG 0150H
HOKE: CLR 7DH
SETB P3.1 ;open telephone
CLR TR0 ;close T0
MOV R2,#03H ;password wrong 3
LCALL RING10 ;input password
IN: CLR 7EH ;7EH=0
DTMF: MOV R7,#5H ;PASSWORD:5 R7
MOV R1,#38H ;sign
SETB P1.4
SETB P1.5
SETB P1.6
SETB P1.7
WAIT: JBC 7EH,CC ;wait INT0
LJMP WAIT
CC: MOV R7,#5H ;password 5***
MOV R0,#30H ;password top
MOV R1,#38H ;sign
CMP: MOV A,@R1
MOV R4,A
CLR C
MOV A,@R1
SUBB A,@R0 ;test
INC R0
INC R1
JZ AAA ;OK,pass one
LJMP QQ
AAA: DJNZ R7,CMP ;R7-1!=0
LJMP LL ;pass
QQ: DJNZ R2,IN1 ;password wrong&R2!=0
LCALL RING20
LJMP STOP
IN1:LCALL RING20 ;password wrong,try!
LJMP IN
4.3 密码修改部分
本系统是通过在线输入密码而改变特定存储器中的密码值的。
程序代码:
ORG 1700H
KEYIN: SETB RS1 ;当前工作寄存器第二工作区
CLR RS0
ANL A,#00H ;清零A寄存器
MOV B,#05H
LCALL RING10 ;发提示音:输入密码***
MOV R7,#5H
MOV R1,#38H
WPIN: JBC 7EH,READ ;等待INT0中断
LJMP WPIN
READ: MOV R1,#38H
MOV R0,#40H
MOV R7,#05H
READ1: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,READ1 ;判断输入密码是否为5位,否跳转READ1
LCALL RING10 ;满5位,发提示音:再输入新密码
MOV R7,#5H
MOV R1,#38H
WRE: JBC 7EH,KEYCMP ;等待中断INT1
LJMP WRE
KEYCMP:MOV R6,#05H
MOV R0,#40H
MOV R1,#38H
KEYCP:MOV A,@R0
CLR C
SUBB A,@R1 ;A减((R1))
INC R1
INC R0
JZ BBB ;A的内容如果为0,则跳转BBB
LJMP LL
BBB: DJNZ R6,KEYCP ;R6减1不为0,则跳转KEYCP,即循环比较密码的五位
MOV R1,#38H
MOV R0,#30H
MOV R6,#5H
KEYREIN:MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ R6,KEYREIN ;R6减1不为0,则跳转,即循环比较密码的五位
LCALL RING50 ;发提示音:新密码已经设置
LJMP STOP
RET
4.4 控制电器部分
本系统首先通过外围双音频解码电路解码的信息(选择电器)判断所选择的电器,然后跳转到每一个子程序,通过单片机向P1口的低四位发送数据,这些控制信息表示对不同的电器进行控制的控制字。为了简单表示,在这里只写出了电器“一”的控制子程序,其它子程序很相似,详见附录。
程序代码:
LL: LCALL RING30 ;sound:input control
MOV R7,#1H ;***
MOV R1,#38H
CLR 7EH
WAIT0: JBC 7EH,DD ;wait INT0
LJMP WAIT0
DD: MOV R1,#38H
MOV A,@R1
RR A
RR A
RR A
RR A
MOV R4,A
RL A
ADD A,R4
MOV DPTR,#TAB
JMP @A+DPTR
TAB: LJMP ZERO
LJMP EIGHT;8
LJMP FOUR ;4
LJMP STOP ;#
LJMP TWO ;2
LJMP ZERO ;0
LJMP SIX ;6
LJMP LL ;**
LJMP ONE ;1
LJMP LL ;9,**
LJMP FIVE ;5
LJMP LL ;A,**
LJMP THREE;3
LJMP LL ;*,**
LJMP SEVEN;7
LJMP LL ;C,**
ORG 0250H
ZERO: LJMP LL
ONE: LCALL RING40 ;发提示音:请操作电器
OO1: MOV R7,#01H
CLR 7EH
WAIT1: JBC 7EH,WW1 ;wait INT0
LJMP WAIT1
WW1:MOV R1,#38H ;检查信号首位
MOV A,@R1
CJNE A,#50H,BB1 ;(38)不等于0AH(0),则跳转BB1
LJMP ZZ1 ;(38)等于0AH(0),则跳转ZZ1
BB1: CJNE A,#80H,QUIT1 ;(38)不等于01H(1),则跳转QUIT1
SETB P1.3 ;open 1
CLR P1.2
CLR P1.1
CLR P1.0
LJMP QUIT1
ZZ1: CLR P1.3 ;close all
CLR P1.2
CLR P1.1
CLR P1.0
LCALL RING50 ;finsh
QUIT1: LJMP LL
4.5 振铃计数部分
本单元是通过计数器T0的外部中断方式来计数的,程序代码:
ORG 0090H
TT0: SETB 7DH
RETI |
|