搜索
bottom↓
回复: 29

有没有avr驱动M8880的范例啊?

[复制链接]

出0入0汤圆

发表于 2005-8-18 19:50:02 | 显示全部楼层 |阅读模式
我调了几天都出不来,大伙帮忙啊!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
头像被屏蔽

出0入0汤圆

发表于 2005-8-18 20:15:13 | 显示全部楼层
还没有人提供这方面的范例。

出0入0汤圆

发表于 2005-8-19 08:53:48 | 显示全部楼层
我以前用C51写了一段MT8880+ISD2532的程序,使用keil编译,稍微修改一下就可用于AVR了。该程序可以正确的发送和解调DTMF信号,已经调试通过。硬件连接已经不记得了。



//2004.2.16 于广西南宁



#include <reg51.h>

#include <absacc.h>

#include <stdio.h>

#include < intrins.h >



#define uchar unsigned char

#define uint  unsigned int



//非正规接法

#define on   0          //点亮LED

#define off  1          //熄灭LED



#define high 1

#define low  0



sbit  led  =P3^7 ;



//ISD2532

sbit  eom_2532  =P3^3 ;

sbit  a0_2532   =P1^5 ;

sbit  pd_2532   =P1^6 ;

sbit  ce_2532   =P1^7 ;

//ISD2532



//8870

sbit  rw_8880   =P2^0 ;

sbit  cs_8880   =P2^7 ;

sbit  rsi_8880  =P2^1 ;

sbit  cp_8880   =P2^2 ;

sbit  irq_8880  =P3^2 ;         //int0

//8870





sbit  jdq   =P1^0 ;

sbit  jdq1  =P1^1 ;



void initsystem(void)

{

    TMOD=0x20;

        TL1=0xfd;              //baud  57600

          TH1=0xfd;

          SCON=0x50;

          PCON=0x00;

          TR1=1;

          EA=1;



          led=1;

}



void delay(count)

{

          unsigned char i;

          unsigned int  j;                                                                                                                               

          for(i=0;i<count;i++)                                                                                                                               

                for(j=0;j<2500;j++)                                                                                                                               

                  ;                                                                                                                                         

}



void delay1(count)

{

          unsigned char  i;

          unsigned char  j;

          for(i=0;i<count;i++)

                for(j=0;j<256;j++)

                  ;

}







void ss(uchar sscs)

{

          uchar i;

          for(i=0;i<=sscs;i++)          //指示退出设置GPRS模块状态

   {

             led=on;

             delay(20);

             led=off;

             delay(20);

   }

}



//ISD2532播音函数

//输入参数  要播放的语音段码

//输出参数  无

void speak(uchar which)

{

          a0_2532=1;

          pd_2532=0;                    //产生复位信号

          delay(1);

          pd_2532=1;

          delay(1);

          pd_2532=0;



        if(which==0x01)            //是不是第一段语音

        {

                   a0_2532=0;                 //拉低a0,开始播音

                  ce_2532=0;                 //ce端加低脉冲

                  _nop_();

                  ce_2532=1;



                  eom_2532=1;

                  while(eom_2532==1);      //等待第一段放音结束

                  return;

          }

        else

          {

                while(which!=0x01)        //是否已经搜索到第which段语音

                  {

                            a0_2532=1;                 //a0变高,进入语音检索模式

                     ce_2532=0;                 //ce端加低脉冲,开始搜索第which段语音

                     _nop_();

                     ce_2532=1;

                          eom_2532=1;

                while(eom_2532==1);

                          which--;

                  }

                  a0_2532=0;                 //拉低a0,开始播音

                  ce_2532=0;                 //ce端加低脉冲

                  _nop_();

                  ce_2532=1;

                  eom_2532=1;

                  while(eom_2532==1);       //等待放音结束

          }

}





//MT8880控制函数

void writecrab(uchar value_cra,value_crb)

{

        cs_8880  =0;

          cp_8880  =0;

          rw_8880  =0;

          rsi_8880 =1;

          P0=value_cra;       //写CRA

          cp_8880=1;

          _nop_();

          _nop_();

          cp_8880=0;



          P0=value_crb;       //写CRB

          cp_8880=1;

          _nop_();

          _nop_();

          cp_8880=0;

          cs_8880=1;



}





//发送DTMF信号

void senddtmf(uchar dm)

{

          cs_8880 =0;

          cp_8880 =0;

          rw_8880 =0;

          rsi_8880=0;

          P0=dm;

          cp_8880=1;

          delay(10);

          cp_8880=0;

          cs_8880=1;

}







//读MT8880状态寄存器

//输入参数  无

//输出   

uchar read_8880status(void)

