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

📄 function.c

📁 功能强大的拨号器
💻 C
字号:
#include".\MBTD.h"
#include <intrins.h>
#include".\Init.h"
#include".\EEPROM.h"


unsigned char match_num;		//save the IDD number
unsigned int program_addr;		//save the program address
unsigned int adress_buf;
unsigned char dtmf_send_buf;
unsigned char dtmf_on_time;
unsigned char dtmf_off_time;

unsigned char code defualt_password[16]={0x12,0x34,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

//-------------------------------------------------------------
bit remote_rs_flg=0;				//remote control run/stop flag;
bit remote_alarm_flg=0;			//remote controller alarm flag;
bit remote_calling_flg=0;			//the old men need call action flag
bit remote_get_flg=0;			//get the remote control flag;
bit calling_run_flg=0;				//waiting remote calling action
bit valid_flg;						//
bit infrared_moniter_flag;		//infrared flag valid
bit alarm_start;					
bit remote_calling_flg_buf;
bit infrared_moniter_flag_buf;


void Send_byte(unsigned char massage)
{
	SBUF=massage;
	while(!TI);
	TI=0;
}

void delay_5ms()			// 4.961ms
{
	
	unsigned int delay_time=185;
	while(--delay_time);


}

void send_dtmf(unsigned char digit)			//发送DTMF
{
	unsigned char  j;
	clk_9200=1; //时钟信号高电平
	delay_5ms();
//delay3ms();
	for(j=0;j<5;j++) //待拔数字的5位编码串行输入HT9200A
	{
		if(digit&0x01) data_9200=1;
		else data_9200=0;
		clk_9200=0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		clk_9200=1;
		digit=digit>>1; //串行数据右移一位
	}
}

//拨号
void dial_dtmf(unsigned char tx_digit,unsigned char  tx_on_time,unsigned char  tx_off_time)
{
	//unsigned char count;

	EX0=0;
	EX1=0;
	
	delay_5ms();
	ce_9200 = 0;
	tx_time=tx_on_time;
	if(tx_digit==0x00)
		tx_digit=0x0a;
	
      send_dtmf(tx_digit);
	while(tx_time);
	
	tx_time=tx_off_time;
	send_dtmf(0xff);   // stop the dtmf 
	while(tx_time);


	ce_9200 = 1;
	Send_byte(tx_digit);

	EX0=1;
	EX1=1;
	IE0=0;
	IE1=0;
	

}


//检查REMOTE秘密
unsigned char remote_check_password(unsigned char *input_arr,unsigned int password_add)
{
	unsigned char password_buff[16];
	unsigned char *arr_Point;
	unsigned char i;
	unsigned char read_tmp;
	arr_Point=input_arr;
	r_prom(password_add, &read_tmp, 1);
	if(read_tmp==0xff)
		{
			w_prom(password_add, &defualt_password, 16);
			for(i=0;i<8;i++)
			{
				read_tmp=defualt_password[i];
				password_buff[2*i]=read_tmp>>4;
				password_buff[2*i+1]=read_tmp&0x0f;
			}
		}
	else
		{
		for(i=0;i<8;i++)
			{
				r_prom(password_add+i, &read_tmp, 1);
				password_buff[2*i]=read_tmp>>4;
				password_buff[2*i+1]=read_tmp&0x0f;
			}
		}
	i=0;
	while(password_buff[i]!=0x0f|input_arr[i+2]!=0x0c)
		{			
			if(password_buff[i]!=input_arr[i+2])
				return (0);
			i++;
		}
	return (1);
	
}
//查MATCHING TABLE
unsigned char match_tab_check()
{
	unsigned int i_num;
	unsigned char i_count;
	unsigned char table_buf[16];
	unsigned char check_buf[16];
	unsigned char wrong_flg;
	
	for(i_num=0x400;i_num<0x480;)
		{	
			match_num=0;
			r_prom(i_num,&table_buf, 16);		//read eeprom
			if(table_buf[0]==0xff)							//judge the table
				break;
			wrong_flg=0;
			for(i_count=0;i_count<8;i_count++)				//decore
				{
					check_buf[i_count*2]=table_buf[i_count]>>4;
					check_buf[i_count*2+1]=table_buf[i_count]&0x0f;

				}
			i_count=0;
			while(check_buf[i_count]!=0x0f)
				{
		
					if(check_buf[i_count]!=drop_buf[i_count])
						{
							wrong_flg=1;
							break;
						}
					i_count++;
					match_num++;
					
					
				}
			if(!wrong_flg)	
				return (1);
				
			i_num+=0x10;
		}
	return (0);
}
//正确响应
void ack_ok(void)
{
            //Sep 2, 2006
	//tone_generator(0x0b,TX_ON,TX_OFF);
	//tone_generator(0x0c,TX_ON,TX_OFF);
	//tone_generator(0x0b,TX_ON,TX_OFF);
	line_hook=0;
	split=0;	
	dial=1;

	dial_dtmf(0x0d,TX_ON,TX_OFF);
	dial_dtmf(0x0e,TX_ON,TX_OFF);
	dial_dtmf(0x0d,TX_ON,TX_OFF);

	line_hook=1;
	split=0;	
}
//错误响应
void ack_err(void)
{
       line_hook=0;
	split=0;	
	dial=1;
	dial_dtmf(0X14,200,TX_OFF);

	line_hook=1;
	split=0;	
}



unsigned char  program_dialer(void)											//握手信号
{
	if(drop_count==6)		//有6个音频按键信息
	{
		if(drop_buf[0]==0x0c && drop_buf[1]==0x0c 			//DTMF 握手
		&& drop_buf[2]==0 && drop_buf[3]==0
		&& drop_buf[4]==0x0b && drop_buf[5]==0x0b)
			return(1);
	}
					
	return(0);
}
//手动编程
void dialer_program()
{
	unsigned char i;
	unsigned char r_tmp;
	program_flg=0;
	if(drop_buf[0]==0x0b)
		{
			
			program_addr=drop_buf[1]*0x100+drop_buf[2]*0x10+drop_buf[3];

			drop_buf[0]=0xff;
			drop_count=0;

			
							
			ack_ok();
		}
	else
		{
		
			drop_buf[drop_count-1]=0xff;
			for(i=0;i<drop_count;i++)
				{
			
					if((i%2)==0)				//将数据转换为BIN格式
						{
							r_tmp=(drop_buf[i]&0x0f)<<4;	//HI
							r_tmp|=0x0f;
						}
					else
						{
							r_tmp&=(drop_buf[i]&0x0f)|0xf0;	//LOW
							drop_buf[i/2]=r_tmp;
						}
				}
			for(i=(drop_count/2);i<16;i++)					//无用数据用FF填充
				drop_buf[i]=0xff;
//------------------------------------------------------------------

//------------------------------------------------------------------
			if(program_addr<0x100)
				program_addr=0x0A00+program_addr;
		//	else if(program_addr>=0x100&&program_addr<0x800)
		//		program_addr=0x0c00;
			else if(program_addr==0x666)
				{
				program_addr=R_PASSWORD;
				}
			else if(program_addr==0x100)
				{
					program_addr=DTMF_TIME_ON;
				}
			else if(program_addr==0x110||program_addr==0x284)
				{
					program_addr=DTMF_INTER_DIGIT;
				}


			w_prom(program_addr,& drop_buf,16);			//写入EEPROM
			drop_count=0;
			program_addr+=0x10;
		
			ack_ok();
		}
}

//遥控
void remote_control()
{
	switch(remote_key)
		{
		
			case KEY_A:
				remote_rs_flg=1;
				calling_run_flg=1;
			//	valid_flg=1;
			break;

			case KEY_B:
				remote_calling_flg=1;
				adress_buf=0;
				sys_20sec_js=0;
				sys_20second_flg=1;
			break;

			case KEY_C:
				
				remote_rs_flg=0;
				calling_run_flg=0;
				alarm_start=0;
				adress_buf=0;
				remote_alarm_flg=0;
				infrared_moniter_flag=0;
				remote_calling_flg=0;
				line_hook=1;
				split=1;
				alarm_enable=0;					//alrm flg
				alarm_first=0;
				alarm_js=0;
			//	infrared_moniter_flag=0;
			break;

			case KEY_D:
				remote_alarm_flg=1;
			//	rest_flg=1;
			break;
			default:
			break;
		}
}

void dial_num(unsigned int tele_add)
{
	unsigned int remote_add;
	remote_add=tele_add;

	r_prom(DTMF_TIME_ON,&dtmf_on_time,1);			//高低分开发送ASCII码
	r_prom(DTMF_INTER_DIGIT,&dtmf_off_time,1);
	if(dtmf_on_time==0xff)
		dtmf_on_time=0x16;
	if(dtmf_off_time==0xff)
		dtmf_off_time=0x14;
	dtmf_send_buf=0;
	while(dtmf_send_buf!=0xf)
		
		{
		

			r_prom(remote_add,&dtmf_send_buf,1);
			
			if((dtmf_send_buf>>4)!=0xf)
			{
				dial_dtmf((dtmf_send_buf>>4),dtmf_on_time,dtmf_off_time);
				//-----------------debug
				//tx_time=2;
				//SBUF=(send_dtmf>>4);
				//while(tx_time);		
				tx_time=4;
				while(tx_time);
				if((dtmf_send_buf&0xf)!=0xf)
				{
					dial_dtmf((dtmf_send_buf&0xf),dtmf_on_time,dtmf_off_time);
					tx_time=4;
					while(tx_time);		
					
					++remote_add;
				}
				else
					dtmf_send_buf=0xf;
			}
			else
				dtmf_send_buf=0xf;
		} 
//	dtmf_send_buf=0;
}


void Eme_Alarm_action(unsigned int tele_list)
{
	line_hook=1;
	split=1;
	tx_time=200;
	while(tx_time);
	r_prom(tele_list+0x10*adress_buf,&dtmf_send_buf,1);
	
	if(dtmf_send_buf==0xff)
		{
			sys_20second_flg=1;
			adress_buf++;
			if(adress_buf>=8)
				{
					infrared_moniter_flag=0;
					remote_calling_flg=0;
					split=1;
					line_hook=1;
					dial=1;
				}
			return;
		}
		
	sys_20second_flg=0;
	sys_20sec_js=0;		
	split=0;
	//	split=1;
	line_hook=0;
	dial=1;
				
	tx_time=100;
	while(tx_time);
				
	dial_num(tele_list+0x10*adress_buf);
	adress_buf++;
	if(adress_buf>=8)
		{
			infrared_moniter_flag=0;
			remote_calling_flg=0;
			split=1;
			line_hook=1;
			dial=1;
		}

}


⌨️ 快捷键说明

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