📄 main.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 + -