{

        uchar status_dtmf;

        cs_8880  =0;

        cp_8880  =0;

        rw_8880  =1;

        rsi_8880 =1;

        status_dtmf = P0 ;

        cp_8880=1;

        delay(10);

        cp_8880=0;

        cs_8880  =1;

        return(status_dtmf);

  

}





//读MT8880数据寄存器

//输入参数  无

//输出   

uchar read_8880data(void)

{

        uchar data_dtmf;

        cs_8880  =0;

        cp_8880  =0;

        rw_8880  =1;

        rsi_8880 =0;

        data_dtmf = P0 ;

        cp_8880=1;

        delay(10);

        cp_8880=0;

        cs_8880  =1;

        return(data_dtmf);

  

}





void main(void)

{

          uchar i;

          ss(4);

          initsystem();

//  delay(150);

        for(i=1;i<=11;i++)

        {

                speak(i);

        }

          writecrab(0x0e,0x00);          //检测信号音

          jdq =on;

          jdq1=on;

          delay(200);

          writecrab(0x09,0x00);          //置为拨号状态

          delay(5);



while(1)

{

        senddtmf(0x0c);    //#

        led=off;

        delay(20);



        senddtmf(0x01);

        led=on;

        delay(10);



        jdq1=off;

        writecrab(0x0d,0x00);

        while(1)

        {

        read_8880status();

                for(i=1;i<=11;i++)

                {

                        speak(i);

                }

        }

        

}







        while(1)

        {

                senddtmf(0x01);

                led=off;

                delay(5);

               

                senddtmf(0x03);

                  led=on;

                  delay(5);   



                  senddtmf(0x08);

                  led=off;

      delay(5);



                  senddtmf(0x07);

                  led=on;

                  delay(5);   



                  senddtmf(0x08);

                  led=off;

      delay(5);



                  senddtmf(0x08);

                  led=on;

                  delay(5);   

   

                  senddtmf(0x06);

                  led=off;

      delay(5);



                  senddtmf(0x02);

                  led=on;

                  delay(5);   



                  senddtmf(0x08);

                  led=off;

      delay(5);



                  senddtmf(0x07);

                  led=on;

                  delay(5);   



                  senddtmf(0x09);

                  led=off;

      delay(5);

    }

}







//串行口接收中断函数



void uart(void) interrupt 4 using 3

{

        RI=0;

        EA=0;





        EA=1;

}







/*

while(1)

{

      senddtmf(0x0c);

          led=off;

      delay(20);



          senddtmf(0x01);

          led=on;

          delay(10);

}*/





/*

      while(1)

             {

           for(i=1;i<=11;i++)

                {

                      speak(i);

                       }

                 }

*/





点击此处下载armok0163806.rar






-----此内容被Jacky于2005-08-21,08:59:00编辑过

出0入0汤圆

 楼主| 发表于 2005-8-19 20:28:36 | 显示全部楼层
谢谢Jacky大侠,今晚再试试

出0入0汤圆

发表于 2005-8-20 14:52:25 | 显示全部楼层
要是能修改一下作为范例就更好了,毕竟做电话传输的技术比较成熟,应用也比较广泛。

出0入0汤圆

发表于 2005-8-20 21:16:47 | 显示全部楼层
请问这个程序的系统时钟是多少啊?

出0入0汤圆

发表于 2005-8-21 07:38:32 | 显示全部楼层
11.0592 MHZ

因为时间关系,我没有时间把它移植到AVR并修改成范例了,心有余而力不足啊,况且家里现在没电话线。

关于 greatsnows 过热阿塔斯说的“电话传输的技术”,我想目前讨论比较多的还是在智能住宅和远程控制方面的应用吧,但目前似乎还没看到大规模的商品化使用。

我以前曾尝试过用一对健伍的对讲机通过DTMF来传送指令信号,使用MT5087+MT8870(当时还不知道有MT8880、MT8888等芯片),DTMF信号由对讲机的耳塞、麦克风插孔输入。经过试验感觉DTMF信号本身的抗干扰性能较好,即使在较大的背景噪音的情况下,8870仍能正确的解调,只是对讲机由于容易受到雷电、距离及其他的因素的影响,我还是对这一方案不太放心,由于条件限制,也没有仔细测试其可靠性和实用性,最终不了了之了。

不知道有其他人做过类似的东西吗?想知道你们时怎样解决这些问题的。



呵呵,当时因为MT5087看了一本李朝×编写的什么“单片机与PC通讯”之类的书(是我们的教材,书名不记得了),这是完全一本错误百出、校对粗心、抄袭拼凑而成的书,让我走了很多弯路,当时太相信书本上的东西了。补充这些东西并无人身攻击的意思,只是对学术界的抄袭之风深表痛恨及无奈。





下面是5087+8870的电路图,给需要的朋友作为参考

点击此处下载armok0164266.rar





-----此内容被Jacky于2005-08-21,07:56:04编辑过


-----此内容被Jacky于2005-08-21,08:58:17编辑过

出0入0汤圆

发表于 2005-8-21 22:02:22 | 显示全部楼层
请教Jacky 边城浪子,我把你的程序移植到m16上(GCC)但是mt8880不工作。请您帮忙看看吧。我都加了注释,结构没有大的修改。

点击此处下载armok0164406.rar

出0入0汤圆

发表于 2005-8-21 22:03:06 | 显示全部楼层
整了一整天都没出来,我以前也做过也是没有出来就放下了。请给点指导吧



现在只做发射的部分。
-----此内容被greatsnows于2005-08-21,22:11:04编辑过

出0入0汤圆

发表于 2005-8-21 22:33:20 | 显示全部楼层
把你的电路图贴上来吧,首先要保证你的电路没问题,这个芯片使用难度不大。

“mt8880不工作”说得太笼统,用示波器看过发射端的波形了吗?

使用PORTC,最好在熔丝位中禁止JTAG,不知你禁止了没?

粗略的看了一下时序,没什么问题

你要测试8880是否拨号,最好是在while循环中不停的拨号,注意两个号码之间可设置0.5秒的间隔

出0入0汤圆

发表于 2005-8-21 23:09:56 | 显示全部楼层
谢谢你的帮助,我用“在while循环中不停的拨号,注意两个号码之间可设置0.5秒的间隔”的办法,发现有频率产生(示波器在1v,2ms的档位上)对吧?

不过,现在还有一个问题,就是这个信号是一闪而过的,真正用到的时候这个信号要保持多长时间呢?怎么实现呢?

我用的是datasheet中提到的那个图




-----此内容被greatsnows于2005-08-21,23:14:36编辑过

出0入0汤圆

发表于 2005-8-22 08:08:46 | 显示全部楼层
1、在观察一下信号的幅值,正确的DTMF信号可以明显的看到两个频率。

2、8880的信号持续时间好象是固定的,如是5087则可以通过延时和发送空玛来控制信号持续时间。

3、信号持续0.3秒以上即可(估计0.1秒也可以,自己试验一下吧),你也可以观察一下电话机的重拨,按照这个速度绝对没问题。

4、过热阿塔斯若试验成功了就把它做成范例吧,我就可以不劳而获了

出0入0汤圆

 楼主| 发表于 2005-8-22 12:59:52 | 显示全部楼层
datasheet好像说8880在使用前必须要软复位,方式是读一次状态寄存器、以0,0,0x8,0分别写一次cr,再读一次sr,但在Jacky的程序中好像看不到,为什么呢?

出0入0汤圆

发表于 2005-8-22 16:20:10 | 显示全部楼层
不用这么复杂吧,这个程序可以拨通我的手机啊

出0入0汤圆

发表于 2005-8-22 21:57:36 | 显示全部楼层
软件复位的确提到,但是实际并没有必要,只要在电源稳定后就可以。



我要是把这个做好了一定做成范例的,只是最近真的太忙,等全国电子大赛结束一定奉上。



那么按照Jacky 边城浪子的意思,就是说我那个发射已经出来了吧:)我再和别的同学的接收对一下。

谢谢你!



能不能知道你的联系方式?我的qq:83422233,或者msn:greatsnows@hotmail.com



真的没太多时间,明天cc1000又出来。。。

出0入0汤圆

发表于 2005-8-23 08:19:11 | 显示全部楼层
QQ;215958963

出0入104汤圆

发表于 2005-10-25 13:40:20 | 显示全部楼层
程序错误,mt8880不能正常运行,可参考以下的程序。



#define   M8880_CLK2_high   PORTA |=0x10

#define   M8880_CLK2_low    PORTA&=~0x10

#define   M8880_RS0_high    PORTA |=0x20

#define   M8880_RS0_low     PORTA&=~0x20

#define   M8880_RW_high     PORTA |=0x40

#define   M8880_RW_low      PORTA&=~0x40

#define   M8880_CS_high     PORTA |=0x80

#define   M8880_CS_low      PORTA&=~0x80



//写入MT8880控制字函数

void write_crab(uchar cra,uchar crb)

{

        DDRA |= 0x0F;         // 设置PA3~0输出连接MT8880 D0~3  

        PORTA&= 0xF0;         // 保留高四位/屏蔽低四位

       

        M8880_CS_low;         // 使能MT8880

          M8880_CLK2_low;            // 脉冲先为低电平

          M8880_RW_low;            // 选择写入MT8880功能

          M8880_RS0_high;            // 写入MT8880控制寄存器

       

          PORTA|= cra & 0x0F;   // 写入CRA控制字

          NOP();                  // 空操作       

          M8880_CLK2_high;            // 产生写脉冲

          NOP();                  // 空操作

        NOP();                     // 空操作

          M8880_CLK2_low;            // 低电平

       

        if((cra&0x08)==0x08)  // 是否要写入CRB控制字

        {

          PORTA&=0xF0;        // 保留高四位/低四位清零

            PORTA|=crb&0x0F;    // 写入CRB控制字

            NOP();                  // 空操作          

            M8880_CLK2_high;            // 产生写脉冲

            NOP();                  // 空操作

          NOP();                     // 空操作

            M8880_CLK2_low;            // 脉冲低电平

        }       

          M8880_CS_high;            // 关闭MT8880       

}

