?? dial.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 + -