绝对高分求解!51单片机如何初始化DTMF的芯片MT8888和如何设置各种模式?
发布网友
发布时间:2022-04-23 12:35
我来回答
共2个回答
热心网友
时间:2023-10-13 14:52
需要设置模式,是通过控制CRA的低4位来设置的,下面就是对它的说明:
控制寄存器和状态寄存器各个位的功能意义简述如下:
(1)控制寄存器CRA。
D0;把该位设置为“1”,则芯片被设置成DTMF模
式,允许收、发双音频信号。
D1:把该位设置为“1",则芯片被设置为信号音检测模式 (呼叫处理模式),
当D2也设为“1”时,引脚IRQ端能输出与各种信号音对应的方波。
D2:把该位设置为“1",则芯片被设置成中断模式,其具体功能见前述的
3种模式介绍。
D3:把该位设置为“1",表明允许选择控制寄存器CRB,因此应在写入控
制寄存器CRA后,接着写控制寄存器 CRB。
-----------------------------------------------------------------------------
(2)控制寄存器CRB。
D0:把该位设置为“0”时芯片工作于普通双音频模式
设置为“1"时芯片工作于突发模式,突发和暂停长度各为(51 土2)ms。
D2:把该位设置为“0”时允许产生双音频,否则只产生单音频。
D3:行/列音选择,当 D2=1(单音模式)时,D3 用于选择行音或列音(即
音频频率的选择)。
-------------------------------------------------------------------------
下面这些是我之前使用MT8880时写的,实践过,可以用的
///////////////// 初始化MT8880 /////////////////
void InitMT8880()
{
MT8880_read_state(); //从MT8880读状态寄存器
MT8880_write_com(0x00); //CRA=0000
MT8880_write_com(0x00); //CRB=0000
MT8880_write_com(0x08); //CRA=1000
MT8880_write_com(0x00); //CRB=0000
DelayMs(10);
}
///////////////// 写入初始化函数 /////////////////
void MT8880_write_init(void)
{
MT8880_write_com(0x0d); //CRA=1101
MT8880_write_com(0x00); //CRB=0000
}
//////////////// 写控制寄存器 /////////////////
void MT8880_write_com(uchar sdata)
{
MT8880_ABBA=1;
Delay10Us(1);
MT8880_CS=0;
MT8880_RSI=1;
MT8880_RW=0;
MT8880_SYNC=1;
Delay10Us(1);
MT_data=(MT_data & 0xf0)|(sdata & 0x0f);
Delay10Us(5);
MT8880_SYNC=0;
Delay10Us(5);
MT8880_RW=1;
MT8880_CS=1;
MT8880_RSI=0;
MT8880_SYNC=1;
DelayMs(5);
MT8880_ABBA=1;
Delay10Us(1);
}
//////////////// 从MT8880读状态寄存器 /////////////////
uchar MT8880_read_state()
{
uchar sdata=0x00;
MT8880_ABBA=0;
MT8880_SYNC=0;
Delay10Us(1);
MT8880_CS=0;
MT8880_RSI=1;
MT8880_RW=1;
Delay10Us(1);
MT8880_SYNC=1;
Delay10Us(1);
sdata=MT_data & 0x0f;
Delay10Us(5);
MT8880_SYNC=0;
Delay10Us(5);
MT8880_RW=0;
MT8880_CS=1;
MT8880_RSI=0;
MT8880_SYNC=1;
Delay10Us(1);
DelayMs(1);
MT8880_ABBA=1;
Delay10Us(1);
return sdata;
}
在此说明下,代码是自己写的,并经过了实践,希望给楼主一点帮助
如果需要更全面点的代码和资料,我可以发给你。
“单片机高手团”为您解答
热心网友
时间:2023-10-13 14:52
楼主 同求程序啊 ,怎么初始化和收发数据的?谢谢了QQ 1373975187@qq.com
热心网友
时间:2023-10-13 14:52
需要设置模式,是通过控制CRA的低4位来设置的,下面就是对它的说明:
控制寄存器和状态寄存器各个位的功能意义简述如下:
(1)控制寄存器CRA。
D0;把该位设置为“1”,则芯片被设置成DTMF模
式,允许收、发双音频信号。
D1:把该位设置为“1",则芯片被设置为信号音检测模式 (呼叫处理模式),
当D2也设为“1”时,引脚IRQ端能输出与各种信号音对应的方波。
D2:把该位设置为“1",则芯片被设置成中断模式,其具体功能见前述的
3种模式介绍。
D3:把该位设置为“1",表明允许选择控制寄存器CRB,因此应在写入控
制寄存器CRA后,接着写控制寄存器 CRB。
-----------------------------------------------------------------------------
(2)控制寄存器CRB。
D0:把该位设置为“0”时芯片工作于普通双音频模式
设置为“1"时芯片工作于突发模式,突发和暂停长度各为(51 土2)ms。
D2:把该位设置为“0”时允许产生双音频,否则只产生单音频。
D3:行/列音选择,当 D2=1(单音模式)时,D3 用于选择行音或列音(即
音频频率的选择)。
-------------------------------------------------------------------------
下面这些是我之前使用MT8880时写的,实践过,可以用的
///////////////// 初始化MT8880 /////////////////
void InitMT8880()
{
MT8880_read_state(); //从MT8880读状态寄存器
MT8880_write_com(0x00); //CRA=0000
MT8880_write_com(0x00); //CRB=0000
MT8880_write_com(0x08); //CRA=1000
MT8880_write_com(0x00); //CRB=0000
DelayMs(10);
}
///////////////// 写入初始化函数 /////////////////
void MT8880_write_init(void)
{
MT8880_write_com(0x0d); //CRA=1101
MT8880_write_com(0x00); //CRB=0000
}
//////////////// 写控制寄存器 /////////////////
void MT8880_write_com(uchar sdata)
{
MT8880_ABBA=1;
Delay10Us(1);
MT8880_CS=0;
MT8880_RSI=1;
MT8880_RW=0;
MT8880_SYNC=1;
Delay10Us(1);
MT_data=(MT_data & 0xf0)|(sdata & 0x0f);
Delay10Us(5);
MT8880_SYNC=0;
Delay10Us(5);
MT8880_RW=1;
MT8880_CS=1;
MT8880_RSI=0;
MT8880_SYNC=1;
DelayMs(5);
MT8880_ABBA=1;
Delay10Us(1);
}
//////////////// 从MT8880读状态寄存器 /////////////////
uchar MT8880_read_state()
{
uchar sdata=0x00;
MT8880_ABBA=0;
MT8880_SYNC=0;
Delay10Us(1);
MT8880_CS=0;
MT8880_RSI=1;
MT8880_RW=1;
Delay10Us(1);
MT8880_SYNC=1;
Delay10Us(1);
sdata=MT_data & 0x0f;
Delay10Us(5);
MT8880_SYNC=0;
Delay10Us(5);
MT8880_RW=0;
MT8880_CS=1;
MT8880_RSI=0;
MT8880_SYNC=1;
Delay10Us(1);
DelayMs(1);
MT8880_ABBA=1;
Delay10Us(1);
return sdata;
}
在此说明下,代码是自己写的,并经过了实践,希望给楼主一点帮助
如果需要更全面点的代码和资料,我可以发给你。
“单片机高手团”为您解答
热心网友
时间:2023-10-13 14:52
楼主 同求程序啊 ,怎么初始化和收发数据的?谢谢了QQ 1373975187@qq.com