//读MT8880状态寄存器

//输入参数  无

//输出 状态寄存器数据  

uchar read_8880status(void)

{

        uchar status_reg;

       

        DDRA &= 0xF0;               // 设置PA3~0输入         

        M8880_CS_low;                 // 使能MT8880

          M8880_CLK2_low;                 // 脉冲先为低电平       

          M8880_RW_high;                 // 选择读MT8880       

          M8880_RS0_high;                 // 读入状态寄存器

       

        status_reg=PINA;                  // 读入状态寄存器数据

          NOP();                       // 空操作       

        M8880_CLK2_high;                 // 产生写脉冲

          NOP();                       // 空操作

        NOP();                          // 空操作

          M8880_CLK2_low;                 // 脉冲低电平

          M8880_CS_high;                 // 关闭MT8880

        return(status_reg);

}



//等待发送标志置1,发送DTMF结束

void send_dtmf_end(void)

{

    uchar temp;

    uint  coun;

    for (coun=0;coun<2000;coun++)

   {

    if(0x02==(0x02&(temp=read_8880status()))) //等待发送标志置1

    break;                                   //结束                        

   }

}



//发送DTMF

void send_dtmf(uchar dm)

{       

        DDRA|=0x0F;           //设置PA3~0为输出/保留高四位输出

        PORTA&=0xF0;          //保留高四位/屏蔽低四位

       

          M8880_CLK2_low;                                           

          M8880_CS_low;                 

          M8880_RS0_low;                 

          M8880_RW_low;                         

               

        if(dm==0) dm=10;  



          PORTA|=dm & 0x0F;          //写入MT8880发送寄存数据

          NOP();                // 空操作       

          M8880_CLK2_high;          //产生写脉冲

          NOP();                //空操作

        NOP();                   //空操作

          M8880_CLK2_low;

          M8880_CS_high;          //关闭8880       

        send_dtmf_end();          //等待发送DTMF结束

        delay_nms(200);           

}

//读MT8880接收数据寄存器

//输入参数  无

//输出 接收数据寄存器数据  

uchar read_8880data(void)

{

        uchar data_dtmf;

        DDRA &= 0xF0;               //设置PA3~0为输入         

        M8880_CS_low;                       

          M8880_CLK2_low;                  

          M8880_RS0_low;                    

          M8880_RW_high;                           

        data_dtmf=PINA & 0x0F;

          NOP();                      // 空操作       

        M8880_CLK2_high;                //产生写脉冲

          NOP();                      //空操作

        NOP();                          //空操作

          M8880_CLK2_low;       

          M8880_CS_high;                //关闭8880

        return(data_dtmf);

}

出0入0汤圆

发表于 2006-9-19 14:19:53 | 显示全部楼层
我用上面的程序,怎么发出来的数据不对,要么是00,要么是08,是哪里有问题呢,请高手指点一下

出0入0汤圆

发表于 2006-9-19 17:12:59 | 显示全部楼层
请高手指点啊,在线等候

出0入0汤圆

发表于 2006-9-23 17:14:16 | 显示全部楼层
兄弟,我也在做这个,先MT8880后用了MT8888,发送都可以,但接收不行,还有就是判断信号音也不行。我是用差分方式接到电话线上的,我用示波器看电话线干扰较多,是不是该用1:1的变压器好点呢?待指教!

出0入0汤圆

发表于 2006-9-25 15:31:31 | 显示全部楼层
wxxmickey 五光十色,你能不能把你发送程序发出来,我只要发送就OK了,我的怎么不稳定?

出0入13汤圆

发表于 2006-9-25 17:00:19 | 显示全部楼层
最近我也做MT8880的接电话解码!不过试了N多次也不行!共享一下!



发送程序

    程序执行后,将以DTMF方式发送预存在数组W_BUF中的7位数码(5135535)。

#include <reg51.h>

#define uc unsigned char

#define ui unsigned int

/* 子函数(子程序)说明 */

void initialize(void);

void tran_init(void);

void transmit(uc data *p,uc count);

void delay(ui l);

/* 主函数(主程序) */

void main(void)

