Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/15/09 00:15
Read: times


 
#164595 - 8870 ASM code
Responding to: ???'s previous message
TOE EQU P1.0 ;MT8870输出允许,1有效
Q0 EQU P0.1 ;数据位0
Q1 EQU P0.2 ;数据位1
Q2 EQU P0.3 ;数据位2
Q3 EQU P0.4 ;数据位3
STD EQU P0.5 ;MT8870稳定报告,1有效
RING EQU P0.7 ;振铃脉冲,0有效
JDQ EQU P2.0 ;继电器控制,1有效
RUN EQU P2.2 ;摘机控制,0有效
BEEP EQU P2.7 ;蜂鸣器控制,0有效
;P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7
;TOE0 Q0 Q1 Q2 Q3 STD1 RING0
;P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7
;JDQ1 RUN0
ORG 0000H
SJMP INIT
ORG 0030

INIT: CALL BEEPC ;开机时鸣叫一声,以提示启动成功

MOV P2,#10000100B ;继电器断开.摘机控制断开
MAIN: MOV P0,#10111110B ;MT8870输出关断,输入为置1准备
RINGDET: MOV 30H,#150 ;设置多久没有人接听

CTRLDET: DJNZ 47H,$
MOV ACC.1,STD
JB ACC.1,PDXING
DJNZ 47H,$
MOV ACC.0,RING
JNB ACC.0,CONTDET
SJMP CTRLDET

PDXING: CALL LOADDTMF
CJNE A,#11,CTRLDET
CALL BEEPC
SJMP PSWVER

CONTDET: JB P0.7,CONTDET ;等待振铃发生,变0往下走
JNB P0.7,$ ;等待振铃恢复,变1往下走
DJNZ 30H,CONTDET ;继续对铃声计数
CLR RUN ;计满,摘机
CALL BEEPC ;鸣叫一声,提示摘机

PSWVER: CALL LOADDTMF ;取数据
CJNE A,#5,PSWERR ;判断第1位密码

CALL LOADDTMF ;取数据
CJNE A,#8,PSWERR ;判断第2位密码

CALL LOADDTMF ;取数据
CJNE A,#4,PSWERR ;判断第3位密码

CALL LOADDTMF ;取数据
CJNE A,#4,PSWERR ;判断第4位密码

CALL LOADDTMF ;取数据
CJNE A,#7,PSWERR ;判断第5位密码

CALL LOADDTMF ;取数据
CJNE A,#2,PSWERR ;判断第6位密码

CALL LOADDTMF ;取数据
CJNE A,#8,PSWERR ;判断第7位密码

CALL LOADDTMF ;取数据
CJNE A,#10,PSWERR ;判断第8位密码

CALL LOADDTMF ;取数据
CJNE A,#12,PSWERR ;判断按确定键#了没有

CALL BEEPC ;鸣叫两声,提示密码正确
CALL BEEPC
SJMP LOADDA ;转取数操作

;----密码错误处理----
PSWERR: CALL LOADDTMF
CJNE A,#12,PSWERR
CALL BEEPC ;叫三声提示密码错误
CALL BEEPC
CALL BEEPC
SJMP PSWVER ;转再次输入密码

;----取数操作部分代码----
LOADDA: CALL LOADDTMF ;读取按键

CJNE A,#1,BOTT2 ;判断是否为1
SETB JDQ ;是1则继电器吸合
CALL BEEPC ;鸣叫以表示执行
SJMP LOADDA

BOTT2: CJNE A,#10,QUITT ;判断是否为0
CLR JDQ ;是按键0则释放继电器
CALL BEEPC ;鸣叫以表示执行
SJMP LOADDA

QUITT: CJNE A,#8,ERR ;是退出则退出,否则转非命令键处理
SETB RUN ;挂机
CALL BEEPC ;鸣叫以表示执行
CALL BEEPC
CALL BEEPC
LJMP MAIN

ERR: CALL BEEPC ;鸣叫两声以表示出错
CALL BEEPC
SJMP LOADDA ;返回继续取数执行

DELY1S: MOV 40H,#30 ;延时基数
LOOP2: MOV 41H,#30 ;
LOOP1: MOV 42H,#30 ;
DJNZ 42H,$ ;延时计数开始
DJNZ 41H,LOOP1 ;嵌套循环1
DJNZ 40H,LOOP2 ;嵌套循环2
RET

BEEPC: CLR BEEP ;鸣叫子程序
CALL DELY1S
SETB BEEP
CALL DELY1S
RET
;------读一位数据------
LOADDTMF: MOV 50H,#200
LP3: MOV 51H,#158
LP2: MOV 52H,#103
LOP: DJNZ 52H,JSCZ
DJNZ 51H,LP2
DJNZ 50H,LP3
SJMP QUIT

JSCZ: JNB STD,LOP ;等待数据,变1往下走
SETB TOE ;输出允许,准备取数据
NOP
NOP
NOP
NOP
MOV A,P0 ;读入数据
JB STD,$ ;等待按键松开,变0往下走
RR A ;字节对齐
ANL A,#0FH ;保留低四位有效的数据
CLR TOE
RET
QUIT: SETB RUN ;挂机
CALL BEEPC ;鸣叫以表示执行
CALL BEEPC
CALL BEEPC
LJMP MAIN

END





List of 5 messages in thread
TopicAuthorDate
8051 and 8870 interfacing            01/01/70 00:00      
   What do the Datasheets tell you?            01/01/70 00:00      
      from data sheet            01/01/70 00:00      
         You won't get it on a silver platter            01/01/70 00:00      
            8870 ASM code            01/01/70 00:00      

Back to Subject List