| 
 
   
- 帖子
 - 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 |   
 
 
 
 |