📄 dtmf-test.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 + -