{ uc data w_buf[7];

  SP=0x5f;

/* 预存数码5135535 */

  w_buf[0]=5;

  w_buf[1]=1;

  w_buf[2]=3;

  w_buf[3]=5;

  w_buf[4]=5;

  w_buf[5]=3;

  w_buf[6]=5;

  initialize();

  tran_init();

  transmit(w_buf,7);

  initialize();

  for(;;);}

/* MT8880初始化子函数 */

void initialize(void)

{ P1=0x3f;  /* 读SR */

  P1=0x20;  /* CRA=0000 */

  P1=0x20;  /* CRA=0000 */

  P1=0x28;  /* CRA=1000 */

  P1=0x20; }  /* CRB=0000 */

/* 发送初始化子函数 */

void tran_init(void)

{ P1=0x29;  /* CRA=1001 */

  P1=0x21; } /* CRB=0001 */

/* 发送操作子函数 */

void transmit(uc data *p,uc count)

{ uc i;

  for (i=0;i<count;i++,p++)

  { P1=*p;   /* 发送数码 */

    delay(6000); /* 延时 */

    P1=0x3f; }}/* 读SR */

/* 延时子函数 */

void delay(ui l)

{ ui i;

  for (i=0;i<l;i++);}





3.2 接收程序

    程序利用单片机的INT0以中断方式接收DTMF信号,接收的7位数码存入数组R_BUF中。

#include <reg51.h>

#define uc unsigned char

uc data i,r_buf[7];

/* 子函数(子程序)说明 */

void initialize(void);

void rece_init(void);

/* 主函数(主程序) */

void main(void)

{ SP=0x5f;

  i=0;

  initialize();

  rece_init();

  for(;;);}

/* MT8880芯片初始化子函数 */

void initialize(void)

{ P1=0x3f;  /* 读SR 11*/

  P1=0x20;  /* CRA=0000 10*/

  P1=0x20;  /* CRA=0000 10*/

  P1=0x28;  /* CRA=1000 10*/

  P1=0x20; }  /* CRB=0000 10*/

/* 接收初始化子函数 */

void rece_init(void)

{ P1=0x24;  /* CRA=0100 10*/

  IT0=1;    /* 边沿触发 */

  IE=0x81; }  /* 允许中断,开中断 */

/* 接收中断服务程序 */

void int0(void) interrupt 0 using 1

{ P1=0x3f;  /* 读SR 11*/

  P1=0x1f;  /* 读RDR 01*/

  r_buf[i++]=P1&0x0f; } /* 保存 */

出0入0汤圆

发表于 2006-11-21 13:21:46 | 显示全部楼层
求助mt8880





我用的是STC12C5406单片机 ,11.0592MHz 2口与MT8880连接,单发单收,我直接把一块板子的发连到了另一块的收上,

发现有信号发出来,但接收板要么收不到,要么是零.我晕菜了.请高手指教;我的邮箱study.li@yahoo.com.cn下面是程序,

电路与datasheet上的点型应用一样,只是将那个374k欧姆换成了300k欧姆。

sbit   mt8880_rw  =   P2^4;

sbit   mt8880_rs0 =   P2^5;

sbit   mt8880_cs  =   P2^6;

sbit   mt8880_clk =   P2^7;

sbit   mt8880_cp  =   P3^2;







//发送初始化

        mt8880_rst();

        mt8880_wc(0x0d);         //写cra,中断允许,dtmf模式,音频输出允?

        mt8880_wc(0x00);        //写crb,突发模式,dtmf模式

        mt8880_rs();

        for(;;)

        {                                

                for(i=0;i<11;i++)

                {

                               mt8880_wd(w_buf);

                               do{

                                    //WDT_CONTR=0X3c;

                        }while(mt8880_rs() & 0x02 == 0);

                }

                for(gh=0;gh<200;gh++)

                        Delay(300);

               

        }













//接收初始化//

        mt8880_rst();

        mt8880_wc(0x0c);         //写cra,中断允许,dtmf模式,

        mt8880_wc(0x00);        //写crb,突发模式,dtmf模式

        mt8880_rs();

        rece_init();











/* 接收中断服务程序 */



void int0(void) interrupt 0 using 1

{

                    mt8880_rs();

        

        r_buf[i++] = mt8880_rd() ;          /* 保存 */

                                        /* 读SR */

        if(i>10)

        {

                i=0;

                IE=0x00;

                h=1;

        }

        

}







/* 接收初始化子函数 */



void rece_init(void)

{

        

        IT0=1;                        /* 边沿触发 */

        IE=0x81;                 /* 允许中断,开中断 */

}





/***************************************************************

*名称:     mt8880_rst*功能:   

初始化mt8880,发送禁止,中断禁止,dtmf模式,突发模式*************

***************************************************/

void mt8880_rst()

{      



        mt8880_rs();

        mt8880_wc(0);                   //写控制寄存器,确保控制寄存器指针指向cr

                    mt8880_wc(0);     

        mt8880_wc(8);                   //写控制寄存器a,输出禁止,中断禁止,dtm

                    mt8880_wc(0);                   //写控制寄存器b,突发模式,dtmf模式

                    mt8880_rs();                    //读状态寄存器,用以清除各?

//        mt8880_cs=1;

}



/******************************************

称:     mt8880_wc(

*功能:     写控制寄存器cra或

*入口参数: com--要写入的数据*出口参数

*****************************************/

void mt8880_wc(unsigned char com)

{   

        mt8880_cs=0;                  

        mt8880_rs0=1;   

        mt8880_rw=0;   

        com&=0x0f;   

        mt8880_data&=0xf0;   

        mt8880_data|=com;

        _nop_();   

        mt8880_clk=1;

        _nop_();   

        mt8880_clk=0;   

        _nop_();

        mt8880_cs=1;

}

/***************************************

*名称:     mt8880_wd(

*功能:      写mt8880的发送数据寄?

*入口参数: dat--要发送的?



*出口参数: 无************************************/

void mt8880_wd(unsigned char dat)

{   

        mt8880_cs=0;   

        mt8880_rs0=0;              

        mt8880_rw=0;

        dat&=0x0f;   

        mt8880_data&=0xf0;   

        mt8880_data|=dat;

        _nop_();  

        mt8880_clk=1;

        _nop_();   

        mt8880_clk=0;

    _nop_();

        mt8880_cs=1;

}



/***************************************

*名称:      mt8880_r

*功能:     读mt8880的接收数据寄

*入口参数:

*出口参数: temp--读出的数据,低4?



****************************************/

unsigned char mt8880_rd()

{   

        unsigned char temp;   

        mt8880_cs=0;           

        mt8880_rs0=0;   

        mt8880_rw=1;  

        _nop_();  

        mt8880_clk=1;  

        _nop_();

        temp=mt8880_data;

        _nop_();

        mt8880_clk=0;   

        _nop_();

        temp&=0x0f;   

        mt8880_cs=1;   

        return(temp);

}



/***************************************

*名称:      mt8880_rs(

)*功能:     读mt8880的状态寄?

*入口参数:

*出口参数: temp--读出的数据,低4位

***************************************/   

unsigned char mt8880_rs()

{   

        unsigned char temp;

        mt8880_cs=0;   

        mt8880_rs0=1;

        mt8880_rw=1;  

        _nop_();

        mt8880_clk=1;

        _nop_();

        temp=mt8880_data;

        temp&=0x0f;

        _nop_();

        mt8880_clk=0;

        _nop_();

        mt8880_cs=1;

        return(temp);

}

出0入0汤圆

发表于 2006-12-4 21:46:28 | 显示全部楼层
我现在正在做一个电话拨号的系统,通过电话智能测试仪拨号是没问题 的,但接到电话线上时,就是拨不了电话号码,请问是什么原因,如何解决呢?

非常感谢!

出0入13汤圆

发表于 2007-2-13 10:20:39 | 显示全部楼层
/*通过我测试过得没有任何的问题,接收发送都可以!

发送信号和接收信号需要用放大器耦合出去



*----------------------------------------------

*文件名:    MT8880.C

*开发:   

*创建日期:  2006-9-1 10:56

*创建人:   廖晶晶

*功能:      8880功能函数

    T_Staut=DDRC|0xF0;//使PC4~PC7输出

        MT_Staut=DDRC&0x0F;//使PC4~PC7输入

        MT_SDataBus=PORTC|0xF0;//DATA=1

        MT_SDataBus=PORTC&0x0F;//DATA=0

-----------------------------------------------

-----------------------------------------------*/

#define  _MT8880_C

#include         "..\include\mainhard.h"

/***************************************************************

*名称:     void MT8880_WC(Byte com);

*功能:     写控制寄存器CRA或CRB

*入口参数: com--要写入的数据

*出口参数: 无

****************************************************************/



void MT8880_WC(unsigned char com)

{

        MT_Staut=DDRC|0xF0;//使PC4~PC7输出

        MT_SDataBus=PORTC|0xF0;//DATA=1

        delay_ms(20);

        MT_CS_L;

        MT_RS0_H;delay_ms(20);

        MT_RW_L;delay_ms(20);

        delay_ms(20);

        com&=0xF0;       

        MT_SDataBus&=0x0F;

        delay_ms(20);

        MT_CLK_H;

        MT_SDataBus|=com;

        delay_ms(20);       

        MT_CLK_L;

        _NOP();       

        MT_CS_H;

}



/***************************************************************

*名称:     void MT8880_WD(Byte dat);

*功能:      写MT8880的发送数据寄存器

*入口参数: dat--要发送的数据

*出口参数: 无

****************************************************************/



void MT8880_WD(unsigned char dat)

