⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 GPS驱动集合
💻 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 + -