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

📄 dial.c

📁 在电话上用单片机来实现电话报警系统
💻 C
字号:
/*------------- 泰兴电子集团 ------------------
*----------------------------------------------
*文件名:    Dial.C 
*开发:     www.at90s1200.go.nease.net
*创建日期:  2004-6-30 16:19
*创建人:   尹刚
*功能:      拨号程序
-----------------------------------------------
-----------------------------------------------*/
#include "global.h"
#include "MT8880.h"
#include "Sys.h"
#include "ISD.h"
#include "2402.h"
void Dial(void)
{	
	Byte PlayCount;
	Byte UserID=1;
	Byte PhoneTab[]={2,1,9,'x'};
	Byte BytBCD;		//暂存BCD码
	Byte SendNumCount;
	Byte idata Out1[8]={0,0,0,0,0,0,0,0};
	Byte idata Out2[8]={1,1,1,1,1,1,1,1};
	Byte idata *p;
	bit FgNotFirst;
	bit FgRunning;
	bit FgBCDHalf;		//BCD码半字节标志
	bit bp;
	InitCPUIO();
	
Begain:	
	bp=IRcvStr(Addr24C02,(UserID-1)*8,Out1,8);
	bp=IRcvStr(Addr24C02,UserID*8,Out2,8);
	p=Out1;
	InitMT8880(CP8880);					//CP模式
	FgCPMode=1;
	InitBreak();
	UpHandle();
	SetDelayTime(Time1S);
	while(!FgDelayOver);
	SetOutTime(Time1S5);					//1.5秒内检测拨号音
	while(!FgTimeOut)
		{
		CheckSignal();
		if (FgDialVoice)goto OutDTMF;
		}
	Alarm();	
	goto TheEnd;

OutDTMF:
//开始拨号:
	while(1)
		{
		if(FgBCDHalf)
		BytBCD=( *p & 0xf0)>>4;		//先取出高位
		if(BytBCD==0x0c) break ;
		MTSendBuf = BytBCD;
		MT8880_WD(MTSendBuf);       	//拨号(是否做一个函数?)
		do	{
   			MTStatusBuf=MT8880_RS();
			}
		while((MTStatusBuf & 0x02) == 0);
		
		BytBCD = *p & 0x0f;		//再取出低位
		if(BytBCD==0x0c) break ;
		MTSendBuf = BytBCD;
		MT8880_WD(MTSendBuf);       	//拨号(是否做一个函数?)
		do	{
   			MTStatusBuf=MT8880_RS();
			}
		while((MTStatusBuf & 0x02) == 0);
		if(++SendNumCount ==16 )
			{
			p=Out2;
			}
		else	{
			p++;
			}
		}
//信号检测:
	SetOutTime(Time10S);
	while(!FgTimeOut)
		{
		CheckSignal();
		if (FgBusyVoice)goto Guaji ;
		if (FgAckVoice)goto AckVoice ;
		}
	goto Guaji ;

AckVoice:
//检测到回铃音:
	SetOutTime(Time30S);
	while(!FgTimeOut)
		{	
		CheckSignal();
		if (!FgAckVoice || FgNoSignal)	goto NoAckVoice ;
		else if (FgBusyVoice)goto Guaji ;	
	}
	goto Guaji ;

NoAckVoice:
//回铃音消失:
	EA=0;
	SBeep(1);
	CheckSignal();						//灭信号灯
	InitMT8880(DTMF8880);					//切入DTMF模式
	FgCPMode=0;
	EA=1;
	SetPlayBuf(User);
	SetOutTime(Time30S);
	while(! FgTimeOut)
		{	
		if(FgDelayOver)
			{
			FgDelayOver=0;
			FgPlayOver=0;
			FgRunning=0;
			FgNotFirst=0;
			if(++PlayCount>2) goto Guaji ;
			}
		else	{
			if(FgPlayOver) 	
				{
				if(!FgNotFirst)
					{	
					FgNotFirst=1;
					SetDelayTime(Time3S);		//放音3次 + 每次延时3秒	
					}
				}
			else	{
				if(!FgRunning)
					{
					if(PlayMusic(PlayBuf))		//播放用户录制语音+"请按#号确认本次报警"
						{
						FgRunning=1;
						}
					}
				}
			}
		if(FgDTMF)
			{	
			FgDTMF=0;
	    		if(MTRcvBuf==Answer)				//是DTMF回复
	    			{
				FgSuccess=1;
				StopPlay();
				goto WaitCmd;
	    			}
			}
		}
	goto Guaji ;
WaitCmd:
	StopPlay();
	SetPlayBuf(Please);
	FgDelayOver=0;
	FgPlayOver=0;
	FgRunning=0;
	FgNotFirst=0;
	Beep(1);
	SetOutTime(Time30S);
	while(! FgTimeOut)
		{
		if(FgDelayOver)
			{
			FgPlayOver=0;
			FgRunning=0;
			FgNotFirst=0;
			FgDelayOver=0;
			if(++PlayCount>2) goto Guaji ;
			}
		else	{
			if(FgPlayOver)
				{
				if(!FgNotFirst)
					{	
					FgNotFirst=1;
					SetDelayTime(Time3S);		//放音3次 + 每次延时3秒	
					}
				}
			else	{
				if(!FgRunning)
					{	
					if(PlayMusic(PlayBuf))		//请输入命令
						{
						FgRunning=1;
						}
					}
				}
			}
		if(FgDTMF)
			{	
			FgDTMF=0;
	    	switch (MTRcvBuf)					//DTMF命令
	    		{
	    		case CmdOpen :					//开机命令
	    			StopPlay();
	    			FgDelayOver=0;
				FgRunning=0;
				FgNotFirst=0;
	    			PlayCount=0;
				OpenThePower();
				SetPlayBuf(TheOther);
				SetOutTime(Time30S);
				break;
	    		case CmdClose :					//关机命令
	    			StopPlay();
	    			FgDelayOver=0;
				FgRunning=0;
				FgNotFirst=0;
	    			PlayCount=0;
	    			CloseThePower();
	    			SetPlayBuf(TheOther);
				SetOutTime(Time30S);
				break;
	    		case CmdByPass :				//旁路命令
	    			StopPlay();
	    			FgDelayOver=0;
				FgRunning=0;
				FgNotFirst=0;
	    			PlayCount=0;
				ByPassThePower();
				SetOutTime(Time30S);
				SetPlayBuf(TheOther);
				break;
	    		case Answer :					//退出命令
	    			StopPlay();
				goto Guaji ;
				break;
			default :
				SBeep(1);
				break;
	    		}
		}
	}

Guaji:
	if(FgSuccess)
		{
		SetPlayBuf(Byby);
		PlayMusic(PlayBuf);
		while(!FgPlayOver);	
		}
	DownHandle();
	Beep(1);
	Delayms(1000);
	if(FgDialAll)
		{
		if(++UserID<=5)
			{
			goto Begain ;
			}
		}
	else	{
		if(!FgSuccess)
			{
			goto Begain ;
			}
		}
TheEnd:
	_nop_();
}

⌨️ 快捷键说明

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