📄 mt8888.c
字号:
//基于MT8888的驱动程序,已经调时通过,硬件平台为AVR的atmega169P,注意在调时收号码和铃音的时候
//需要将避免系统和公用电源的分开,否则会出现不正常的情况
#define DELAYUS 50
//由于设计上的原因使得MCU数据线和MT8888数据线位置颠倒,所以第一数组进行转换
const unsigned char convertnum[16]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f};
/*0 1 2 3 4 5 6 7 8 9 a b c d e f*/
/*
***********************************************************
*程序名 :readsr
*作用 :读取MT8888的状态寄存器
*参数 :无
*返回值 :读取到的状态寄存器值,其中高四位有效
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
unsigned char readsr(void)
{
unsigned char b;
DDRD &=(~((1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7)));//
PORTA |=(1<<PA4);//WRE=1;
PORTA |=(1<<PA3);//RDE=1;
Delay_Us(DELAYUS);
PORTA |=(1<<PA6); //RSE=1;
PORTA &=(~(1<<PA5));//CSE=0;
Delay_Us(DELAYUS);
PORTA &=(~(1<<PA3));//RDE=0;
Delay_Us(2*DELAYUS);
b=PIND;
PORTA |=(1<<PA3);//RDE=1;
#if MT8888_CS_DEBUG >0
Delay_Us(DELAYUS);
PORTA |=(1<<PA5);//CSE=1;
#endif
#if MT8888_DEBUG >0
printf("readsr:b=%x\n\r",b);
#endif
b=(b&0xf0)>>4;
b=convertnum[b]<<4;
return(b);
}
/*
***********************************************************
*程序名 :writesr
*作用 :对MT8888写入控制寄存器
*参数 :需要写入的值
*返回值 :无
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
void writesr(unsigned char a)
{
DDRD |=((1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
PORTA |=(1<<PA4);//WRE=1;
PORTA |=(1<<PA3);//RDE=1;
Delay_Us(DELAYUS);
PORTA |=(1<<PA6); //RSE=1;
PORTA &=(~(1<<PA5));//CSE=0;
Delay_Us(DELAYUS);
PORTA &=(~(1<<PA4));//WRE=0;
PORTD=(PORTD&0x0f)|(convertnum[a]<<4);
Delay_Us(2*DELAYUS);
PORTA |=(1<<PA4);//WRE=1;
#if MT8888_CS_DEBUG >0
Delay_Us(DELAYUS);
PORTA |=(1<<PA5);//CSE=1;
#endif
#if MT8888_DEBUG >0
printf("writesr:a=%x\n\r",a);
#endif
}
/*
***********************************************************
*程序名 :readdata
*作用 :读取MT8888的数据寄存器的值,这个为dailmode时候收到的
DTMF值
*参数 :无
*返回值 :读取到的值
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
unsigned char readdata(void)
{
unsigned char b;
DDRD &=(~((1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7)));
PORTA |=(1<<PA3);//RDE=1;
PORTA |=(1<<PA4);//WRE=1;
Delay_Us(DELAYUS);
PORTA &=(~(1<<PA6));//RSE=0;
PORTA &=(~(1<<PA5));//CSE=0;
Delay_Us(DELAYUS);
PORTA &=(~(1<<PA3));//RDE=0;
Delay_Us(2*DELAYUS);
b=PIND;
PORTA |=(1<<PA3);//RDE=1;
#if MT8888_CS_DEBUG >0
Delay_Us(DELAYUS);
PORTA |=(1<<PA5);//CSE=1;
#endif
#if MT8888_DEBUG >0
printf("readsr:b=%x\n\r",b);
#endif
b=(b&0xf0)>>4;
b=convertnum[b]<<4;
return(b);
}
/*
***********************************************************
*程序名 :writedata
*作用 :对MT8888写入需要拨号的数据值,即号码
*参数 :需要写入的值,即号码
*返回值 :无
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
void writedata(unsigned char a)
{
DDRD |=((1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
PORTA |=(1<<PA4);//WRE=1;
PORTA |=(1<<PA3);//RDE=1;
Delay_Us(DELAYUS);
PORTA &=(~(1<<PA6));//RSE=0;
PORTA &=(~(1<<PA5));//CSE=0;
Delay_Us(DELAYUS);
PORTA &=(~(1<<PA4));//WRE=0;
PORTD=(PORTD&0x0f)|(convertnum[a]<<4);
Delay_Us(2*DELAYUS);
PORTA |=(1<<PA4);//WRE=1;
#if MT8888_CS_DEBUG >0
Delay_Us(DELAYUS);
PORTA |=(1<<PA5);//CSE=1;
#endif
#if MT8888_DEBUG >0
printf("writedata:a=%x\n\r",a);
#endif
}
/*
***********************************************************
*程序名 :MT8888_Init
*作用 :完成对MT8888的初步初始化,对内部所有的寄存器和标志位均清零
*参数 :无
*返回值 :无
*作者 :胡有刚
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
void MT8888_Init(void)
{
unsigned char a;
#if MT8888_INIT_DEBUG >0
printf("MT8888 modul is initialized start\n\r");
#endif
Delay_Ms(5000);
a=readsr();
#if MT8888_DEBUG >0
printf("a=%x\n\r",a);
#endif
writesr(0x00);
writesr(0x00);
writesr(0x08);
writesr(0x00);
a=readsr();
#if MT8888_DEBUG >0
printf("a=%x\n\r",a);
#endif
#if MT8888_INIT_DEBUG >0
printf("MT8888 modul is initialized over\n\r");
#endif
}
/*
***********************************************************
*程序名 :MT8888_dailmodeSET
*作用 :完成对MT8888的burst模式设置,此模式发出的
DTMF信号持续时间为51ms,并且将收到的DTMF信号存放在
数据寄存器中,同时在INT引脚产生中断
*参数 :无
*返回值 :无
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
void MT8888_dailmodeSET(void)
{
writesr(0x0d);//
writesr(0x00);
#if MT8888_MODE_SET >0
printf("MT8888 is burst mode!\n\r");
#endif
}
/*
***********************************************************
*程序名 :mode_DTMFOUT
*作用 :完成MT8888的拨号功能,他将根据参数自动去取相应的号码
并且将相应的号码拨出去
*参数 :需要拨打的号码的索引值
*返回值 :无
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
void mode_DTMFOUT(unsigned char phoneIndex)
{
unsigned char i,j,k=0;
#if SHOW_NO_INFO_EN >0
printf("The telephone NO.is:\n\r");
#endif
Delay_Ms(1000);
for(i=0;i<phoneNUMIndex[phoneIndex][1];i++)
{
j = phoneNUM[phoneNUMIndex[phoneIndex][0]+i];
if(j==0)
{
j = 0x0a;
}
writedata(j);
#if SHOW_NO_INFO_EN >0
printf("%d",(phoneNUM[phoneNUMIndex[phoneIndex][0]+i]));
#endif
Delay_Ms(3500);
while((k&0x20)!=0x20)
{
k = readsr();
#if SHOW_NO_INFO_EN >0
printf("\n\rk=%x\n\r",k);
#endif
};
k=0;
}
#if SHOW_NO_INFO_EN >0
printf("\n\r");
#endif
}
#endif
/*
***********************************************************
*程序名 :MT8888_cpmodeSET
*作用 :完成对MT8888的call process模式设置,此模式发出的
DTMF信号持续时间为102ms,并且将收到的模拟信号转化
相应频率的方波在INT脚输出
*参数 :无
*返回值 :无
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
void MT8888_cpmodeSET(void)
{
writesr(0x0f);
writesr(0x00);
#if MT8888_MODE_SET >0
printf("MT8888 is call process mode!\n\r");
#endif
}
/*
***********************************************************
*程序名 :mode_DTMFIN
*作用 :MT8888接收DTMF信号程序,此程序的执行需设置MT8888为dailmode
*参数 :无
*返回值 :接收到的拨号值
*作者 :
*日期 : 2008.05.02
*版权声明: 保留所有权利
***********************************************************
*/
unsigned char mode_DTMFIN(void)
{
unsigned char DTMFREADVALUE=0;//dtmf读到的值,第一次为状态寄存器的值,第二次为数据寄存器的值
do
{
Delay_Ms(2000);
DTMFREADVALUE=readsr();
#if MT8888_DTMFIN_DEBUG >0
printf("DTMFStatusCode=%x\n\r",DTMFREADVALUE);
#endif
}
while((DTMFREADVALUE&0x40)==0);//在此等待接收有效信号,STATUS.2=1表示接收到DTMF信号.
DTMFREADVALUE=readdata(); //读取数据
#if MT8888_DTMFIN_DEBUG >0
printf("DTMECode=%x\n\r",DTMFREADVALUE);
#endif
return DTMFREADVALUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -