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

📄 main.c

📁 一个很好用的报警代码
💻 C
字号:
/*------------- 泰兴电子集团 ------------------
*----------------------------------------------
*文件名:    Main.C 
*开发:     www.at90s1200.go.nease.net
*创建日期:  2004-6-30 16:19
*创建人:   尹刚
*功能:      主程序
-----------------------------------------------
-----------------------------------------------*/

#include    	"Global.h"
#include	"MT8880.h"
#include 	"Config.h"
#include 	"Dial.h"
#include	"Sys.h"
#include	"ISD.h"
#include	"2402.h"

Byte 	BytEvent;		//事件字节数据
Byte 	MTSendBuf;
Byte 	MTRcvBuf;
Byte 	MTStatusBuf;
Byte	CPCount;		//计数8880CP信号
Word 	OutTime;		//超时时间
Word	DelayTime;		//延时时间
Word 	RecTime;		//录音时间
//Word	DelayCount;
Byte bdata	TwiceBuf;

//引脚定义

sbit Key1   		=   	P1^7;	//
sbit Key2		=	P1^6;	//
sbit Key3		=	P1^5;	//
sbit Key4		=	P1^4;	//
sbit Key5		=	P1^3;	//8880测试跳线

sbit MT_D0  		=   	P2^0;
sbit MT_D1  		=   	P2^1;
sbit MT_D2  		=   	P2^2;
sbit MT_D3  		=   	P2^3;
sbit MT_CS  		=   	P3^1;
sbit MT_IRQ 		=   	P3^3;
sbit MT_RW  		=   	P2^5;
sbit MT_RS0 		=   	P2^6;
sbit MT_CLK 		=   	P2^7;

sbit ISD_A0		=	P0^0;
sbit ISD_A1		=	P0^1;
sbit ISD_A2		=	P0^2;
sbit ISD_A3		=	P0^3;
sbit ISD_A4		=	P0^4;
sbit ISD_A5		=	P0^5;
sbit ISD_A6		=	P0^6;
sbit ISD_A8		=	TwiceBuf^0;
sbit ISD_A9		=	TwiceBuf^1;
sbit ISD_PR		=	TwiceBuf^2;
sbit ISD_PD		=	TwiceBuf^3;
sbit ISD_CE		=	TwiceBuf^4;
sbit ISD_EOM		=	P3^4;

sbit P_Online		=	TwiceBuf^5;
sbit P_Speak		=	TwiceBuf^6;		//放音线
sbit P_Beep		=	TwiceBuf^7;		//蜂鸣器鸣叫线
sbit LE373		=	P3^0;			//373片选
sbit P_INT0		=	P3^2;			//警情检测线(中断)
sbit HandUp		=	P1^3;
sbit Ring		=	P1^4;
sbit P_Batt		=	P1^5;
sbit P_Out		=	P1^6;
sbit P_In		=	P1^7;

sbit LED4		=	P3^5;
sbit LED3		=	P1^2;
sbit LED2		=	P1^1;
sbit LED1		=	P1^0;
sbit SDA		=	P3^6;
sbit SCL		=	P3^7;
//全局变量:

bit FgT0Over;			//T0溢出
bit FgT1Over;			//T1溢出
bit FgDTMF;			//DTMF信号产生INT1中断
bit FgCPMode;			//正处于CP模式
bit FgPlayOver;			//语音播放完毕标志
bit FgPlayReady	=1 ;		//播放就绪标志
bit FgISDStarted;		//ISD2560启动标志
bit FgDialAll;			//是否拨全部号码
bit FgSuccess;			//成功报警标志
bit FgHandUp;			//电话提机标志
bit FgRing;			//有振铃标志
bit FgPowerFault;		//电源故障标志
bit FgPinFault;			//输入掉电
bit FgPoutFault;		//输出异常
bit FgBattFault;		//电池异常


bit K_StartOutTime;		//超时检测开关
bit K_StartDelay;		//延时开关
bit K_CheckDialVoice;		//检查拨号音开关
bit K_CheckABVoice;		//检查回铃.忙音开关
bit K_CheckNoAck;		//检查回铃消失开关
bit FgDialVoice;		//拨号音标志
bit FgAckVoice;			//回铃音标志
bit FgBusyVoice;		//忙音标志
bit FgNoSignal;			//无信号标志
bit FgTimeOut;			//超时标志
bit FgDelayOver;		//延时时间到
bit FgACyc;			//一个检测周期完毕


//******************************************************************
void main(void)
{	
    	InitCPUIO();
    	EX0=1;
    	IT0=1;
    	EA=1;
	Beep(1);
    	while(1)
	    	{
	    	if (FgHandUp)
	    		{
	    		FgHandUp=0;
			ConfigSystem();	//系统设置
	    		}							
		else if(FgRing)		//远程控制
			{
			FgRing=0;
			//RemoteCmd();
			}
		else if(FgPowerFault)
			{
			FgPowerFault=0;
			Dial();								//拨号报警
			}
		}
}

//#pragma AREGS

/***********************************************************
*名称:INT0中断服务函数
*功能:【检测警情,提机,远程控制信号】
************************************************************/
void ISR_EX0(void)		interrupt 	0	using	1
{
	static	Byte 	 	RingCount;
	bit 	FgTmpRing;
	Delayms(1);
	if(!P_INT0)
		{
		BytEvent=~Event_DataBus;
		FgHandUp=(BytEvent & 0x08)==0x08?1:0;
		FgTmpRing=(BytEvent & 0x10)==0x10?1:0;
		FgBattFault=(BytEvent & 0x20)==0x20?1:0;
		FgPoutFault=(BytEvent & 0x40)==0x40?1:0;
		FgPinFault=(BytEvent & 0x80)==0x80?1:0;
		FgPowerFault=FgPinFault||FgPoutFault||FgBattFault;
		if(FgTmpRing)		//振铃信号
			{
			if(++RingCount>3)
				{
				Beep(1);	
				FgRing=1;
				RingCount=0;
				}
			}
		if (FgRing || FgHandUp || FgPowerFault)
			{
			//EX0=0;
			}
		}
}
/***********************************************************
*名称:INT1中断服务函数
*功能:1.【计数8880脉冲】	2.【DTMF检测】
************************************************************/

void ISR_EX1(void)		interrupt 	2 	using	2
{	
	if(FgCPMode)				//CP	模式	计数CP信号
		{
		CPCount++;
		}
	else	{				//DTMF	模式	接收DTMF信号
		FgDTMF=1;
		MTRcvBuf=MT8880_RD();      	//读取数据  
		}
}

/***********************************************************
*名称:Timer0中断服务函数
*功能:【用于ISD2560放音】
************************************************************/
void ISR_Timer0()	interrupt 1	using	1
{
	static Byte  Number;
	Word idata PlayAddr;
	Byte idata TmpByt;
//-------------------------------------------------
	TH0=0xff;
	TL0=0xff;
	TR0=0;

	//不是第一次启动
	if(FgISDStarted)
	        {
		FgISDStarted=0;				//清标志,等待下一语音段或放音周期
		if (*(++PlayPoint)!=0)			//放音未全部完毕
		        {
			ISD_PD=1;
			ISD_CE=1;
		 	P2=TwiceBuf;			//此处片选置 1
			LE373=1;
			LE373=0;
			P2=0xff;
			P0=0xff;
			Number=*PlayPoint;
			Delayms(50);
			TF0=1;				//触发下一个语音段
		        }
		else	{				//【全部放音完毕时PlayOver=1】
			FgPlayOver=1;
			FgPlayReady=1;
			ISD_PD=1;
			ISD_CE=1;
		 	P2=TwiceBuf;			//此处片选置 1,继电器保持
			LE373=1;
			LE373=0;
			P2=0xff;
			P0=0xff;
			TR0=0;				//关中断
		        }
	        }
	//第一次启动
	else	{
		FgPlayReady=0;			//【启动后PlayReady=0】
		FgPlayOver=0;
		FgISDStarted=1;
//--------------
		Number=*PlayPoint;
		PlayAddr=GetAddr(Number);
		TmpByt=TwiceBuf & 0xf0;		//不影响高四位
		P0=PlayAddr & 0xff;		//低位地址
		TwiceBuf=PlayAddr >> 8;		//高位地址
		TwiceBuf |= TmpByt ;
	    	P_Speak=0;			//放音继电器吸合
	    	ISD_PR=1;			//先送PD/PR
	    	ISD_PD=0;
		P2=TwiceBuf;
	   	LE373=1;
	    	LE373=0;
	    	
		ISD_CE=0;			//再送片选
		P2=TwiceBuf;
	   	LE373=1;
	    	LE373=0;	
		LED1=0;
		TR0=1;
		}
}

/**********************************************************
*名称:Timer1中断服务函数	
*功能:1.【定时检测CP信号】	2.【提供定时】
*"入口"参数:	K_StartDelay , OutTime;
*"出口"参数:	FgTimeOut , FgDialVoice , FgBusyVoice , FgAckVoice , FgNoSignal;
***********************************************************/

void ISR_Timer1(void)	interrupt	3	using	3
{
	static bit FgLevel;			//滤波后的电平状态
	static bit FgDropEdge;		//下降沿标志
	static bit FgUpEdge;		//上升沿标志
	static bit K_Delay4S;		//4S超时检测开关
	static bit K_Delay1S2;		//4S超时检测开关
	static bit FgNotFirst;		//非首次进入
	
	static Byte HighCount;		//高电平计数器
	static Word LowCount;		//低电平计数器
	static Byte StartHigh;		//高电平起始计数
	static Byte StartLow;		//低电平起始计数
	static Word NoSignalCount;	//低电平超时时间计数
	static Byte DialVoiceCount;	//高电平超时时间计数
	static Byte BusyCount;		//忙音计数
	TH1=0xEC;
	TL1=0x78;
	
//--------------------------------------------
	if(CPCount>1 && CPCount<6)	// 3-5 为"高电平"
	        {
		if(FgLevel==1)							//"高电平"已经启动
		        {
			StartLow=0;
			K_Delay4S=0;
			HighCount++;
		        }
		else									//"高电平"未启动
		        {
			if(++StartHigh==HighFilterCount)	//"高电平"准备启动
			        {
				if(FgDropEdge==1)				//一个检测周期到,生成标志
				        {
					FgDropEdge=0;
					FgNoSignal=0;	//现在有信号
					FgDialVoice=0;	//现在没有拨号音
					FgACyc=1;
					if((HighCount>14 && HighCount<60) && (LowCount>14 && LowCount<60))	
					        {	
						if(++BusyCount==2)
						        {	
							FgBusyVoice=1;
							BusyCount=0;	
						        }
					        }
					else
						FgBusyVoice=0;
					if((HighCount>90 && HighCount<110) && (LowCount>180 && LowCount<410))	
					        {	
						FgAckVoice=1;
						BusyCount=0;
					        }	
					else
						FgAckVoice=0;
					HighCount=0;
					LowCount=0;
				        }
				StartHigh=0;
				HighCount=HighFilterCount;
				FgLevel=1;
				FgUpEdge=1;
				K_Delay1S2=1;
				DialVoiceCount=120;
			        }
		        }
	        }
	else									//"低电平"
	        {	
		if (!FgNotFirst)					//初始化开机时为"高电平"
		        {
			FgLevel=1;	
			FgNotFirst=1;
		        }
		if(FgLevel==0)						//"低电平"已经启动
		        {
			StartHigh=0;
			K_Delay1S2=0;
			LowCount++;		
		        }
		else								//"低电平"未启动
		        {
			if(++StartLow==LowFilterCount)	//"低电平"即将启动
			        {
				FgUpEdge=0;
				StartLow=0;
				LowCount=LowFilterCount;
				FgLevel=0;
				FgDropEdge=1;
				K_Delay4S=1;
				NoSignalCount=420;
			        }
		        }
	        }
	if(K_Delay1S2==1)						//检测"拨号音"
	        {
		if(--DialVoiceCount==0)
		        {
			FgDialVoice=1;
			BusyCount=0;
			FgBusyVoice=0;
			FgAckVoice=0;
			FgNoSignal=0;
			K_Delay1S2=0;
		        }
	        }
	if(K_Delay4S==1)						//检测"无信号"
	        {
		if(--NoSignalCount==0)
		        {
			FgNoSignal=1;
			BusyCount=0;
			FgBusyVoice=0;
			FgAckVoice=0;
			FgDialVoice=0;
			K_Delay4S=0;
		        }
	        }
	if(K_StartOutTime)
	        {
		if(--OutTime==0)	
		        {	
			FgTimeOut=1;
			K_StartOutTime=0;
		        }
	        }
	if(K_StartDelay)
	        {
		if(--DelayTime==0)	
		        {	
			FgDelayOver=1;
			K_StartDelay=0;
		        }
	        }
	CPCount=0;
}

⌨️ 快捷键说明

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