⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 参考例子_收发asm-1.txt

📁 8888是一款高性能的电话通信芯片
💻 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 + -