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

📄 mt8888.c

📁 此程序是在AVR单片机atmega169P处理器的程序
💻 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 + -