老师再帮看看程序~
;本程序中使用的信号音,方便起见,2声为错误提示,1声为正确提示
;关于如何接收密码及新密码 ????????????
;只要有外部中断,就执行load接收码操作
;密码修改这一块 ,主叫方在密码校验正确之后,
;必须输入*和叉叉叉(由于采用load子程序接收,所以也许输入4位),单片机才会响应
;标志位说明:
;20h.0:
;20h.1:密码校验结束且正确标志位
;20H.2:两次密码输入完毕标志
;20H.3:新密码两次一致标志位
;20H.4:确认修改密码标志位
;20H.5:第一次新密码接收完毕标志位
;20H.6:密码校验正确后的第一次输入标志位
ORG 0000H
LJMP SETUP
ORG 0003H
LJMP INEX0P
org 000bh
ljmp inet0p
ORG 0013H ;8870的输出选通信好STD接在P3.3的
LJMP INEX1P
ORG 0030H
SETUP: mov 20h,#0
SETB IT0 ;0003H
SETB EX0
SETB IT1 ;0013H
SETB EX1
SETB et0
SETB EA
MOV 7CH,#1
MOV 7DH,#2
MOV 7EH,#3
MOV 7FH,#4 ;4位密码初值,这部分在初始化部分
MOV TMOD,#01H
MOV TH0,#60
MOV TL0,#176
MOV R2,#0
MOV R3,#0
mov r4,#3 ;3次密码校验机会
mov r5,#3 ;3次密码修改机会
MOV R0,#78H;读进来的首位密码准备保存在此(direct(78H~7BH)中)
MOV R1,#7CH;已知的密码位置(direct(7CH~7FH)中)
MAIN: SJMP MAIN
INEX0P:clr ex0
SETB TR0
RETI
INET0P: jb 20h.0,AA ;查下面写的标志位,有是第二次 则过一定时间摘机没有则是第一次
MOV TH0,#60
MOV TL0,#176
INC R2
CJNE R2,#200,N1S
MOV R2,#0
setb 20h.0 ;写一个标志位,表示一定的时间
clr tr0
setb ex0
AA: MOV TH0,#60
MOV TL0,#176
INC R2
CJNE R2,#200,N1S
inc r3
cjne r3,#3,N1s
MOV R2,#0
; CLR P3.6
N1S: RETI
INEX1P: LCALL LOAD ;调接收码子程序
MOV R0,#78H ;如果到达7CH,则4个数据已经接受完毕,R0重新指向78H
jb 20h.5 ,bj ;第二次密码接收完毕转两次密码比较程序
jb 20h.4 ,tishi ;第一次密码接收完毕后,转提示音
JB 20H.6,ifxg ;判是否前往(密码修改)?
jb 20H.1,CONTROL ;密码校验已经正确,转控制程序
LOOP_PASSWORD: MOV A,@R0 ;取出保存的数据
MOV 6CH,@R1
CJNE A,6CH,MIMA_ERR ;与对应得密码单元比较,如果不相等则
;转密码错误处理
INC R0 ;前一位密码正确,调整指针
INC R1
CJNE R0,#7CH,LOOP_PASSWORD;四个密码都比较完了吗?没完循环继续比较,完了做密码正确的处理
SETB 20H.1 ;密码校验结束且正确标志位
LJMP MMXG ; 跳密码修改子程序
MIMA_ERR:
LCALL BEEPC
LCALL BEEPC ;2声500HZ,提示错误,重新输入
djnz r4,guaji ;3次密码错误,则挂机
ljmp INT1RET ;否则转重新接收
MMXG: nop
nop
nop
nop ;等待主叫方输入信号
setb 20h.6 ;密码校验正确后的第一次输入标志位
ifxg: MOV A,@R0 ;取出保存的数据
CJNE A,#11,CONTROL ;判是否进行密码修改操作(规定以*键输入
;时,为密码修改操作),否则进行电器控
;制操作
setb 20h.4 ;确认修改密码标志位
nop
nop
nop
nop ;等待主叫方输入新密码
tishi: setb 20h.5 ;第一次新密码接收完毕标志位
LCALL BEEPC ;2声500hz,提示重新输入新密码以确认
LCALL BEEPC ;接收4位码子程序
nop
nop
nop
nop ;等待主叫方重新输入新密码
BJ: ; Setb 20h.2 ;两次密码输入完毕标志
MOV R0,68H
MOV R1,78H
MOV 6DH,@R1
MOV A,@R0 ; 两次密码比较
CJNE A,6DH,MIMA_ERR1 ;两声500HZ表两次密码不一致
INC R0 ;指向新单元
INC R1
CJNE R0,#6CH,BB ;比较结束且正确,怎样让新密码下次使用有效?
Setb 20h.3 ;新密码两次一致标志位
mov 7Ch,78H
mov 7Dh,79H
mov 7Eh,7AH
mov 7Fh,7BH ; 使新密码下次有效
Lcall BEEPC ;1声500hz表修改成功
clr 20h.4
clr 20h.5
clr 20h.6 ;修改完毕清标志位,以便下面接收电器控制码
CONTROL: NOP ;本段子程序用于实验室阶段
NOP
NOP
NOP ;等待主叫方输入电器控制码
JM: mov A,@R0
CPL A
Anl a, #0fh
Mov p2,a
INC R0
Lcall BEEPC ;1声500hz代表完成命令
;在实验室中,在这里加入延时子程序,以便于观察发光二极管
CJNE R0,#7CH,JM ;控制命令未执行完,则继续
NOP
NOP
NOP ;等待,还有要控制的电器吗
NOP ;否则进行挂机处理
guaji: setb p3.6 ;挂机
mov 20h,#0 ;挂机后,要复位,对吗?????????????????
MOV R2,#0
MOV R3,#0
mov r4,#3
mov r5,#3
INT1RET: MOV R0,#78H
MOV R1,#7CH
RETI
LOAD: ;接收4位码子程序
SETB P1.4;(TOE引脚),使输出数据有效
MOV A,P1;密码读到累加器处理
CLR P1.4;已经读取了,使输出数据无效
ANL A,#0FH;使累加器高4位为0,仅保留低4位数据
MOV @R0,A;传送到目标单元,如传送到78H,或78H~7BH
INC R0;指向高一级单元
NOP
NOP
NOP
NOP ;给主叫方以一定时间输入
CJNE R0,#7CH,INT1RET;如果没到达7CH,则退出中断
RET ;否则子程序返回
MIMA_ERR1: LCALL BEEPC
LCALL BEEPC
clr 20h.4
clr 20h.5
clr 20h.6 ;清标志位
djnz r5,MMXG ;3次之内返回密码修改,重新输入新密码
MOV 7CH,#1 ;否则4位初值不变,且挂机
MOV 7DH,#2
MOV 7EH,#3
MOV 7FH,#4
ljmp guaji
BEEPC: CLR P0.0 ;500HZ信号音子程序
LCALL DELAY
SETB P0.0
LCALL DELAY
RET
DELAY: MOV R6,#2 ;1ms延时子程序
DEL: MOV R7,#255
DEL1: DJNZ R7,DEL1
DJNZ R6,DEL
RET
end
[
本帖最后由 TSB53 于 2009-5-10 14:35 编辑 ]