基于89C51设计的电话远程控制开关
ORG 1250H
RING40:MOV R3,#03
RING41:MOV R6,#20 ;control
RING42:MOV R7,#20 ;800Hz
RING43:LCALL DL10 ;sound=3
CPL P3.0 ;delay=0.5s
DJNZ R7,RING43
DJNZ R6,RING42
CLR P3.0
MOV R7,#100
RING44:LCALL DL10
DJNZ R7,RING44
DJNZ R3,RING41
CLR P3.0
RET
ORG 1300H
RING50:MOV R6,#40 ;finish
RING51:MOV R7,#20 ;1600Hz
RING52:LCALL DL20 ;sound=1
CPL P3.0 ;delay=0.15s
DJNZ R7,RING52
DJNZ R6,RING51
CLR P3.0
RET
ORG 1500H
DL10:MOV R5,#25 ;delay1.25ms,f=800HZ,fosc=12MHz,
DL12:MOV R4,#25
DL11:DJNZ R4,DL11
DJNZ R5,DL12
RET
ORG 1600H
DL20:MOV R5,#12 ;delay0.625ms,f=1600HZ,fosc=12MHz,
DL22:MOV R4,#25
DL21:DJNZ R4,DL21
DJNZ R5,DL22
RET
ORG 1650H
DL30:MOV R5,#50 ;delay20ms
DL32:MOV R4,#200
DL31:DJNZ R4,DL31
DJNZ R5,DL32
RET
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 wrongR2!=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
- 在应用可编程测控网络设计(03-15)
- 基于AT89C51单片机的微型可编程控制器(04-23)
- 基于AT89C51单片机的量程自切换频率计(01-25)
- 基于AT89C51单片机的十进制计算器系统设计(06-29)
- 基于单片机的智能计步器设计(09-20)
- 可编程逻辑器件与单片机在双控制器中的设计(06-04)