📄 参考例子_收发asm-1.txt
字号:
请你帮我检查一下我仿造你的程序修改后的程序。我实在没看出来有什么差异。 [雁难飞]
没有,这些天要学习,刚赶了两篇论文,累死。MT8880没有时间管了。
在你的程序中,DL和DL1的用法好象是错误的,调用DL的延迟时间不对。
将你的程序修改后,现在的现象是:在中断中等待DTMF时,按下电话机按键后收到是
一直是0FH,这里肯定有问题,也不知是程序问题还是硬件问题。反正上拉电阻4.7K应该不会
导致收到的是#0FH,如果那样的话,连初始化都不能够完成的,也就是说程序不会响应电
话机按键的按下。
请你检查一下我仿造你的程序修改后的程序。
将你的程序针对我的硬件修改后的程序:
;---------IC_MT8880_BEGIN-------------------------------------------------
;IC_MT8880的收发程序(8051系列)
; R/W=P0.4(读写输入端)
; CS= P0.5 (片选)
; RS0=P0.6(寄存器选择端)
; CLK= P0.7(时钟输入)
; DO-D3=P0.0-P0.3(数据总线);
IC_MT8880_WR BIT P0.4 ;H/R L/W
IC_MT8880_CS BIT P0.5 ;CS=0 THEN SELECT
IC_MT8880_RS BIT P0.6 ;REGISTER SELECT
IC_MT8880_CLK BIT P0.7
IC_MT8880_DATA EQU P0 ;;;;这是我的硬件连接。
;CLK BIT P1.4 ;;;;这是你的硬件连接
;RSO BIT P1.5
;RW BIT P1.6
;CE BIT P3.7
RW EQU IC_MT8880_WR
CE EQU IC_MT8880_CS
RSO EQU IC_MT8880_RS
CLK EQU IC_MT8880_CLK
;-----------------------------------------------------------
IC_MT8880_DELAY:
DL1:
LCALL DELAY50US
RET
DL:
LCALL DELAY50MS
RET
;-------------------IC_MT8880初始化子程序-------------------
IC_MT8880_RST:
ST: LCALL DL1
CLR CE
CLR CLK
SETB RSO
CLR RW
;MOV A,#2DH ;0010-1101B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV A,#01001101B
MOV P0,A
SETB CLK
LCALL DL1
CLR CLK
LCALL DL1
;MOV A,#20H ;0010-0000B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV A,#01001101B
MOV P0,A
SETB CLK
LCALL DL1
CLR CLK
LCALL DL1
SETB CE;;;;;;
RET
;----------------收码程序-----------------------------------
IC_MT8880_REC:
JS: NOP
CLR CE
CLR CLK
SETB RSO
CLR RW
;MOV A,#22H ;0010-0010B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV A,#01000010B
MOV P0,A
SETB CLK
LCALL DL1
CLR CLK
LCALL DL1
;MOV A,#21H ;0010-0001B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV A,#01000001B
MOV P0,A
SETB CLK
LCALL DL1
CLR CLK
ACALL DL1
LL: ;MOV A,#0FH ;0000-1111B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV A,#00001111B
MOV P0,A
SETB RSO
SETB RW
SETB CLK
ACALL DL1
Y: MOV A,P0
JNB ACC.2,LL
CLR CLK
ACALL DL
CLR RSO
SETB RW
SETB CLK
MOV A,P0
ACALL DL1
ACALL DL1
ACALL DL1
ANL A,#0FH
SETB CE
RET;返回值在ACC中。用于处理。
;----------------发码程序-----------------------------------
IC_MT8880_SEN:;还没有写呢。
RET
;---------IC_MT8880_END---------------------------------------------------
我原来的程序:
;---------IC_MT8880_BEGIN-------------------------------------------------
;IC_MT8880的收发程序(8051系列)
; R/W=P0.4(读写输入端)
; CS= P0.5 (片选)
; RS0=P0.6(寄存器选择端)
; CLK= P0.7(时钟输入)
; DO-D3=P0.0-P0.3(数据总线);
IC_MT8880_WR BIT P0.4 ;H/R L/W
IC_MT8880_CS BIT P0.5 ;CS=0 THEN SELECT
IC_MT8880_RS BIT P0.6 ;REGISTER SELECT
IC_MT8880_CLK BIT P0.7
IC_MT8880_DATA EQU P0
;---------------写数据寄存器子程序--------------------------
IC_MT8880_WD:
ORL A,#0F0H
MOV IC_MT8880_DATA,A
CLR IC_MT8880_CLK
CLR IC_MT8880_RS
CLR IC_MT8880_WR
CLR IC_MT8880_CS
LCALL IC_MT8880_DELAY
SETB IC_MT8880_CLK
LCALL IC_MT8880_DELAY
CLR IC_MT8880_CLK
LCALL IC_MT8880_DELAY
SETB IC_MT8880_CS
LCALL IC_MT8880_DELAY
SETB IC_MT8880_WR
SETB IC_MT8880_RS
RET
;---------------读接收数据寄存器子程序----------------------
IC_MT8880_RD:
MOV A,#0FFH
MOV IC_MT8880_DATA,A
CLR IC_MT8880_CLK
CLR IC_MT8880_RS
SETB IC_MT8880_WR
CLR IC_MT8880_CS
LCALL IC_MT8880_DELAY
SETB IC_MT8880_CLK
LCALL IC_MT8880_DELAY
CLR IC_MT8880_CLK
LCALL IC_MT8880_DELAY
MOV A,IC_MT8880_DATA
SETB IC_MT8880_CS
LCALL IC_MT8880_DELAY
CLR IC_MT8880_WR
SETB IC_MT8880_RS
ANL A,#0FH
RET
;--------------写控制寄存器子程序---------------------------
IC_MT8880_WC:
ORL A,#0F0H
MOV IC_MT8880_DATA,A
CLR IC_MT8880_CLK
SETB IC_MT8880_RS
CLR IC_MT8880_WR
CLR IC_MT8880_CS
LCALL IC_MT8880_DELAY
SETB IC_MT8880_CLK
LCALL IC_MT8880_DELAY
CLR IC_MT8880_CLK
LCALL IC_MT8880_DELAY
SETB IC_MT8880_CS
LCALL IC_MT8880_DELAY
SETB IC_MT8880_WR
SETB IC_MT8880_RS
RET
;----------------读状态寄存器子程序-------------------------
IC_MT8880_RC:
MOV A,#0FFH
MOV IC_MT8880_DATA,A
CLR IC_MT8880_CLK
SETB IC_MT8880_RS
SETB IC_MT8880_WR
CLR IC_MT8880_CS
LCALL IC_MT8880_DELAY
SETB IC_MT8880_CLK
LCALL IC_MT8880_DELAY
CLR IC_MT8880_CLK
LCALL IC_MT8880_DELAY
MOV A,IC_MT8880_DATA
SETB IC_MT8880_CS
LCALL IC_MT8880_DELAY
CLR IC_MT8880_WR
SETB IC_MT8880_RS
ANL A,#0FH
RET
;-----------------------------------------------------------
IC_MT8880_DELAY:
LCALL DELAY500MS
RET
;-------------------IC_MT8880初始化子程序-------------------
IC_MT8880_RST:
MOV A,#00H
LCALL IC_MT8880_WC ;写8880CRA
LCALL IC_MT8880_WC ;写8880CRA
MOV A,#08H
LCALL IC_MT8880_WC ;写8880CRA
MOV A,#00H
LCALL IC_MT8880_WC ;写8880CRB
MOV A,#04H
LCALL IC_MT8880_WC ;写8880CRA,至8880模式 1 为 DTMF,IRQ
RET
;----------------收码程序-----------------------------------
IC_MT8880_REC:
IC_MT8880_REC_1:
;MOV A,#0FFH
;MOV IC_MT8880_DATA,A ;??????
LCALL IC_MT8880_RC ;读 8880 状态寄存器
JNB ACC.2,IC_MT8880_REC_1 ;========3=========
LCALL IC_MT8880_RD ;读 8880 接收数据寄存器
RET
;----------------发码程序-----------------------------------
IC_MT8880_SEN:
PUSH ACC
MOV A,#0DH
LCALL IC_MT8880_WC ;写8880CRA
MOV A,#02H
LCALL IC_MT8880_WC ;写8880CRB,8880 模式2为TONE,DTMF,IRQ,BURST
POP ACC ;SEND DATA!!!!
LCALL IC_MT8880_WD ;发送数据
IC_MT8880_SEN_2:
MOV A,#0FFH
LCALL IC_MT8880_RC ;读 8880 状态寄存器
JNB ACC.1,IC_MT8880_SEN_2 ;
RET
;---------IC_MT8880_END---------------------------------------------------
这是我从您前面贴子里获得的程序。我没发现什么地方不同啊。 [雁难飞]
;mt8880的时钟CP延时长一点,播完一个号码后也要延时,我的程序:
;********************************初始化
;LED BIT P3.5
;RSO BIT P1.5
;RW BIT P1.6
;CE BIT P3.7
;CLK BIT P1.4
;NC\RW\RS0\CLK\P3\P2\P1\P0
ORG 0000H
AJMP ST
ORG 0013H
AJMP TT
ORG 0050H
ST: MOV R1,#00H
ACALL DL1
CLR CE
CLR CLK
SETB RSO
CLR RW
MOV A,#2DH ;0010-1101B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV P1,A
SETB CLK
ACALL DL1
CLR CLK
ACALL DL1
MOV A,#20H ;0010-0000B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV P1,A
SETB CLK
ACALL DL1
CLR CLK
ACALL DL1
;***************************
;*************************接收程序
JS: NOP
CLR CLK
SETB RSO
CLR RW
MOV A,#22H ;0010-0010B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV P1,A
SETB CLK
ACALL DL1
CLR CLK
ACALL DL1
MOV A,#21H ;0010-0001B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV P1,A
SETB CLK
ACALL DL1
CLR CLK
ACALL DL1
LL: MOV A,#0FH ;0000-1111B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV P1,A
SETB RSO
SETB RW
SETB CLK
ACALL DL1
Y: MOV A,P1
JNB ACC.2,LL
CLR CLK
ACALL DL
CLR RSO
SETB RW
SETB CLK
MOV A,P1
ACALL DL1
ACALL DL1
ACALL DL1
ANL A,#0FH
MOV R5,A ;将接收的数字利用二极管的闪烁次数显示出来
CLR CLK
ACALL DL1
ACALL DISPLAY ;调用显示程序
AJMP LL
RET
;*************************
;*************************
;显示程序
DISPLAY:NOP
SS1: CLR LED
ACALL DL1
SETB LED
ACALL DL1
DJNZ R5,SS1
RET
;**
;************************
;延时程序 600MS 随便延时,有一定长度就行
DL1: MOV R3,#0FFH
DL12: MOV R4,#0FFH
DL: NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R4,DL
DJNZ R3,DL12
RET
;*************************
;播号程序
BH: CLR RSO
CLR LED
MOV A,#08H
MOV P1,A
SETB CLK
ACALL DL1
ACALL DL1
ACALL DL1
CLR CLK
ACALL DL1
ACALL DL1
ACALL DL1
SETB RSO
SETB RW
MOV A,#6FH ;0110-1111B;NC\RW\RS0\CLK\-\P3\P2\P1\P0
MOV P1,A
SETB CLK
ACALL DL1
LOOP0: MOV A,P1
JNB ACC.1,LOOP0
CLR CLK
ACALL DL1
SETB LED
ACALL DL1
ACALL DL1
ACALL DL1 ;播号码#8
;你还要播别的再加就是了。这个程序已能成功的接收和播号了
;************************
我已看了一下,发现以下问题。 [liping_88] [9次] 02-7-30 9:00:08
1、MOV A,#2DH怎么会等于MOV A,#01001101B,0100怎么会是,你也太粗心了。
2、我的延时也是听说的,我只有DL1,延时600MS,没有DL,具体要延时多长我也不知
道,但我的还是行的,你把延时加长看行不行。
如有问题再联系吧!:)
因为我的控制线与你的接法有区别。... [雁难飞]
因为我的控制线与你的接法有区别。当你MOV A,#2DH 时,也就是将RW=0、RS0=1、CLK=0,
而我
IC_MT8880_WR BIT P0.4
IC_MT8880_CS BIT P0.5
IC_MT8880_RS BIT P0.6
IC_MT8880_CLK BIT P0.7
如果也要将RW=0、RS0=1、CLK=0的话,就应该是MOV A,#01001101B
这个区别(延时)是硬件的区别导致的。
IC_MT8880_WR BIT P0.4 ;H/R L/W
IC_MT8880_CS BIT P0.5 ;CS=0 THEN SELECT
IC_MT8880_RS BIT P0.6 ;REGISTER SELECT
IC_MT8880_CLK BIT P0.7
IC_MT8880_DATA EQU P0;;;;;;这是我的硬件连接。
;CLK BIT P1.4;;;;;;这是你的硬件连接
;RSO BIT P1.5
;RW BIT P1.6
;CE BIT P3.7
RW EQU IC_MT8880_WR
CE EQU IC_MT8880_CS
RSO EQU IC_MT8880_RS
CLK EQU IC_MT8880_CLK
十分抱歉,我没有看仔细,我再仔细看一下。另外你把输入端的100K的电阻改为50K试,我的原来也不行,改了行了。 [liping_88]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -