技术热线: 4007-888-234

C51或PIC165X驱动MT8880 DTMF自动收发

更新时间: 2019-03-23
阅读量:2346

十年专注单片机方案开发的方案公司英锐恩,分享C51或PIC165X驱动MT8880 DTMF自动收发。英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。

这时从C51的移植:

#ifdef __C51__ #include #include #else #include #endif

#define uchar unsigned char

//变量定义 #ifdef __C51__ // sbit LEDCON = P2^6; sbit KEY1 = P2^0; sbit HC595_DAT = P2^2; sbit HC595_CS = P2^4; sbit HC595_CLK = P2^5; //sbit MT8880_D0 = P0^0; //sbit MT8880_D1 = P0^1; //sbit MT8880_D2 = P0^2; //sbit MT8880_D3 = P0^3; sbit MT8880_CLK = P0^4; sbit MT8880_RS0 = P0^5; sbit MT8880_CP = P0^7; sbit MT8880_RW = P2^6; sbit MT8880_CS = P2^7; #define MT8880_DATA P0 #else // #define LEDCON RB6 #define KEY1 RB0 #define HC595_DAT RC5 #define HC595_CS RC6 #define HC595_CLK RC3 #define MT8880_CLK RB3 #define MT8880_RS0 RB4 #define MT8880_CP RB5 #define MT8880_RW RB6 #define MT8880_CS RB7 #define MT8880_DATA PORTA #define CY CARRY #define _nop_() NOP() __CONFIG(WDTDIS&RC&UNPROTECT); #endif uchar ucSendBuf,ucRcvBuf,ucStatusBuf;

//函数声明 void Delay(uchar k); void MT8880_Rst(); uchar MT8880_RD(); uchar MT8880_RS(); void MT8880_WC(uchar com); void MT8880_WD(uchar dat); void HC595SendData(uchar dat);

//主程序从这里开始 void main() { Delay(5); ucSendBuf=0; //P0,P1,P2口设置为准双向 #ifdef __C51__ P0M1=P0M2=0; P1M1=P1M2=0; P2M1=P2M2=0; #else PORTA=0; PORTB=0; PORTC=0; TRISA=0x0f; TRISB=0; TRISC=0; #endif Delay(2); MT8880_Rst(); MT8880_WC(0x0D); //写CRA,中断允许,DTMF模式,音频输出允许 MT8880_WC(0x00); //写CRB,突发模式,DTMF模式 while(1) { while(KEY1); //等待按键 if((++ucSendBuf)==16) //如果SEND_BUF=16,则令SEND_BUF=0 { ucSendBuf=0; } MT8880_WD(ucSendBuf); //发送数据到MT8880 do { ucStatusBuf=MT8880_RS(); ucStatusBuf&=0x0f; } while((ucStatusBuf&0x04)==0);//在此等待接收有效信号,STATUS.2=1表示接收到DTMF信号. ucRcvBuf=MT8880_RD(); //读取数据 HC595SendData(~ucStatusBuf); //显示状态寄存器的内容 Delay(5); ucRcvBuf<<=4; ucRcvBuf|=ucSendBuf; HC595SendData(~ucRcvBuf); //显示接收到的数据和发送的数据,接收数据在高4位, Delay(5); //发送的数据在低4位 } }

/*************************************************************** *名称: MT8880_Rst *功能: 初始化MT8880,发送禁止,中断禁止,DTMF模式,突发模式 ****************************************************************/ void MT8880_Rst() { MT8880_WC(0); //写控制寄存器,确保控制寄存器指针指向CRA MT8880_WC(0); MT8880_WC(8); //写控制寄存器A,输出禁止,中断禁止,DTMF

模式 MT8880_WC(0); //写控制寄存器B,突发模式,DTMF模式 MT8880_RS(); //读状态寄存器,用以清除各标志 }

/***************************************** *名称: MT8880_WC() *功能: 写控制寄存器CRA或CRB *入口参数: com--要写入的数据 *出口参数: 无 ******************************************/ void MT8880_WC(uchar com) { MT8880_CS=0; MT8880_RS0=1; MT8880_RW=0; _nop_(); MT8880_CLK=1; com&=0x0f; MT8880_DATA&=0xf0; MT8880_DATA|=com; _nop_(); MT8880_CLK=0; MT8880_CS=1; } /*************************************** *名称: MT8880_WD() *功能: 写MT8880的发送数据寄存器 *入口参数: dat--要发送的数据 *出口参数: 无 ****************************************/ void MT8880_WD(uchar dat) { MT8880_CS=0; MT8880_RS0=0; MT8880_RW=0; dat&=0x0f; MT8880_DATA&=0xf0; MT8880_DATA|=dat; MT8880_CLK=1; _nop_(); MT8880_CLK=0; MT8880_CS=1; }

/*************************************** *名称: MT8880_RD *功能: 读MT8880的接收数据寄存器 *入口参数: 无 *出口参数: temp--读出的数据,低4位有效 ****************************************/ uchar MT8880_RD() { uchar temp; MT8880_DATA|=0x0f; //D0~D3设置为输入 MT8880_CS=0; MT8880_RS0=0; MT8880_RW=1; MT8880_CLK=1; temp=MT8880_DATA; MT8880_CLK=0; temp&=0x0f; MT8880_CS=1; return(temp); }

/*************************************** *名称: MT8880_RS() *功能: 读MT8880的状态寄存器 *入口参数: 无 *出口参数: temp--读出的数据,低4位有效 ****************************************/ uchar MT8880_RS() { uchar temp; MT8880_DATA|=0x0f; //D0~D3设置为输入 MT8880_CS=0; MT8880_RS0=1; MT8880_RW=1; MT8880_CLK=1; temp=MT8880_DATA; temp&=0x0f; MT8880_CLK=0; MT8880_CS=1; return(temp); }

/********************************************************** *名称: HC595_SENDDAT *功能: 发送数据到L1~L8进行显示。 *入口参数: dat--要显示的数据,(dat.0--L1;dat.7--L8)。 *出口参数: 无 ***********************************************************/ void HC595SendData(uchar dat) { uchar i; HC595_CS=0; for(i=8;i;i--) { HC595_CLK=0; dat<<=1; HC595_DAT=CY; _nop_(); HC595_CLK=1; } HC595_CS=1; HC595_CS=0; }

/************************* * 延时k/10 S **************************/ void Delay(uchar k) { unsigned int i; for(;k;k--) { for(i=37500;i;i--); //延时0.1S } }