{       

        MT_Staut=DDRC|0xF0;//使PC4~PC7输出

        MT_SDataBus=PORTC|0xF0;//DATA=1

        MT_CS_L;

        MT_RS0_L;delay_ms(20);         

        MT_RW_L;

        delay_ms(20);

        dat&=0xF0;

        MT_SDataBus&=0x0F;       

        MT_CLK_H;delay_ms(20);

        MT_SDataBus|=dat;       

        _NOP();_NOP();_NOP();

        MT_CLK_L;_NOP();

        delay_ms(20);

        MT_CS_H;

}



/***************************************************************

*名称:      Byte MT8880_RD(void);

*功能:     读MT8880的接收数据寄存器

*入口参数: 无

*出口参数: temp--读出的数据,低4位有效

****************************************************************/



unsigned char MT8880_RD(void)

{

        unsigned char temp;

        MT_Staut=DDRC&0x0F;//使PC4~PC7输入

        delay_ms(10);        

        MT_CS_L;delay_ms(10);   

        MT_RS0_L;

        MT_RW_H;delay_ms(10);

        MT_CLK_H; delay_ms(10);

        PORTC=0XF0;        

        temp=PINC;delay_ms(10);       

        _NOP();_NOP();_NOP();        

        MT_CLK_L;

        MT_CS_H;

        return(temp);

}



/***************************************************************

*名称:      Byte MT8880_RS(void);

*功能:     读MT8880的状态寄存器

*入口参数: 无

*出口参数: temp--读出的数据,低4位有效

****************************************************************/   



unsigned char MT8880_RS(void)

{

        unsigned char temp;

        MT_Staut=DDRC&0x0F;//使PC4~PC7输入

        MT_SDataBus=PORTC|0xF0;//DATA=1

        MT_CS_L;delay_ms(20);

        MT_RS0_H; delay_ms(20);     

        MT_RW_H;delay_ms(20); MT_CLK_H;

        _NOP();delay_ms(40);

        temp=MT_RDataBus&0xF0;

        _NOP();_NOP();_NOP();

        MT_CLK_L;

        _NOP();

        delay_ms(20);

        MT_CS_H;

        return(temp);

}

/***************************************************************

*名称:     void InitMT8880(Byte mode);

*功能:     初始化MT8880,中断允许,双音模式

*入口参数: mode 可以选择CP8880,DTMF8880,RST8880三个参数

*出口参数: 无

****************************************************************/

void InitMT8880(unsigned char mode)

{       

    MT8880_RS();

        MT8880_WC(0x00);delay_ms(50);                //写控制寄存器,确保控制寄存器指针指向CRA

        MT8880_WC(0x00);delay_ms(50);         

        MT8880_WC(mode);delay_ms(50);            //写控制寄存器A

        MT8880_WC(0x00);delay_ms(50);            //写控制寄存器B

        MT8880_RS();                        //读状态寄存器,用以清除各标志        

        delay_ms(20);//Prints("INIT MT OK!");       

}

//以下是中断部分

//外中断1服务程序

#pragma interrupt_handler int1_isr:3

void int1_isr(void)

{  PUSH_DATA=MT8880_RD();

   PUSH_DATA=(PUSH_DATA&0xf0)>>4;

     if((DTMF_COUNT<20)&(SOUND_OK==0))// 接收电话解码部分

       {  if(PUSH_DATA!=0x0c)//收到的不是"#"

            {  MT_DTMF[DTMF_COUNT]=PUSH_DATA;       

//Putchar(PUSH_DATA);Putchar(PUSH_DATA);                                          

                       DTMF_COUNT++;            

                    }

           else//收到"#"

            { MT_DTMF[19]=DTMF_COUNT++;                          

                      DTMF_COUNT=0;  DTMF_OVER=1;

                    }   

   }

   else

   {   DTMF_COUNT=0;   }

MT_DATA=MT8880_RS();

}

//初始化部分

// MT8880_WC(0X40);MT8880_RS();//接收初始化部分

//以下初始化部分可以接收也可以发送! 2006-10-24-ljj16:23

MT8880_WC(0Xd0);MT8880_WC(0X00);MT8880_RS(); delay_ms(1000);

出0入0汤圆

发表于 2007-2-15 08:58:42 | 显示全部楼层
好久的帖子啊,呵呵

我在blog上发现的:

http://www.ednchina.com/blog/wang1jin/13978/message.aspx

不知有没有用。

出0入0汤圆

发表于 2007-2-15 08:59:37 | 显示全部楼层
帮不上忙,最好是有拨号测试仪器,经常是硬件问题造成。

原来有做过电话远程控制器,但只接收,用得是9270。没有用MT8880。

出0入0汤圆

发表于 2007-6-13 21:01:45 | 显示全部楼层
我用MT8880收发调试成功 /*ATmega64 at Ext 8.0000M*/  

注意:虽然写的是MT8880,其实是MT8888;在使用MT8888

      之前改写初始配置为你需要的MT8880_WC(0x0d);

      MT8880_WC(0x00); 并且响应中断后读状态寄存器

      清除中断标志,等待下次收发DTMF。



void MT8880_init(void)

{

MT8880_Rst();     //MT8880C必须在上电100ms以后完成

delay_nms(30);

MT8880_WC(0x0d);  //写CRA,指向CRB(1) 中断允许(1) DTMF模式(0) 音频输出允许(1)

MT8880_WC(0x00);  /*写CRB,列/行无效(0) 双音多频模式(0)

                     不使用测试(0) 突发模式DTMF模式(0) */

}                                  



/*************************************

*名称 MT8880_WC()

*功能 写控制寄存器CRA或CRB

*入口参数 com--要写入的数据

*出口参数 无

*************************************/

void MT8880_WC(uchar com)

{

PORTB&=0xf0;     //输出清零

MT8880_CS_0;

MT8880_RS0_1;

MT8880_RD_1;

NOP();NOP();     //延时大于23ns

MT8880_RW_0;

PORTB|=(com&0x0f); //写四位命令

delay_nus(1);

MT8880_RW_1;

delay_nus(1);

MT8880_CS_1;

}

/***************************************

*名称 MT8880_WD()

*功能: 写MT8880的发送数据寄存器

*入口参数 data--要发送的数据

*出口参数 无

****************************************/

void MT8880_WD(uchar data)

{

PORTB&=0xf0;

MT8880_CS_0;

MT8880_RS0_0;

MT8880_RD_1;

NOP();NOP();

if(data==0)

   data=0x0a;  //拨打号码'0'

MT8880_RW_0;

PORTB|=(data&0x0f);

delay_nus(1);

MT8880_RW_1;

delay_nus(1);

MT8880_CS_1;

}



/******************************************

*名称: MT8880_RD

*功能 读MT8880的接收数据寄存器

*入口参数 无

*出口参数 temp--读出的数据低4位有效

*******************************************/

uchar MT8880_RD(void)

{

uchar temp;

DDRB&=0xf0;  //D0~D3设置为输入

PORTB|=0x0f; //打开上拉电阻

MT8880_CS_0;

MT8880_RS0_0;

MT8880_RW_1;

NOP();NOP();

MT8880_RD_0;

delay_nus(1); //建立时间>100ns(在CLK之前)

temp=PINB&0x0f;

MT8880_RD_1;

NOP();

MT8880_CS_1;

DDRB|=0xff;

return(temp);

}

/*

unsigned char MT8880_RD(void)

{

   unsigned char temp;   

   DDRB&=0xf0;  //D0~D3设置为输入  

   delay_nms(10);     

   MT8880_CS_0;  delay_nms(10);     

   MT8880_RS0_0;

   MT8880_RW_1;  delay_nms(10);

   MT8880_CLK_1; delay_nms(10);

   PORTB|=0x0f; //打开上拉电阻     

   temp=PINB;delay_nms(10);         

   MT8880_CLK_0;   

   MT8880_CS_1;   

   temp&=0x0f;

   return(temp);

} */



/*****************************************

*名称: MT8880_RS()

*功能 读MT8880的状态寄存器

*入口参数 无

*出口参数 temp--读出的数据低4位有效

******************************************/

uchar MT8880_RS(void)

{

uchar temp;

DDRB&=0xf0;  //D0~D3设置为输入

PORTB|=0x0f; //打开上拉电阻

MT8880_CS_0;

MT8880_RS0_1;

MT8880_RW_1;

NOP();NOP();

MT8880_RD_0;

delay_nus(1);

temp=PINB&0x0f;

MT8880_RD_1;

NOP();

MT8880_CS_1;

DDRB|=0xff;

return(temp);

}

出0入0汤圆

发表于 2008-5-8 12:15:36 | 显示全部楼层
有做过MT8880拨号的朋友在线的吗,我正在做这个设计遇到一些,搞了三天了没结果,14号要答辩了,看着心里急了,想请教一下.
1. 初始化是在上电后100后初始化完还是上电100MS后才初始化呢?
2.检测着状态寄存器的时候为什么我读出数据口才1.5V左右的?状态寄存器B3读出来一直都为5V?
3.我初始化8880后,设置了发送和中断模式,然后读状态寄存器,状态寄存器B2检测不到高,IRQ也是一直为高的?

出0入0汤圆

发表于 2008-9-4 14:09:07 | 显示全部楼层
用MT8880做DTMF信号处理的,不防加我一个,QQ:275693035。
现在在做DTMF信号的通信协议,用于远程通信和控制,
没怎么接触电话方面应用,希望能彼此交流下!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 13:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表