📄 main.c
字号:
/*******************************************************************************
* 版权所有 (C)2005,深圳豪恩科技有限公司
*
* 文件名称: main.C
* 文件标识:
* 内容摘要: LHD6000主板主芯片程序,2006-10-30开始
* 其它说明:
* 当前版本: 0.000
* 作 者: 涂常亮(豪恩科技研发中心安全主机组)
* 完成日期: 2005.03.28
*
* 修改纪录1:
* 修改日期: .
* 版 本 号: .
* 修 改 人: .
* 修改内容: .
* 修改纪录2:
*******************************************************************************/
#include "reg54.h"
#include <intrins.h>
#include "EEPROM.H"
#include "MACRO.H"
#include "AdmcPtcl.H"
#include "Head.H"
#include <ABSACC.H>
#define CUR_VER 0x10
//数据类型定义
typedef unsigned char uchar;
typedef unsigned int UInt;
//uchar pdata g_aucpTst[256];
//uchar xdata g_aucxTst[512];
//管脚定义
sbit pin_Listen = P0^5; //现场监听控制,允许监听时有效,低电平有效
sbit pin_Spk = P0^6; //控制主机喇叭,使用喇叭放音时有效,低电平有效
sbit pin_VoiceToPhone = P0^7; //拨号,现场监听和电话报警时有效,低电平有效
#define RST_AUX 1 //ATmel 89s52 高电平复位
sbit pin_RstAux = P1^5;
sbit pin_RstUsePwd = P1^6;
sbit pin_PickPhone = P2^0; //摘机 PCB上的ZJ
sbit pin_DTMFRecvDV = P2^1; //电平有效,表示收到有效的DTMF信号,PCB上的9170INT
sbit pin_TakeLine = P2^2; //抢线 PCB上的QX
sbit pin_ISD1420Play = P2^4;
sbit pin_LedArm = P2^3;
sbit pin_ISD1420Rec = P2^5;
sbit pin_LedAlarm = P2^6; //高电平发送,低电平接收
sbit pin_SelAux = P2^7; //高电平和辅助CPU通讯,低电平和键盘通讯
///选择与键盘或辅助cpu通讯
sbit pin_Int0 = P3^2;
//电话
sbit pin_DTMFRecvOE = P1^7;
sbit pin_LineWave = P3^3;
sbit pin_DTMFGenCE = P3^4;
sbit pin_RingRecv = P3^5;
sbit pin_DTMFGenCLK = P3^6;
sbit pin_DTMFGenDat = P3^7;
#define DTMF_RECVD (!pin_DTMFRecvDV)
//全局变量声明(使用g_开头)
//字符型(有uc标志,加a表示是数组)
uchar data g_aucKBRecvdBuff[KB_RECV_BUFF_LEN]; //可以少一个 !!
uchar data g_aucKBSendBuff[KB_SEND_BUFF_LEN]; //键盘发送缓存,无校验字节长度为12
///没有2级缓存吗
//uchar idata g_aucKBSendingBuff[KB_SEND_BUFF_LEN]; //键盘正在发送到数据
uchar data g_aucKBUsingBuff[KB_USING_BUFF_LEN]; //接收或者发送时使用的暂存区
uchar data g_aucAuxRecvdBuff[AUX_RECV_BUFF_LEN]; //辅助CPU已接收缓存
uchar data g_aucAuxRecvgBuff[AUX_RECV_BUFF_LEN]; //辅助CPU正在接收使用缓存
uchar data g_aucAuxSendBuff[AUX_SEND_BUFF_LEN]; //辅助CPU数据发送缓存
uchar data g_aucAuxSendgBuff[AUX_SEND_BUFF_LEN]; //辅助CPU发送寄存器// !! 可以和键盘共用
//uchar idata //; //防区类型,使用压缩BCD码每个字节纪录两个防区类型
//按顺序:1~16有线,21~28无线,41~48键盘有线
uchar idata g_aucArmTimeH[3]; //定时布防小时
uchar idata g_aucArmTimeM[3]; //定时布防分钟
uchar idata g_aucDisarmTimeH[3]; //定时撤防小时
uchar idata g_aucDisarmTimeM[3]; //定时撤防分钟
uchar idata g_aucRepeatKBMsg[2] = {0, 0}; //键盘数据发送次数
//g_aucRepeatKBMsg[1]表示g_aucKBSendBuff需要重复次数,0表示senging需要次数
uchar data g_aucRepeatAuxMsg[2] = {0, 0};
uchar idata g_aucDTMFBuff[5];
uchar idata g_ucTimer24C04Ack; //24C04写入等待
uchar data g_ucTimerWaitKB = TIME_WAIT_KB_1_PKG; //等待键盘发送的定时,令牌发送结束开始定时
///等待键盘发送的定时
uchar data g_ucKBMsgPointer; //接收/发送计数器,为1表示收到一个字节/已发送一个字符 //可以用静态?
uchar data g_ucKBCheckSum; //校验和
uchar data g_ucAuxSndPnt; //辅助CPU数据发送/接收指针
uchar data g_ucAuxRecvPnt; //辅助CPU数据接收指针
uchar data g_ucAuxCheckSum_S; //辅助CPU数据通讯发送校验和
uchar data g_ucAuxCheckSum_R; //辅助CPU数据通讯接收校验和
uchar data g_ucTimerWaitAux = TIME_WAIT_AUX_1_PKG; //向辅助CPU发送一次的时间定时
uchar data g_ucTimerSerPause = TIME_SERIES_PAUSE_KB;
//uchar data g_ucTimerAuxPaus = TIME_WAIT_AUX_1_PKG; //向辅助CPU发送一次的时间定时
//uchar data g_ucTimerKBPaus = TIME_SERIES_PAUSE_KB;
uchar idata g_ucUserIDH; //用户ID号
uchar idata g_ucUserIDL;
uchar idata g_ucTmLed; //LED闪烁计时
uchar idata g_ucAuxTm;
//报警状态定义
uchar idata g_ucPreWrZnStatus = 0;
uchar idata g_ucTimerSndAlm; //多个报警时,发送报警之间的间隔计时
//uchar idata g_ucSndAlm; //记录已发送到键盘的报警,以位表示
//uchar data g_ucAlmdZn[3]; //记录发生报警的防区,以位表示,无线16个,有线4个,防拆,紧急
//胁持不记录,密码锁定不记录立即发送.
uchar idata g_aucSndAlm[3]={0,0,0}; //记录已发送到键盘的报警,以位表示,单元0对应无线1~8,1对应无线9~16,2对应有线
uchar idata g_ucAlmNxtSnd;
uchar idata g_ucTypNxtSnd;
//uchar data g_aucAlarm[3];
uchar data g_ucAlmWrlsZn = 0; //无线防区1~8报警标志
//#define g_ucAlmWrlsZn g_aucAlarm[0]
uchar idata g_ucBypassWrlsZn; //无线防区1~8旁路标志,0表示被旁路
uchar idata g_ucSemiAlarmWrlsZn = 0; //无线防区1~8进入延时触发标志
//#define g_ucAlarmWrlsZnH g_aucAlarm[1]
uchar data g_ucAlarmWrlsZnH = 0; //无线防区9~16报警标志
uchar idata g_ucBypassWrlsZnH; //无线防区9~16旁路标志,0表示被旁路
uchar idata g_ucSemiAlmWrlsZnH = 0; //无线防区9~16进入延时触发标志 // !!!! .
//#define g_ucAlarmWireZone g_aucAlarm[2]
uchar data g_ucAlarmWireZone = 0; //有线防区报警标志 D7-D0对应防区8~1
uchar data g_ucBypassWrZn; //有线防区旁路标志,0表示被旁路,
uchar data g_ucSemiAlarmWrZn = 0; //有线防区进入延时触发标志
uchar data g_ucAlarmOth = 0; //D5是主机防拆(防区号30),
//D6是遥控和键盘紧急按钮(17),
//D7是胁持密码报警(18)
//D0 位表示是否交流掉电
//D1 位表示是否直流欠压
//D2 位表示是否电话掉线
uchar idata g_ucAlarmTimer = 0; //键盘报警需要.
#define PHONE_LOSE_LINE (0 != (g_ucAlarmOth & (0x01 << 2)))
uchar idata g_ucBypassOth; //0表示被旁路//可以合并到 g_ucBypassWrZn !! .
uchar idata g_ucAlarmTypes = 0; //当前发生过的报警类型的记录
uchar idata g_ucOutDelay; //布防延时设置,10秒为单位 //BCD码
uchar idata g_ucCominDelay; //进入延时设置,10秒为单位 //BCD码
//uchar idata g_ucCountSemiAlarms = 0; //发生进入延时报警个数;
bit g_FlagSemAlm;
uchar data g_ucArmStatus; //当前撤布防状态
//1外出,2留守,3撤防,4外出延时,5进入延时
uchar idata g_ucRingsAnsw; //自动接听电话所需的振铃次数,99 表示不接受电话控制
uchar data g_ucRings; //已经振铃次数
uchar idata g_ucUserPwdH; //用户密码
uchar idata g_ucUserPwdL;
uchar idata g_ucGuestPwdH[5]; //操作密码
uchar idata g_ucGuestPwdL[5];
uchar data g_ucHistPnt; //历史纪录的指针,指向将来的下一记录(0~39)
//uchar idata*/ g_ucKBSysInfID = 1; //发送系统信息时使用该变量指示发送对象
//日期时间的变量定义
//uchar idata g_ucYear;
//uchar idata g_ucMonth;
//uchar idata g_ucDate;
uchar idata g_ucHour;
uchar idata g_ucMinute;
uchar idata g_ucSecond;
//uchar data s_uc10Ms; //10毫秒数
//uchar idata g_ucTmICStart; //起振计时
uchar data g_ucAuxNullMsgTime = 200; //2s定时发送,//开始协议5s //在定时器0中处理
uchar data g_ucWatchAuxTimer = TIME_AUX_ERR; //11s没有收到数据复位 //在定时器0里1s中处理,
uchar data g_ucSeriesStop = TIME_NO_SER_INT; //计时多久没有进串口中断,
uchar data g_ucTrumpTime; //警号鸣叫时间计时,默认10分钟
uchar data g_ucRelayType; //继电器输出类型,默认火警输出,类型为2
//电话相关
uchar idata g_ucTelExist;
uchar idata g_ucPhoneIndex = 0; //记录报警时拨打的电话是第几个号码。
uchar idata g_ucTimerDialPause; //拨两个号码之间的延时定时器
uchar idata g_ucAlarmTypePlayed; //已经向用户播报过的报警防区类型,在播通一个号码时清零
uchar idata g_ucCallgTimers; //记录拨打第几遍电话
uchar idata g_ucDTMFPnt = 0xFF;
uchar idata g_ucDialNextDigit; //向HT9200发送两个数字之间的间隔定时
uchar idata g_ucTimerPhoneKey; //用户拨入进行远程控制时,允许的按键时间间隔
uchar idata g_ucTimerVoiceBlank; //电话报警播放语音之间的间隔计时
uchar idata g_ucVoiceTimes; //语音播放遍数
uchar idata g_ucLastBackRing;
uchar idata g_ucPhnPwdTimes; //拨入电话时密码输入错误次数
uchar idata g_ucTelRndTm = 0; ///?????
bit g_FlagRoundPause; ///????
//整型变量声明
UInt idata g_uiVoiceTimer; //ISD1420 录/放音计时,使用倒计时方式
UInt idata g_uiArmDelayTimer; //布防延时和进入延时共用的定时器寄存器,1s减1
UInt idata g_uiTrumpTimer; //警号计时,1s减1
UInt idata g_uiPhoneTm; //拨号后计时//2006-8-23
UInt time0_counter; ///
extern uchar idata g_ucAdemcoEvtSend; ///接警机
extern uchar idata g_ucTryTimes_AdmcAlm;
///回铃音检测用
///回铃音检测看能否用另外一种方式
///白工写的那种不太好
extern UInt data_counter_end; //计时回铃音和来电振铃间隔
extern UInt data_counter_begin;
extern UInt data_counter; ///
//位变量声明(所有位变量都有Flag来区别) //bit 区开机时被清零,0不需赋值
//报警相关状态
bit g_FlagHasAlarm = 0; //有警情
bit g_FlagReAdm; //原 g_FlagNewAlm 可为局部变量,g_FlagReAdm 不能为局部变量
bit g_FlagRecvgKBMsg; //正在接收键盘数据
//bit g_FlagKBRecOK; //接收结束 //只需g_FlagKBMsgProcessed?
bit g_FlagKBMsgProcessed = 1; //有数据需要处理时为0
bit g_FlagSendgKBMsg; //正在发送
bit g_FlagHasKBMsgSend; //有数据需要发送
bit g_FlagTokenSending; //正在发送令牌
bit g_FlagWaitKB = 1; //开始等待键盘发送数据计时
bit g_FlagKBIDSendg; //正在发送令牌的对象ID
///设这些变量有用吗
///正在发送干嘛要搞个变量
bit g_FlagSeriesPause; //发送过数据等待键盘处理数据,再发下一个数据
///不是说,每个数据发送2次
//bit g_FlagKBPause; //发送过数据等待键盘处理数据,再发下一个数据
//bit g_FlagAuxPause; //发送过数据等待辅助CPU处理数据,再发下一个数据
bit g_FlagHasAuxMsgSend; //有命令需要发送到辅助CPU
bit g_FlagSendgAuxMsg; //正在向辅助CPU发送命令
bit g_FlagRecvgAUXMsg; //正在接收辅助CPU数据
bit g_FlagWaiting24C04Ack;
bit g_FlagInDelaying; //进入延时期间
bit g_FlagOutDelaying; //外出延时期间
bit g_FlagAuxMsgProcessed = 1; ///有数据需要处理时为0????
bit g_FlagHasDeleyAlarm; //有延时报警发生(已经报警,非刚触发)
bit g_FlagSndNewAlm; //准备取下一个需要发送的报警
//bit g_FlagForced; //胁持报警
bit g_FlagVoiceOn; //正在录/放音标志
//bit g_FlagZnExtned = 0; //标志是否有扩展防区
bit g_FlagAuxOK = 0;
bit g_FlagTrumpOn; //警号鸣叫中
bit g_FlagTrumpSel; //是否使用警笛(静音/强音报警)
bit g_FlagTimeArm; //是否使用定时撤布防
bit g_FlagRelayChang; //需要更新继电器输出
bit g_FlagSendKBTime; //需要发送时间给键盘;因为系统参数包含了时间
bit g_FlagArmTime = 1; //需要判断定时撤、布防标志
//bit g_FlagInfoOutDelayEnd; //需要通知键盘外出延时结束
bit g_FlagSecChanged; //
//电话相关
bit g_FlagPhoneSPkg;// = 0; //通话开始,即已经摘机
bit g_FlagDialPause;// = 0; //等待 5s 播下一个号码
bit g_FlagCalling;// = 0; //已经开始电话报警,号码拨打,可以不使用该变量 ??? .
bit g_FlagCallEnd = 1; //已经将当前警情报告用户,
bit g_FlagDialing;// = 0; //正在拨一个电话号码
bit g_FlagDialNextDigit;// = 0; //拨电话号码时 10ms 拨一位
bit g_FlagDialOK; //表示一个电话拨号拨完,等待回铃音
bit g_FlagPhnCmdPrcd = 1;
bit g_FlagDTMFRcving; //接听拨入电话后置为1
bit g_FlagCallInStart; //开始振铃置为1,接听回复声音音(按键)后置为0
bit g_FlagVoiceBlank; //播放报警类型之间的等待
bit g_FlagListeng; //正在监听
bit g_FlagPlayVoice; //可以使用电话播放报警声音
bit g_FlagSeizeOK; //有报警保持大部分时间处于摘机状态,主要是第一次不好处理,增加改变量
bit g_FlagPhnPwdOK; //电话输入密码正确
bit g_FlagEraseAdd;
bit g_FlagRecAdd;
//bit g_FlagAuxKBInitd; //收到辅助CPU的是否扩展防区的信息
bit g_FlagTrnOnTrump;
//密码锁定
bit g_FlagLckgPwd;
bit g_FlagChkPhnLn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -