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

📄 phone.c

📁 拨号程序源码.利用CPU是8位单片机. 拨号芯片为HT9200.
💻 C
字号:
//Copyright(C), 2007-2007, Whcsdc Tech. Co., Ltd.
//File name:fydefine.h
//Author:"杨军" 
//Version:"2007版"
//Date: "2007年8月1日"
//Description:"定义了整个程序"

#include "fymain.h"

//"重量"
UBDWORD gu_Val1,gu_Val2;//"全局变量
//"DTMF发送"
sbit DATA   = P2^4;
sbit CLK    =  P2^3;
sbit DTMF_CS = P2^5;
//"DTMF接收"
sbit DTMF_CHK = P3^5;
sbit OE  = P3^3;
//"响铃"
sbit RING =  P2^6;
sbit CP = P3^4;
//"是否在线(忙音)"
sbit DX_CHK = P2^7;
//"摘挂机"
sbit SW =  P3^7;
//"无线接收信号"
sbit VI =  P3^2;

//"CPU控制"
sbit CPU_PASS = P3^6;
sbit BEEP = P0^4;

uchar idata Check0 ;
uchar idata Counter0 ;
uchar idata Check1 ;
uchar idata Counter1 ;
uchar idata Counter3 ;
//uchar data wireless  _at_ 0x14 ;
uchar data wireless;

//"bit"
uchar volatile bdata flag = 0;

sbit WIRELESS_FG = flag^0;


uchar code Table_DTMF[] =
{0x0a,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0d,0x0e,0x0f,0x00,0x0b,0x0c,0x1f};
// 0 1 2 3 4 5 6 7 8 9 A B C D * #
uchar code dial[] = "13720357726@";

uchar code Table_Key[] = {Key1,Key2,Key3,KeyF0,Key4,Key5,Key6,KeyF1,Key7,Key8,Key9,KeyF2,\
Key10,Key0,Key11,KeyF3};

void SysInit(void);
void SoftInit(void);   
void delay(uint iCnt);
uchar check_DXC(void);
uchar check_RING(void);
uchar check_DV(void);
void checkRING_Init();
void checkDV_Init();
void checkDXC_Init();
void senddata_ht9200(uchar in);
void send_ht9200(uchar in);
uchar DTMF_read(void);
void dial_up(uchar *dial);
//"按键函数"
uchar Read_KeyBoard(void);
bit KeyBoard_If_Hit(void);
void Beep(void);

Main()
{
	SysInit();
	SoftInit();
//	dial_up(dial);
	while (1)
	{
		
	}
	
}

void SysInit(void)
{
	
}

void Beep(void)
{
	 uchar i;
	 BEEP = 1;

	 for (i = 0; i < 254; i++);

	 BEEP = 0;
}

void SoftInit(void)
{
	down();
	//"开中断"
	IE = 0;
	IT0 = 1;
	ET0 = 1;
	EA = 1;
	Beep();	
    CPU_PASS = 0;
//    P0= 0;
}

void dial_up(uchar *dial)
{
	uchar len,i;
	len = strlen(dial);
	plunk();
	for (i=0; i<len; i++)
	{
		send_ht9200((dial[i]-48));
	}	
}

void delay(uint iCnt)
{
	while(iCnt--);
}


void senddata_ht9200(uchar in)
{
	uchar i;
	for (i=0;i<5;i++)
	{
		if (((in>>i)&0x01) == 1)
		{
			DATA = 1;
		}
		else 
		{
			DATA = 0;
		}
		CLK = 0;
		CLK = 1;
	}
}

/******************************************
发送子程序
in 为要发送的数 0-15
******************************************/
void send_ht9200(uchar in)
{
	uchar i;
	DTMF_CS = 0;
	CLK = 1;
	delay(6000); //delay about 6 ms
	EA = 0;
	senddata_ht9200(Table_DTMF[in]) ;
	EA = 1 ;
	for (i=0 ;i< 15;i++)
	delay(6000); //delay about 100 ms
	DTMF_CS = 1 ;
}
/*****************************************
DTMF 读程序
返回 DTMF值
*****************************************/
uchar DTMF_read(void)
{
	uchar temp ;
	uchar i ;
	
	EA = 0 ;
	P0 = 0xff ;
	OE = 1 ;
	ACC = ACC ;
	temp = P0&0x0f ;
	OE = 0 ;
	EA = 1 ;
	for (i=0;i<16;i++)
	{
		if (temp == Table_DTMF[i])
		return i ;
	}
	return(0xff) ;
}

/******************************************
初始化检测程序
******************************************/
void checkRING_Init()
{
	Check0 = 2 ;
	Counter0 = 20 ;
}

void checkDV_Init()
{
	Check1 = 2;
	Counter1 = 20;
}

void checkDXC_Init()
{
/*	Check3 = 2 ;*/
	Counter3 = 20 ;
}

/***************************************
检测有无振铃RING 程序
返回 TRUE :有
FALSE:无
***************************************/
uchar check_RING(void) //
{
	uchar flag ;
	flag = RING ; //check RING
	if ((flag == 0)&&(Counter0 < 30))
		Counter0 ++ ;
		
	if ((flag == 1)&&(Counter0 > 0))
		Counter0 -- ;
		
	if (Counter0 == 30)
	{
		Counter0 = 20 ;
		if (flag != Check0)
		{
			Check0 = flag ;
			return TRUE ;
		}
		else return FALSE;
	}
	else if (Counter0 == 0)
	{
		Counter0 = 20 ;
		Check0 = 1;
		return FALSE;
	}
	else
	return FALSE ;
}

/***************************************
检测有无DTMF信号 DV 程序
返回 TRUE :有
FALSE:无
信号先低后高
***************************************/
uchar check_DV(void) //
{
	uchar flag ;
	flag = DTMF_CHK; //check DV
	
	if ((flag == 1)&&(Counter1<30))
		Counter1 ++ ;
	
	if ((flag == 0)&&(Counter1 >0))
		Counter1 -- ;
	
	if (Counter1 == 30)
	{
		Counter1 = 20 ;
		if (flag != Check1)
		{
			Check1 = flag ;
			return TRUE ;
		}
		else return FALSE ;
	}else if (Counter1 == 0)
	{
		Counter1 = 20 ;
		Check1 = 0 ;
		return FALSE ;
	}
	else return FALSE ;
}

/***************************************
检测有无掉线信号 DXC 程序
返回 TRUE :有
FALSE:无
***************************************/

uchar check_DXC(void) //
{
	uchar flag ;
	flag = DX_CHK ; //check DXC
	
	if ((flag == 1)&&(Counter3<30))
		Counter3 ++ ;
		
	if ((flag == 0)&&(Counter3 >0))
		Counter3 -- ;
    
    if (Counter3 == 30)
    {
    	Counter3 = 20 ;
    	if (flag)
    	{
    		return FALSE ;
    	}
    }
    else if (Counter3 == 0)
    {
    	Counter3 = 20 ;
    	if (!flag)
    	{
    		return TRUE;
    	}
    }	
    else
    return FALSE ;
	
/*		
	if (Counter3 == 30)
	{
		Counter3 = 20 ;
		if(flag != Check3)
		{
			Check3 = flag ;
			return TRUE ;//
		}
		else return FALSE ;
	}
	else if(Counter3 == 0)
	{
		Counter3 = 20 ;
		Check3 = 0 ;
		return FALSE ;
	}
	else return FALSE ;
*/
}


/***************************************
函数名:Read_KeyBoard
功能:返回按键值
参数:无
返回值:键值
备注:无键按下返回0Xff,有键时按下键从左至右,由上至下返回0,1,2.....15
***************************************/
uchar Read_KeyBoard(void)
{
	uchar row,col,mask;
	uchar key_value;
	row = 0;
	col = 0;
	mask = 0x0e;
	if (!KeyBoard_If_Hit())
	{
		return(NoneKey);
	}
	/* get row */
	delay(1250);   //"delay 10ms,去抖"
	KEYWRITE(mask);
	
	while(((KEYIO&KEYROWMASK)==KEYROWMASK)&&(row<4))
	{
		++row;
		mask <<= 1;
		mask |= 1;
		KEYWRITE(mask);
	}
	/* get col */
	KEYREAD(key_value);
	
	mask=0x08;
	while(((key_value|mask)!=0x0f)&&(col<4))
	{
		++col;
		mask>>=1;
	}
	
	key_value = 0;
	KEYWRITE(key_value);
	
	while(1)
	{
		 if((KEYIO&KEYROWMASK)!=KEYROWMASK)//"有按键"
		 continue;
		 delay(1250);//8
		 if((KEYIO&KEYROWMASK)!=KEYROWMASK)//"有按键"
		 continue;
		 break; 	
	}
	
	key_value=row*4+col;
	
	return(key_value);
}

/***************************************
函数名:KeyBoard_If_Hit
功能:检测是否有按键
参数:无
返回值:是否有按键
备注:判断是否有键按下,有时返回1,无时返回0
*****************************************/
bit KeyBoard_If_Hit(void)
{
	uchar a = 0;
	KEYWRITE(a);
	delay(1);
	KEYREAD(a);
	if (a == 0x0f) 
	{
		return(0);
	}
	delay(625);          /* delay 10ms */  //20
	if (a == 0x0f) 
	{
		return(0);
	}
	return(1);
}


void rev_wireless(void) interrupt 0 using 1
{
	if (!WIRELESS_FG)
	{
		WIRELESS_FG = 1;
		wireless = P0 & 0X0F;
	}
}

⌨️ 快捷键说明

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