📄 main.c
字号:
/*******************************************************************
文件名: main.c
内容: 主程序
作者: Bob Lee
创建日期: 2005-8-26
修改日期: 2005-8-26
版本: 1.00.000
*******************************************************************/
#include "Main.h"
void main(void)
{
InitializePeripheral( ); //初始化
while( true )
{
if( InitializeFlag ) InitializeSMS( ); //初始化波特率
while( ReceiveFlag ) ATCheck(SHORTWAIT,"",CHECKNEW );//清除接收区的内容
if( Flag_Hour )
{
Flag_Hour = false;
DowithAT( ); //读短信
DowithCheckAll( ); //判断所有参数的正确性
}
if( Flag_s ) DowithCheckWait( ); //判断一小时到了吗,一天到了吗?
DowithDetect( ); //检测检测处理
if( ResetFlag ) DowithReset( );
ClearWDT( );
}
}
/*------------------------------------------------------------------
名称: InitializePeripheral
作用: 初始化所有CPU周边设备
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void InitializePeripheral( void )
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化看门狗
ClearWDT();
WDKEY = ENABLEWDT;
ClearWDT();
EA = false;
TR1 = false;
ET1 = false;
P1 = 0xff;
PSD8xx_reg.PAGE = 0x00;
ResetFlag = false;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//继电器
InitializeRelay( ); //三个继电器处于非工作状态
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//打开通讯模块
EnableWireless( ); //启动通讯模块
EnableBattery( ); //给电池充电
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//指示灯
DelightStatus( ); //熄灭所有指示灯
DelightOther( 0x00 );
DelightOther( 0x01 );
DelightOther( 0x02 );
DelightOther( 0x03 );
DelightOther( 0x04 );
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化串口
LCTS = low;
T2CON = 0x34; //使用Timer 2作为波特率发生器
PCON |= 0x0C; //设置UART2使用timer2波特率发生器
RCAP2L = LOWBPS; //设置Timer2的波特率
RCAP2H = HIGHBPS;
SCON2 = 0x50;
#ifdef HARDDEBUG
initUart();
#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化时钟中断
TMOD = 0x01; //设置timer 0 工作在16位不分频工作模式
TL0 = 0; //中断周期70ms
TH0 = 0;
TL1 = 0; //中断周期70ms
TH1 = 0;
TR0 = true; //启动timer 0
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化其它位与寄存器
OneHour = 200;
InitializeFlag = true;
DowithCheckAll( );
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化测试端口
OLDDETP = DefaultStatus;
DETP = DefaultStatus;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//使能中断
IEA = 0x10; //使能UART2中断
ET0 = true; //使能timer 0中断
EA = true; //使能总中断
#ifdef HARDDEBUG1
DSend("Initialize Finish!\r\n");
#endif
}
/*------------------------------------------------------------------
名称: InitializeSMS
作用: 初始化波特率
输入: 无
输出: 无
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void InitializeSMS( void )
{
unsigned char data i,j;
DelightStatus( );
ClearWDT( );
Try1:
LoginFlag = false;
for( j = 0x00; j < 0x05; j ++ )
{
for( i = 0x00; i < 0x20; i ++)
{
ATSend("AT\r"); //自适应波特率
if( !ATCheck( SHORTWAIT, "", CHECKOK ) ) break;
}
if( i < 0x20 ) break;
DisableWireless( ); //重新启动
SecondRegister = SHORTWAIT;
Flag_1s = false;
while( !Flag_1s )
{
ClearWDT( );
}
Flag_1s = false;
while( !Flag_1s )
{
ClearWDT( );
}
EnableWireless( );
}
if( j > 0x04 )
{
EA = false;while( true )
{
}
}
//复位
ClearReceiveBuffer( );
while(!ATCheck(SHORTWAIT, "", CHECKOK))
{
}
LoginFlag = true;
for( i = 0x00; i < 0x10; i ++ )
{
ATSend( "ATE1\r" ); //不回显
if( ATCheck( SHORTWAIT, "",CHECKOK ) ) continue;
ATSend( "AT+CMGF=1\r" ); //Text模式
if( ATCheck( SHORTWAIT, "",CHECKOK ) ) continue;
ATSend( "AT+CSCS=\"GSM\"\r" ); //
if( ATCheck( SHORTWAIT, "",CHECKOK ) ) continue;
ATSend( "AT+CSCA?\r" ); //
if( ATCheck( MIDDLEWAIT, "",CHECKOK ) ) continue;
ATSend( "AT+CNMI=2,1\r" ); //
if( !ATCheck( SHORTWAIT, "",CHECKOK ) ) break;
}
if( i > 0x0f ) goto Try1;
for( i = 0x00; i < 0x10; i ++ ) //设置接收方的存储格式
{
ATSend( "AT+CSMP=17,167,0,241\r" ); //
if( !ATCheck( MIDDLEWAIT, "",CHECKOK ) ) break;
}
if( i > 0x0f ) goto Try1;
ClearReceiveBuffer( );
LightStatus( );
InitializeFlag = false;
LightOther( 0 );
LoginFlag = false;
Flag_Hour = true;
SendLogin( PhoneNumber ); //发送注册
if( ParameterErrorFlag ) SendAskSetup( PhoneNumber,ParameterErrorFlag );
}
/*------------------------------------------------------------------
名称: DowithCheckWait
作用: 短信发送后判断等待时间是否到
输入: 无
输出: 无
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DowithCheckWait( void )
{
unsigned char data i;
Flag_s = false;
if( mRegister -- ) return; //2分钟
mRegister = 120;
WaitFlag = false; //允许检测
if( !OneHour -- ) //判断是否过了1小时
{
OneHour = 30;Flag_Hour = true;
if( !OneDay -- )
{
EA = false;while(true)
{
}
}
//判断是否过了1天
}
for( i = 0x00; i < 0x08; i ++) //报告完毕,等待确认
{
WaitTime[i] --;
if( (WaitStatus &amt; Table38[i]) &amt;&amt; (!WaitTime[i]) )
{
switch(i)
{
case 0x00:SendDetect( PhoneNumber );break;
case 0x01:SendLogin( PhoneNumber );break;
case 0x02:SendLogout( PhoneNumber );break;
case 0x03:SendPowerDown( PhoneNumber );break;
default:WaitStatus &amt;= Tablef38[i];break;
}
}
}
}
/*------------------------------------------------------------------
名称: DowithCheckAll
作用: 检测所有参数的正确性
输入: 无
输出: 无
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DowithCheckAll( void )
{
ParameterErrorFlag = 0x00;
#ifdef HARDDEBUG
DSend("\r\n*******************************************\r\n");
DSend("Verify:");
DSend(Verify);
DSend("\r\nPassword:");
DSend(Password);
DSend("\r\nPasswordCheck:");
DSend(PasswordCheck);
DSend("\r\nPhoneNumber:");
DSend(PhoneNumber);
DSend("\r\nPhoneCheck:");
DSend(PhoneCheck);
DSend("\r\nFinish!\r\n");
#endif
if( strcmp( Verify, VERIFY1 ) )
{
ParameterErrorFlag = 0xff;
strcpy( Verify, VERIFY1 );
SMSNumber = 0x00;
}
if( strcmp( Password, PasswordCheck ) ) ParameterErrorFlag |= 0x01;
if( strcmp( PhoneNumber,PhoneCheck ) ) ParameterErrorFlag |= 0x02;
if( DefaultStatus != DefaultCheck ) ParameterErrorFlag |= 0x1c;
if( WarnStatus != WarnCheck ) ParameterErrorFlag |= 0x18;
if( RelayStatus != RelayCheck ) ParameterErrorFlag |= 0x10;
if( SMSWait != SMSWaitCheck ) ParameterErrorFlag |= 0x20;
if( strcmp( DGPhoneNumber,DGPhoneCheck ) ) ParameterErrorFlag |= 0x40;
if( ParameterErrorFlag &amt; 0x01 )
{
strcpy( Password, PASSWORD1 ); //设置默认密码
strcpy( PasswordCheck, PASSWORD1 ); //设置默认密码
Password[ 0x6 ] = 0x00;
}
if( ParameterErrorFlag &amt; 0x02 )
{
strcpy( PhoneNumber, DEFAULTNUMBER1 ); //设置默认电话号码
strcpy( PhoneCheck, DEFAULTNUMBER1 ); //设置默认电话号码
PhoneNumber[ 0x10 ] = 0x00;
}
//判断电话号码是否出错
if( ParameterErrorFlag &amt; 0x04 )
{
DefaultStatus = DEFAULTSTATUS1; //设置检测默认
DefaultCheck = DEFAULTSTATUS1; //设置检测默认
OLDDETP = DefaultStatus;
DETP = DefaultStatus;
}
if( ParameterErrorFlag &amt; 0x08 )
{
WarnStatus = WARNSTATUS1; //设置检测报警
WarnCheck = WARNSTATUS1; //设置检测报警
RelayStatus = 0x00; //设置检测继电器
}
if( ParameterErrorFlag &amt; 0x10 )
{
RelayStatus = RELAYSTATUS1; //设置检测继电器
RelayCheck = RELAYSTATUS1; //设置检测继电器
}
if( ParameterErrorFlag &amt; 0x20 )
{
SMSWait = SMSWAIT1;
SMSWaitCheck = SMSWAIT1;
}
if( ParameterErrorFlag &amt; 0x40 )
{
strcpy( DGPhoneNumber, DEFAULTNUMBER1 ); //设置电工默认电话号码
strcpy( DGPhoneCheck, DEFAULTNUMBER1 ); //设置电工默认电话号码
DGPhoneNumber[ 0x10 ] = 0x00;
}
if( ParameterErrorFlag &amt;&amt; (!InitializeFlag) )
{
SendAskSetup( PhoneNumber,ParameterErrorFlag );
#ifdef HARDDEBUG1
DSend("\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n");
DSend("Verify:");
DSend(Verify);
DSend("\r\nPassword:");
DSend(Password);
DSend("\r\nPasswordCheck:");
DSend(PasswordCheck);
DSend("\r\nPhoneNumber:");
DSend(PhoneNumber);
DSend("\r\nPhoneCheck:");
DSend(PhoneCheck);
DSend("\r\nFinish!\r\n");
#endif
ParameterErrorFlag = 0x00;
}
}
/*------------------------------------------------------------------
名称: DowithDetect
作用: 监测端口状态
输入: 无
输出: 无
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DowithDetect( void )
{
unsigned char i;
if( POWERDETECT )
{
for( i = 0x00;i < 0xff;i ++ )
{
}
if( POWERDETECT )
{
if( !(WaitStatus &amt; 0x08) )
{
SendLogout( PhoneNumber );
SendPowerDown( PhoneNumber );
}
}
}
if( DETP == P4 ) return;
for( i = 0x00;i < 0xff;i ++ )
{
}
if( DETP == P4 ) return;
DetectPulse ++;
if(DetectPulse < 20) return;
DetectPulse = 0x00;
DETP = P4;
if( !ParameterErrorFlag ) DowithCheckAll( );
#ifdef HARDDEBUG1
strcpy( TempBuffer, "&amt;&amt;&amt;&amt;&amt;&amt;PORT: OLD: " );
BitToString( P4, TempBuffer, 11 );
BitToString( OLDDETP, TempBuffer, 23 );
DSend(TempBuffer);
#endif
i = ( DefaultStatus ^ DETP ); //判断是否启动继电器
i &amt;= WarnStatus;
i &amt;= RelayStatus;
if( i )
{
EnableRelay( 0 ); //控制继电器
Delays(4);
DisableRelay( 0 ); //控制继电器
}
i = ( DETP ^ OLDDETP ) &amt; WarnStatus;
if(!(i ^ OLDWARN))
{
if(WaitFlag) return;
}
WaitFlag = false;OLDWARN = i;
if(i)
{
SendDetect( PhoneNumber );WaitFlag = true;
}
OLDDETP = DETP; //发送监测
}
/*------------------------------------------------------------------
名称: DowithReset
作用: 复位
输入: 无
输出: 无
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DowithReset( void )
{
ResetFlag = false;
EA = false;
DisableWireless( ); //重新启动
DelightStatus();
DelightOther(0);
DelightOther(1);
DelightOther(2);
DelightOther(3);
DelightOther(4);
WDRST = 0xff;
while(true)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -