📄 main.c
字号:
uchar idata g_ucAlarmStage = 0; //拨号前hangup会清
uchar idata g_ucAdemcoEvts = 0;
bit g_FlagAdmcAlmg;
bit g_FlagPrtcl41 = 0;//24C04地址定义EEPROM_ADD_FLAG41_SEL
extern bit data_receiving;
extern bit g_FlagRdPrtclSel;
//函数原型声明
void InitMCU(void); //初始化CPU设置,定时器等
void InitPeri(void); //初始化外围芯片
void RstUsrPwd(void);
void InitAux(void); //void InitAux(bit FlagInitd);
//void InitKeyBrd(void);
void ProcessKBMsg(void); //键盘通讯数据处理
void ProcessAuxMsg(void); //辅助CPU通讯数据处理
void Delay87us(void);
void ProcPhoneCmd(void); //处理电话命令
void PhoneAlarm(void); //电话拨号处理
void StoreAuxMsg(uchar ucAuxRecvData); //保存接收的辅助CPU的数据
void TimerArm(void);
void GoToOutGuard(void); //外出布防 //bit GoToOutGuard(void);
void GoToHomeGuard(void); //留守布防
void GoToDisguard(void); //撤防操作
void SendKBTime(void); //广播时间
void SendAlarm(void); //uchar ucAlmZn); //广播报警
void KBSendStart(void); ///发送键盘数据包之前,复位相关参数
void SendToken(void); ///这也要搞个函数,不懂
void AuxSendStart(void); ///发送辅助CPU数据包之前,复位相关参数
void Delay10ms(void);
void StartComeIn(void); ///啥
//void ManulKeyRecPlay(void);
void SetKBMsg(void); ///设置键盘信息
void SetAuxMsg(void);///设置辅助CPU信息
void SendHT9200(uchar ucDataHT9200); //发送到HT9200产生DTMF信号
void Hangup(void); ///挂机,执行有关变量的处理
void PlayAlarmVoice(void); ///播放报警语音
void RecvDTMF(void);
void DialPhone(void); //拨电话号码
void CheckDateTime(void);///????
void WatchAux(void);
void ChangeRly(void);
void ProcesClock(void);
void ProcesTimer(void);
void RcdCntctIDEvt(uchar ucEvtInd, uchar ucZone); ///????
void LocalAlarm(void);
void Rcd41Evt(uchar ucEvtInd);
void STOP_PHONE_INF(void); ///停止拨用户电话
void ProcesISD1730(void);
uchar Hex_BCD(uchar ucNumHex);
uchar BCD_Hex(uchar ucNumBCD);
uchar CalcZoneType(uchar ucZoneNum);
uchar CheckPwd(uchar const idata *buff);
uchar TstBit(uchar ucData);
bit RecordAlarm(uchar ucAlarmZone, uchar ucZoneType);
bit IsBCD(uchar ucNum_IsBCD);
bit ProcZnSign(uchar ucZoneNum);
bit IsBypass(uchar ucZoneNum);
bit MarkSemiAlarm(uchar ucZoneNum); //纪录进入延时报警
bit MarkAlarm(uchar ucZoneNum); //纪录报警
bit BypassOrUnbypZn(bit FlagBypassUnbyp); //处理键盘的旁路和取消旁路命令
//取消旁路输入参数为0
bit SetZoneType(void); //设置防区类型使调用该函数,执行成功返回0
bit ResetZoneType(void); //恢复防区类型为出厂值
bit SendKBSysInfo(uchar ucKBSysInfID, uchar ucSubId); //发送键盘所需系统信息
bit LoadSysInfo(void);
bit RstAllSettings(void);
bit StartNewSendMsg(void); ///发送新的信息,
//外部函数
void WriteTime(unsigned char ucRegAdd, unsigned char ucData);
void InitHT1380(void);
unsigned char ReadTime(unsigned char ucRegAdd);
bit WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite); //24C04.C;写入成功返回0
bit ResetHT1380(void);
unsigned char ReadByte(unsigned int uiAddRead);
unsigned char PageWrite(unsigned char const idata *pucDataWrt,
unsigned int uiAddStart,
unsigned char length);
unsigned char PageFill(unsigned char const idata ucDataPgFill,
unsigned int uiAddStart_Fill,
unsigned char ucLengthFill);
unsigned char checkBackRingResult(void);
void AdemcoAlarm(void); //向Ademco685 戒(接?)警主机发送警情信息
//ISD1730操作函数
void SendISD1730CmnCmd(uchar ucCmd);
uchar ReadStatus(void); //uchar ReadStatus(uchar idata * data p_Status);
void WrApcReg(uchar idata ucAPCL,uchar idata ucAPCH);
void PlayISD(uchar ucSect,bit FlagSpk);
void EraseAdd(void);
void RecAdd(void);
//函数实现部分。从main()开始,函数实现顺序和声明顺序相同
/***************************************
* 函数名:main()
* 功能: 主函数
****************************************/
void main(void)
{
ClrWdt(); ///清看门狗
pin_RstAux = RST_AUX;
InitMCU(); ///初始MCU资源
Delay10ms();
pin_RstAux = !RST_AUX; //主CPU控制辅助CPU复位
for (g_ucHour=0; g_ucHour<30; g_ucHour++)
{
Delay10ms();
ClrWdt();
} ///300ms做什么
InitMCU(); ///???为什么又初始化一遍 ///单片机所有中断都打开了
InitPeri();///初始化外围IC1380,1730。
//跳线恢复用户密码
RstUsrPwd();
LoadSysInfo();///将24C04中数据读出来,初始化许多跟编程设置相关的全局变量
WriteByte(0xFF, EEPROM_ADD_CNTCT_EVT_START+MAX_CNTCT_EVT_NUM*BYTES_PER_CNTCT_EVTS
-BYTES_PER_CNTCT_EVTS); //避免开机第一个撤防不能发送
///????
InitAux();///???
//InitKeyBrd();
//g_FlagAuxOK = 1; //2007-2-8
SendKBSysInfo(0x07, 0x00); //2007-3-16
///发送键盘系统信息:不允许需要密码的操作 ///为什么不允许需要密码的操作
///装载命令
///发送键盘:不允许需要输入密码的操作。
//InitAux();
if (IS_OUT_GUARDING) ///外出布防
{
pin_LedArm = LED_ON;
}
while (1)
{
if ((!g_FlagKBMsgProcessed) && (!g_FlagHasKBMsgSend) &&(!g_FlagHasAuxMsgSend))
{ ///有键盘信息需要处理, 没有键盘数据需要发送,没有辅助CPU数据需要发送
///键盘信息优先处理
ProcessKBMsg(); ///处理键盘信息///执行相应的命令
g_FlagKBMsgProcessed = 1; ///键盘数据处理完毕
}
if ((!g_FlagAuxMsgProcessed) && (g_FlagKBMsgProcessed)
&& (!g_FlagHasKBMsgSend) && (!g_FlagHasAuxMsgSend))
{ ///有辅助CPU数据需要处理,没有键盘数据需要处理,没有键盘数据需要发送,没有辅助CPU数据需要发送
ProcessAuxMsg(); ///处理辅助CPU数据
g_FlagAuxMsgProcessed = 1; //辅助CPU数据处理完毕
}
RecvDTMF(); ///根据振铃接收DTMF按键
PhoneAlarm(); ///取出电话号码,轮流拨号
ProcPhoneCmd();///远程电话操作处理 ///???
AdemcoAlarm(); ///拨打接警中心报警
ProcesClock(); ///处理键盘时间不准的问题 ///???
///????????不懂
if ((g_FlagArmTime && g_FlagTimeArm) //从ProcesClock()中分离出去.布撤防嵌套多.
&& (!g_FlagHasKBMsgSend)) //辅助CPU的数据会在撤防后重新发送,包括电话掉线等
{
TimerArm();
g_FlagArmTime = 0;
}
ProcesTimer();///????
LocalAlarm();///???
ProcesISD1730();///???
WatchAux(); ///辅助CPU
if (g_FlagSeriesPause && (0 == g_ucTimerSerPause))
{
g_FlagSeriesPause = 0;
StartNewSendMsg();
}
//防止通讯错误,使串口不再工作,主要是辅助通讯标志出错有影响
//检查漏洞,可以不用该部分
if ((0 == g_ucSeriesStop) || (TIME_NO_SER_INT < g_ucSeriesStop))
{
SCON = 0x50;
T2CON = 0x30;
RCAP2H = 0xFF;
RCAP2L = 0xD9; //0xDC; //12MHz
TR2 = 1;
ES = 1;
StartNewSendMsg();
}
}
}
/*******************************************************************************
* 函 数 名: InitMCU()
* 功 能: 初始化MCU的各个模块,中断使用,定时,串口等
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
* 2006-10-30 0.0000 涂常亮 第一次编写
*******************************************************************************/
void InitMCU(void)
{
pin_ISD1420Rec = 1; //已经无用
pin_TakeLine = 0; //开机影响用户通话
P0 = 0xFB;
//pin_RstAux = RST_AUX;
EA = 0;
pin_PickPhone = 0;
pin_ISD1420Play = 1;
pin_DTMFRecvOE = 0;
pin_LedAlarm = LED_OFF;
pin_LedArm = LED_OFF;
//REN = 1;
AUXR |= 1; // !!!! tstg !!!! .
//初始串口。工作方式1,定时器2产生波特率,9600bps,晶振11.0592MHz
SCON = 0x50;
T2CON = 0x30;
TH2 = 0xFF;
TL2 = 0xD9; //0xDC; //12MHz
RCAP2H = 0xFF;
RCAP2L = 0xD9; //0xDC; //12MHz
TR2 = 1;
ES = 1; // 初始化键盘时再开启.
//初始化外部中断0和1。从高到低跳变沿中断
IT0 = 1;
PX0 = 1;
EX0 = 0; //EX0 = 1; 开始不能接收辅助CPU的数据,否则初始化出错,或需重复调用 SendToken.
IT1 = 1;
EX1 = 0; //电话拨通或接听之后再开中断
//初始化定时器0,定时1ms
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18; //0x67;12MHz
ET0 = 1;
TF0 = 0;
TR0 = 1;
//初始化定时器1,计数10
TMOD |= 0x60;
TH1 = 0xFF;
TL1 = 0xFF;
ET1 = 1;
TF1 = 0;
TR1 = 1;
//watchdog
ClrWdt();
EnWdt();
//清中断请求标志
IE0 = 0;
IE1 = 0;
TI = 0;
RI = 0;
TF0 = 0;
TF1 = 0;
//最后开中断
EA = 1;
}
/*******************************************************************************
* 函 数 名: InitPeri()
* 功 能: 初始化MCU各个外围模块,
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
* 2006-10-30 0.0000 涂常亮 第一次编写
*******************************************************************************/
void InitPeri(void)
{
InitHT1380();
pin_DTMFGenCE = 1; // ??? 使其一直位低
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -