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

📄 dtmf-test.c

📁 lpc900 远程电话控制 from the zlg
💻 C
字号:
/*------------- 周立功单片机研究所 ------------
*----------------------------------------------
*文件名:    DTMF-TEST.C 
*开发:     WWW.ZLGMCU.COM
*创建日期:  2004.03.25
*创建人:   唐尧福
*功能:      DTMF信号的自发自收测试
-----------------------------------------------
-----------------------------------------------*/
#include    "reg932.h"
#include    "intrins.h"
#define     uchar unsigned char 

//变量定义
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
uchar data 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口设置为准双向
    P0M1=P0M2=0;
    P1M1=P1M2=0;
    P2M1=P2M2=0;
    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
	}
}	


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -