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

📄 dvs-funset.c

📁 电话报警主机AT89S52单片机并带有网络模块通信协议
💻 C
📖 第 1 页 / 共 2 页
字号:
//dvs-funset.C
#include "DVS-V1.0.H"
#include "dvs_our_remaddr.h"


bit guc_BitList = 0 ; 														//现场监听标致位
//=========================================== 函数定义 =======================================
void In_Fun_SET();														//扫描功能设置
void Fun_SET();															//功能设置
unsigned char DTMF();													//DTMF解码 
void GreekVoice();														//远程控制时成功提示音
void Greek_Listen_Ctrl();												//现场监听
//============================================================================================


//========================================== 外部定义 ========================================
//变量
extern unsigned int data 	guc_Timer0;									//拔号按键定时
extern unsigned char data  	guc_RFReadHAddr;							//r315取读的高地址
extern unsigned char data  	guc_RFReadLAddr;							//r315取读的低落地址
extern unsigned char bdata	guc_74HC164LED;								//指示灯
//位
extern bit guc_Bit_BuChe;												//布撤防:1为布,0为撤
extern bit guc_bitbhOF;													//拔号开关
extern bit guc_bit_Alar_led;											//防区指示灯闪烁开关
extern bit guc_bit_RemCom;												//2272解码时为1
extern bit POW_GlimmLEDOF;												//电源指示灯闪烁开关
extern bit guc_bit_AlLedOF;												//报警指示闪烁灯关
extern bit guc_bitLineOFAlar;											//断线报警开关
extern bit guc_bitPhSet;												//是否在远程控制
//函数
extern void DispAlarLED();												//防区指示灯
extern void SaveInit();													//保存初始化的值
extern void ClearRem();													//清除2272解码后的数据 
extern void SuccBuzzer();												//设置成功时发出的声音
extern void FailBuzzer();												//设置失败时发出的声音
extern void RemIn();													//315解码
extern void StarSetFun();												//开始设置各种功能
extern void OverSetFun();												//结束设置各种功能
extern void BuFanDis();													//布防处理
extern void CheFanDis();												//撤防处理
extern void Delay1Ms(unsigned int auc_time);							//延时1MS
extern void SendDTMEDat(unsigned char auc_data);						//DTMF拔号
extern void SetWordDisp();												//各种设置时各LED指示
extern void WrEEPROM(unsigned char address,unsigned char indata);		//写EEPROM
extern unsigned char RdEEPROM(unsigned char address);					//读EEPROM	
extern void judgeRAYTC(unsigned char auc_Command,unsigned char auc_Send_Len,unsigned char *pDst);
extern void SendASC(unsigned char ASC)	;								//发送-个ASCII
//extern void SendToData(unsigned char *p,unsigned char Long);			//发送命令
//数组
extern unsigned char data guc_PassBuf[4];								//本机密码
extern unsigned char data guc_R315Buf[3];								//315解码后的数据
extern unsigned char idata RsBuf[32];									//接收缓冲区
//============================================================================================





//============================================================================================
//语法格式:  unsigned char DTMF()
//实现功能: DTMF解码 
//参数:		无
//返回:		DTMF解码后的数据
//创建时间:2008-11-30          修改时间:
//创建人员:                    修改人员:
//============================================================================================
unsigned char DTMF()
{
	unsigned char luc_data;
	if(DTMF_Valid)
	{
		while(DTMF_Valid)											//等待按键松开
		{
			SUN_LED = SUN_LED_ON;
			//ClearWatchDog();										//清看门狗
			if(Listen_CTRL)	guc_Timer0 = 32 * 30;					//如果是现场监听,定时30秒			
			else 	guc_Timer0 = SET_REM_TIM;						//否则定时6秒
 			luc_data = P0&0x0f;
		}
		SUN_LED = SUN_LED_OFF;
		return luc_data;
	}
	else return 0;
}


//============================================================================================
//语法格式:  GreekVoice()
//实现功能: 远程控制时成功提示音
//参数:		无
//返回:		无
//创建时间:2008-12-29          修改时间:
//创建人员:                    修改人员:
//============================================================================================
void GreekVoice()
{
	Delay1Ms(300);
	SendDTMEDat(0x09);
	Delay1Ms(100);
}
//============================================================================================
//语法格式:  SavePhontCode()
//实现功能: 设置电话号码
//参数:		无
//返回:		无
//创建时间:2008-11-30          修改时间:
//创建人员:                    修改人员:
//============================================================================================
void SavePhontCode()
{
	unsigned char data luc_i;
	unsigned char data luc_data;									//DTMF解码数据	
	unsigned char data luc_temp;
	unsigned char data luc_DataLen = 0;								//DTMF解码数据长度	
	unsigned char data luc_KeyCnt = 0;								//按键计数器
	unsigned char data luc_Buf[20]='F';
	unsigned char data Del_TAB[1];
	bit luc_tempdata = 0;
	while(1)
	{
		if(guc_Timer0 == 0) break;
		luc_data = DTMF();
		if(luc_data==0x0c)
		{
			SuccBuzzer();									//设置成功时发出的声音
			while(1)
			{
				if(guc_Timer0 == 0) break;
				luc_data = DTMF();
				if((luc_data!=0x0c)&&(luc_data!=0x00))
				{
					if((luc_data<=9)&&(luc_data>=1))	
					{
						luc_KeyCnt ++;
						luc_tempdata = 1;
						luc_temp = luc_data;							//读取是第几组电话
						SuccBuzzer();									//设置成功时发出的声音
					}
					else FailBuzzer();									//设置失败时发出的声音
				}
				if(luc_KeyCnt>=2) 
				{
					luc_KeyCnt = 0;
					FailBuzzer();										//设置失败时发出的声音
				}
				if(luc_data==0x0c)
				{
					SuccBuzzer();										//设置成功时发出的声音
					while(1)
					{
						luc_data = DTMF();
						if(guc_Timer0 == 0) break;							//如果按键长时间没有按,则退出函数
						if((0<luc_data)&&(luc_data<=11))
						{
							if(luc_data==10)luc_data = 0;
							luc_Buf[1+luc_DataLen++] = luc_data;	
							SuccBuzzer();									//设置成功时发出的声音
						}
						if((luc_data==0x0b)&&(luc_tempdata == 0))			//"*"键,再按"#"删除所有电话号码
						{
							SuccBuzzer();									//设置成功时发出的声音
							while(1)
							{
								luc_data = DTMF();
								if(guc_Timer0 == 0) break;					//如果按键长时间没有按,则退出函数
								if(luc_data==0x0c)							//删除所以电话号码
								{
									for(luc_i = 0; luc_i < 9; luc_i ++)
									{
										WrEEPROM(luc_i*PH_CODE_LEN+STER_ADDR,0xff);	//保存0xff则删除电话号码
										Del_TAB[0]=luc_i;
										judgeRAYTC(SET_COM_PHONE,1,Del_TAB) ;	//返回删除号码协议
									}
									SuccBuzzer();							//设置成功时发出的声音
									return;
								}
								else if(luc_data!=0) FailBuzzer();			//设置失败时发出的声音
							}
						}
						if(luc_data==0x0c)									//以"#"键确定
						{
							if(luc_DataLen == 0)							//如果没有按电话号码。则删除电话号码
							{
								for(luc_i = 0 ; luc_i < PH_CODE_LEN ; luc_i++)
								{
									WrEEPROM(STER_ADDR+PH_CODE_LEN*(luc_temp-1)+luc_i,0xff);//保存0xff则删除电话号码
								}	
								Del_TAB[0]=(luc_temp-1);
								judgeRAYTC(SET_COM_PHONE,1,Del_TAB);					//返回删除号码协议
								SuccBuzzer();									//设置成功时发出的声音
							}
							else
							{
								for(luc_i = luc_DataLen; luc_i < PH_CODE_LEN ; luc_i++)//不满20位的加0xFF
								{
									luc_Buf[2+luc_DataLen] = 0xff;
								}
								for(luc_i = 0 ; luc_i < PH_CODE_LEN ; luc_i++)
								{
									WrEEPROM(STER_ADDR+PH_CODE_LEN*(luc_temp-1)+luc_i,luc_Buf[luc_i]);//保存电话号码
								}
								luc_Buf[0]=luc_temp-1;
								judgeRAYTC(SET_COM_PHONE,luc_DataLen+1,luc_Buf);		//返回设置号码协议
								SuccBuzzer();											//设置成功时发出的声音
							}
							break;
						}
					}
					break;
				}
			}
			break;
		}
		else if(luc_data!=0) FailBuzzer();									//设置失败时发出的声音
	}
}
//============================================================================================
//语法格式:SecondPass()
//实现功能:设置第2次密码
//参数:	第1次密码内容
//返回值:	无
//创建时间:2008-11-30          修改时间:
//创建人员:                    修改人员:
//============================================================================================
void SecondPass(unsigned char *p_Pass)
{
	unsigned char data luc_i;
	unsigned char data luc_data;							//DTMF解码数据	
	unsigned char data luc_DataLen = 0;						//DTMF解码数据长度	
	unsigned char data luc_Buf[5];
	bit bit_ok;
	luc_Buf[4] = 'O';
	while(1)
	{
		luc_data = DTMF();
		if(guc_Timer0 == 0) break;							//如果按键长时间没有按,则退出函数
		if((0<luc_data)&&(luc_data<=10))
		{
			if(luc_data==10)luc_data = 0;
			luc_Buf[luc_DataLen++] = luc_data;	
			SuccBuzzer();									//设置成功时发出的声音
		}
		if((4<luc_DataLen)&&(luc_data!=0))
		{
			luc_DataLen = 0;								//重新输入
			FailBuzzer();									//设置失败时发出的声音
		}
		if(luc_data==0x0b)
		{
			SuccBuzzer();									//设置成功时发出的声音
			luc_DataLen = 0;								//"*"键重新输入
		}
		if(luc_data==0x0c)									//以"#"键确定
		{
			for(luc_i = 0 ; luc_i < 4 ; luc_i++)
			{
				if(luc_Buf[luc_i] == *p_Pass++) bit_ok = 1;
				else 
				{
					bit_ok = 0;
					break;
				}
			}
			if(bit_ok)											//如果两次密码相等,则保存
			{
				SuccBuzzer();									//设置成功时发出的声音
				for(luc_i = 0 ; luc_i < 5 ; luc_i++)
				{
					WrEEPROM(luc_i+2,luc_Buf[luc_i]);			//保存新密码
					guc_PassBuf[luc_i] = luc_Buf[luc_i];
				}
			}
			else  FailBuzzer();									//设置失败时发出的声音
			break;
		}
	}
}


//============================================================================================
//语法格式:SetPass_NEW()
//实现功能:设置密码
//参数:	无
//返回值:	无
//创建时间:2008-11-30          修改时间:
//创建人员:                    修改人员:
//============================================================================================
void SetPass_NEW()
{
	unsigned char data luc_data;								//DTMF解码数据	
	unsigned char data luc_DataLen = 0;							//DTMF解码数据长度	
	unsigned char data luc_Buf[4];
	SuccBuzzer();										//设置成功时发出的声音
	while(1)
	{
		luc_data = DTMF();
		if(guc_Timer0 == 0) break;						//如果按键长时间没有按,则退出函数
		if((0<luc_data)&&(luc_data<=10))
		{
			if(luc_data==10)luc_data = 0;
			luc_Buf[luc_DataLen++] = luc_data;
			SuccBuzzer();								//设置成功时发出的声音
		}
		if((4<luc_DataLen)&&(luc_data!=0))
		{
			luc_DataLen = 0;							//重新输入
				FailBuzzer();							//设置失败时发出的声音
		}
		if(luc_data==0x0b)
		{
			SuccBuzzer();								//设置成功时发出的声音
			luc_DataLen = 0;							//"*"键重新输入
		}
		if(luc_data==0x0c)
		{
			if(luc_DataLen==4)
			{
				SuccBuzzer();							//设置成功时发出的声音
				SecondPass(luc_Buf);					//以"#"键确定	
			}
			else  FailBuzzer();							//设置失败时发出的声音
			break;
		}
	}
}


//============================================================================================
//语法格式:SetPass()
//实现功能:设置密码
//参数:	无
//返回值:	无
//创建时间:2009-02-17          修改时间:
//创建人员:                    修改人员:
//============================================================================================
void SetPass()
{
	unsigned char idata luc_data,luc_i;								//DTMF解码数据	
	unsigned char idata luc_DataLen = 0;							//DTMF解码数据长度	
	unsigned char idata luc_Buf[4];
	bit bit_ok;
	while(1)
	{
		if(guc_Timer0 == 0) break;
		luc_data = DTMF();
		if(luc_data==0x0c)
		{
			SuccBuzzer();											//设置成功时发出的声音
			while(1)
			{
				luc_data = DTMF();
				if(guc_Timer0 == 0)		break;								//如果按键长时间没有按,则退出函数	
				if((luc_DataLen<=4)&&(0<luc_data)&&(luc_data<=10))
				{
					if(luc_data==10)luc_data = 0;
					luc_Buf[luc_DataLen++] = luc_data;
					SuccBuzzer();											//设置成功时发出的声音
				}
				if(luc_data==0x0b)
				{
					SuccBuzzer();
					luc_DataLen = 0	;										//"*"键重新输入
				}
				if(luc_data==0x0c)											//以"#"键确定,比较密码
				{
					for(luc_i = 0 ; luc_i < 4 ; luc_i ++)
					{
						if(guc_PassBuf[luc_i] == luc_Buf[luc_i]) bit_ok = 1;//如果密码相等处理,否则退出
						else
						{
							bit_ok = 0;
							break;
						}
					}
					if(bit_ok) SetPass_NEW();
					else if(luc_data!=0)  FailBuzzer();					//设置失败时发出的声音
					break;
				}
			}
			break;
		}
		else if(luc_data!=0)  FailBuzzer();								//设置失败时发出的声音
	}
}

//============================================================================================
//语法格式:SetTiGoge()
//实现功能:设置共同的时间次数
//参数:	无
//返回值:	电话拔出的结果
//创建时间:2008-11-30          修改时间:
//创建人员:                    修改人员:
//============================================================================================
unsigned char SetTiGoge()
{
	unsigned char data luc_SData;
	unsigned char data luc_data;								//DTMF解码数据	
	unsigned char data luc_DataLen = 0;							//DTMF解码数据长度	
	unsigned char data luc_Buf[3];
	for(luc_data = 0; luc_data < 3 ; luc_data ++)
	{
		luc_Buf[luc_data]=0;
	}
	while(1)
	{
		if(guc_Timer0 == 0) break;
		luc_data = DTMF();
		if(luc_data==0x0c)
		{
			SuccBuzzer();										//设置成功时发出的声音
			while(1)
			{
				luc_data = DTMF();
				if(guc_Timer0 == 0) break;						//如果按键长时间没有按,则退出函数
				if((0<luc_data)&&(luc_data<=10))
				{
					if(luc_data==10)luc_data = 0;				//DTMF用10表示0
					luc_Buf[luc_DataLen++]= luc_data;	
					SuccBuzzer();								//设置成功时发出的声音
				}
				if((2<luc_DataLen)&&(luc_data!=0))
				{
					luc_DataLen = 0;							//重新输入
			 		FailBuzzer();								//设置失败时发出的声音
			 	}
				if(luc_data==0x0b)
				{
					SuccBuzzer();								//设置成功时发出的声音
					luc_DataLen = 0;							//"*"键重新输入
				}
				if(luc_data==0x0c)
				{
					switch(luc_DataLen)							//转为10进制

⌨️ 快捷键说明

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