??? 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 |
Topic | Author | Date |
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 |