[求助] 电话程序

TSB53   2009-5-10 14:06 楼主
老师再帮看看程序~                 

TU.jpg


未命名.bmp



                     ;本程序中使用的信号音,方便起见,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 编辑 ]

回复评论 (1)

CJNE R0,#6CH,BB;
整个程序中也没找到“BB”标号
初始化中要挂机    CLR    P3.6;模拟挂机
外部中断1以下从收码程序开始存在不少问题
你先按照以下这一段程序往下思考。
        ORG 0000H
        LJMP SETUP
        ORG 0003H
        LJMP INEX0P
        ORG 000BH
        LJMP INET0P
        ORG 0013H
        LJMP INEX1P
        ORG 0030H
SETUP:
        MOV    7CH,#1
        MOV    7DH,#2
        MOV    7EH,#3
        MOV    7FH,#4
SETUP1:
        CLR     P3.6;置挂机状态
        MOV    20h,#00H
        MOV    TMOD,#01H
        MOV    TH0,#60
        MOV    TL0,#176
        MOV    R2,#0
        MOV    R3,#0
        MOV    R4,#3
        MOV    R5,#3
        MOV    R0,#78H
        MOV    R1,#7CH
        SETB   IT0
        SETB   EX0
        SETB   IT1
        SETB   ET0
        SETB   EA
MAIN:
        JNB    20H.0,$ ;检查定时时间到了没有,没到就等待
        JNB    P3.2,SETUP1;定时时间到,检查别的并线话机是否摘机,如果摘机则返回到初始化去。
        SETB   P3.6;定时时间到没有并线话机摘机,则自己模拟摘机
        SETB   EX1
        JNB    20H.7,$;等待本次操作完成
        LJMP   SETUP1 ;返回到初始化
INEX0P:
        CLR    EX0
        SETB   TR0
        RETI
INET0P:
        MOV     TH0,#60
        MOV     TL0,#176
        INC     R2
        CJNE    R2,#200,N1S
        MOV     R2,#0
        CLR     TR0
        SETB    20H.0
NIS:
        RETI

INEX1P:
        ;这里程序你那个不成功的,需要研究一下
        SETB 20H.7;操作完成标志
        RETI

设计好功能,按功能要求编制,你要把功能详细告诉别人,才好给你分析

[ 本帖最后由 xu__changhua 于 2009-5-11 00:11 编辑 ]
点赞  2009-5-10 23:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复