相关控制

来源:互联网 发布:java socket断点续传 编辑:程序博客网 时间:2024/06/05 22:34
/*
 * File:   main.c
 * Author: sm116
 *
 * Created on May 20, 2017, 12:01 PM
 */
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = ON         // Watchdog Timer Enable (WDT enabled)ON
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)ON
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = ON         // Flash Program Memory Code Protection (Program memory code protection is enabled)ON
#pragma config CPD = ON         // Data Memory Code Protection (Data memory code protection is enabled)
#pragma config BOREN = SBODEN   // Brown-out Reset Enable (Brown-out Reset controlled by the SBOREN bit in the BORCON register)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)


// CONFIG2
#pragma config WRT = ALL       // Flash Memory Self-Write Protection (000h to FFFh write protected, no addresses may be modified by EECON control)ALL
#pragma config VCAPEN = OFF     // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = ON      // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)






#include<pic16f1947.h>
#include <xc.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"delay.h"




__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
__EEPROM_DATA(0,0,0,0,0,0,0,0);




#define uchar unsigned char
#define uint  unsigned int
#define BJDJ_A PORTBbits.RB1
#define BJDJ_B PORTBbits.RB2
#define BJDJ_C PORTBbits.RB3
#define BJDJ_D PORTBbits.RB4
#define START_eng               PORTAbits.RA4
#define STOP_eng PORTCbits.RC1
#define jiyou                PORTFbits.RF4
#define power_ON                PORTEbits.RE1 //电源控制口
#define key_qd PORTFbits.RF7


#define LED_lv PORTCbits.RC4
#define LED_hong PORTCbits.RC5
#define DJJS            9//2
#define RPM_max 6850
#define RPM_wait        1800
#define BS_max 265//风门最大总步数
#define xs_wd 38
#define BS_max_20ms 4//feng men 20mS dan ci bu shu,que ding feng men su du 风门20ms 单次步数,确定风门速度
#define JIYOU_sj 75//T = N * 20mS


#define kp 1255//966//1733//999
#define ki 33//33//44//29
#define kd 7//5


#define pid_A (kp + ki + kd)
#define pid_B (kp + 2* kd)
#define pid_C kd




#define led_off 0
#define led_on 1


#define kp1 922//999//644//622//
#define ki1 26//29//25//23//
#define kd1 5//6//


#define pid_A1 (kp1 + ki1 + kd1)
#define pid_B1 (kp1 + 2* kd1)
#define pid_C1 kd1


#define kp2 655//380//499//1833
#define ki2 19//18//23
#define kd2 4//5//9


#define pid_A2 (kp2 + ki2 + kd2)
#define pid_B2 (kp2 + 2* kd2)
#define pid_C2 kd2


#define kp3 333//444//380//499//1833
#define ki3 11//14//18//23
#define kd3 2//3//5//9


#define pid_A3 (kp3 + ki3 + kd3)
#define pid_B3 (kp3 + 2* kd3)
#define pid_C3 kd3


uint data_TMR7;


//uchar mode_yk;
uchar data_bit;
//uchar time_yk;
//uchar time_yken;
uchar count_SQD;
uchar time_SQD;
uchar time_QDDJ;
uint time_jiange;




unsigned char time_updata=0;
unsigned char send_send=0;
unsigned  char replay=0;
unsigned char rx_cont_2=0;
unsigned char rxbuffer_2[16]={0};//接收到的数据
unsigned char rxd_buf[16]={0};
unsigned char data_buf[14]={0};
unsigned char run_time[2]={0};//runtime
unsigned char time_remain[3]={0};//time_remainiing
unsigned char life_time[3]={0};//life_time
unsigned char rxd_over=0;
unsigned int sys=0;
unsigned char allow_fuel=0;
unsigned char fuel_time=0;
unsigned int youliang=0;//燃油量采样值
unsigned char allow_power=0;
unsigned char power_time=0;
unsigned int batter_power=0;//电池电压采样值
unsigned int cur_temp=0;//温度采样值
unsigned char fuel_updata=0;
unsigned char you_change=0; //把油位换算到9个等级中去
unsigned char you_1=0;      //油位滤波计数
unsigned char you_change_old=0;  //油位历史值存储
unsigned char youwei=0;     //油位滤波后最终值存储
unsigned int gonglv=0;
unsigned int gx_time=1;
unsigned int yw_time=0;
unsigned int shijian=0;
unsigned int youyou=0;
unsigned char updata_time=0;
unsigned int total_hour=0;




uchar time_back;
uchar FM_back; //xi huo hui zou feng men biao zi 熄火回走风门标志
uchar time_off_jy; //ji you bao jing shi jian 机油报警时间
uchar time_power_on; //shang dian ji shi  上电时间
uchar time_power; //diao dian ji shi掉电计时
uchar time_yaokong; //yao kong shu ju ji shi  遥控数据计时
//uchar yaokong_ok; //yao kong shu ju jie shou wan cheng 遥控数据接收完成
//uchar yaokong_en; //kai shi you shi ju 开始有数据
uchar yaokong_start;
uchar yaokong_stop;
//volatile uchar bz_TM05; //zhuan su cai yang ding shi qi yi chu biao zhi    转速采样定时器溢出标志
//volatile uchar bz_TM06;
uchar start_qd;
uchar stop_off;
uchar bz_xuan1;
uchar bz_xuan2;
uchar change;
uchar time_change;
uchar time_jiyou;


uint count_qd;
uchar bz_fail;
uchar DJ_go;
uchar time_RX;    
uchar ERR_eep;    
uchar ERR_count; 
uchar bz_2ms;
uchar time_chaosu;
uchar count_RPM_ok;


uint BS_back;
uint BS;         
uchar BJDJ_en;   
uchar start_dj;  
uchar time_start;
uchar time_dj;
uchar start_go; 
uint  BS_test = 0;
signed int  err_now;
signed int  err_bef;
signed int  err_lst;  
signed int  err_sun;
signed int  err_no = 0;
signed int  RPM_mb;
signed int  RPM_temp;


uint BS_fm;
uint BS_fm_y;
uchar FM_fx;
uchar FM_go;
uchar adss; 
uchar qidong;
uchar jd_lengji;
uchar time_lengji;
uint  time_shibai;
uint  time_xihuo;
uint  time_qidong_ok;
uchar time_ksdd;


unsigned long int RPM_data;
uint RPM_m; 
uint RPM_bef;   
uchar RPM_No1;
uchar RPM_No2;
uchar RPM_res;    
uchar jisuan;  
uchar back_start;  
uchar count_BS_FM;
uchar count_02s;


uint  data_AD;
uchar count_AD;
uchar AD_js;
signed int  wendu;
//signed int  wendu_20ms;
uchar bz_wdok; //wen du jian ce yi ci OK  温度检一次 ok


uchar time_sys;                       
uchar time_20ms;                     
uchar time_02s;
uchar time_led;                      
uint  time_eng; 
//uchar mode_xuexi; //yao kong xue xi  
//uchar time_xuexi; //xue xi an jian ji shi 
uchar mode_key1;                    
uchar time_key1;
uchar time_key2;   
uchar start_bz; //qi dong zhuang tai biao zi  启动状态标志
uchar buzou_qd; //feng men kong zhi bu zou风门控制步骤


uchar speed_a; // <50 du
uchar speed_b; // >100 du 
uchar speed_c; // 50--100
uchar speed_d; //OK hou kai feng men   < 50 ok 后开风门
uchar speed_e; //OK hou kai > 50
uint time_a;
uint time_b;
uint time_c;
uint time_d;
uint time_e;
uint time_wuwendu;
uint  RPM_ok;
uint  time_ok;
uint  time_qidong;
uint  RPM_daiji;
uchar time_daiji;
uchar time_daiji_s;
uchar bz_wendu;
uchar speed_f;
uchar jiaodu_xihuo;


uchar Read_No =0;
uchar Read_over =0;                      
uchar Read_buf[4];                       
uchar Write_No =0;                      
uchar Write_on;                         
uchar sun_txd;      
uchar tabEE[24];
#define FUEL  0X23 //机油传感器2 燃油  an8  00100011    
#define TEMP  0x1f //机油传感器2  温度 an7  00011111    
#define POWER  0X11 //机油传感器2 电压  an6  00011011    
unsigned char  wifi_cipmux[]="AT+CIPMUX=1\r\n"; 
unsigned char  cipserver[]="AT+CIPSERVER=1,8080\r\n";
unsigned char  wifi_send_0[]="AT+CIPSEND=0,43\r\n";  //  发送数据指令
//unsigned char  wifi_send_1[]="AT+CIPSEND=1,43\r\n";//wifi 命令
unsigned char bz_wdok;//温度检测一次


unsigned int TMR_bef=0;unsigned int time_RPM=0;unsigned int time_bef=0;
unsigned char send_buffer[43]={0};unsigned char time_500ms=0;unsigned int time_2ms_tx=0;
unsigned char tempbuffer[100]={0};unsigned char tempbuffer2[16]={0};
unsigned char cmd_data[33]={0};unsigned char cmd_data_mode=1;unsigned char Allow_connect=0;
unsigned char repet_cmd_data[43]={0};unsigned char RC_1=0;
//wifi收数据与否处理。当收数据结束的时候wifi_rxcount会++ rx_cont_1接收个数
unsigned char wifi_rxcount=0;unsigned char rx_cont_1=0;bit runed_time=0;




void init_system(void)//                                                                    时钟
{
OSCCON  =0xf0;//0xF0;//0xf3;//0x6B;//内部时钟32m/8M/4M
WDTCON  = 0x1f;//看门狗周期32S
}
unsigned int CRC_16(unsigned char *str,int lenth)//                                            crc
{
unsigned char k;
unsigned long temp=0;
while(lenth--)
{
for(k=0x80;k!=0;k=k>>1)
{
temp=temp*2;
if((temp&0x10000)!=0)
temp=temp^0x18005;
if((*str & k)!=0)
temp=temp^(0x10000^0x18005);
}
str++;
}
return temp;

}
void init_data_send()//                                                                    数据
{
 send_buffer[0]=0x55;
 send_buffer[1]=0x11;          
 send_buffer[2]=0x11;
 send_buffer[14]=CRC_16(send_buffer,14)/256;
 send_buffer[15]=CRC_16(send_buffer,14)%256;
 repet_cmd_data[0]=0x55;
 repet_cmd_data[1]=0x55;          
 repet_cmd_data[2]=0x55;
 repet_cmd_data[14]=CRC_16(repet_cmd_data,14)/256;
 repet_cmd_data[15]=CRC_16(repet_cmd_data,14)%256;


}


void init_gpio(void)//                                                                      端口
{
TRISCbits.TRISC2=1;//ccp捕捉输入管脚
TRISCbits.TRISC6=1;
TRISCbits.TRISC7=1;//c6 c7 串口1 管脚
TRISGbits.TRISG2=0; 
TRISGbits.TRISG1=1;//g1 g2 串口2 
TRISFbits.TRISF0=0;//单片机总电源 控制dy-mos高供电,低断电
TRISFbits.TRISF4=1;
ANSELFbits.ANSF4=0;//f4机油接口
TRISFbits.TRISF3=1;
ANSELFbits.ANSF3=1;
TRISFbits.TRISF2=1;
ANSELFbits.ANSF2=1;
TRISFbits.TRISF1=1;
ANSELFbits.ANSF1=1;//ad 6 7  8  端口F 1 2 3 燃油,温度 ,电池
TRISBbits.TRISB1=0;
TRISBbits.TRISB2=0;
TRISBbits.TRISB3=0;
TRISBbits.TRISB4=0;//步进电机 b1234
TRISAbits.TRISA4=0;//启动发动机
TRISCbits.TRISC1=0;//停止发动机
TRISFbits.TRISF4=1;
ANSELFbits.ANSF4=0;//机油输入
TRISFbits.TRISF7=1;
ANSELFbits.ANSF7=0;//钥匙启动
TRISEbits.TRISE1=0;
ANSELEbits.ANSE1=0;//电源控制口
TRISCbits.TRISC4=0;
TRISCbits.TRISC5=0;//灯两个

}
unsigned int get_ad(unsigned char n)
{
    unsigned int  value;
  
    ADCON0 = n ;
   
    ADCON1=0XE0;// FOSC/64 右对齐参考电压 VDD
    //Delay_ms(2);//致命延时3天没找到问题 分时调用,暂时不用
//     ADCON0bits.ADON=1;//在定时器0中断中
    ADCON0bits.GO=1;
    while(ADCON0bits.GO);
    value=ADRESH *256 + ADRESL;
    return value;
}
void init_timer0(void) //                                                                 timer0
{
    OPTION_REG=0x05; //64分频 2ms
    TMR0=6;
    INTCON=0XA0;
    INTCONbits.TMR0IE=1;
     PEIE=1;   //外部中断使能
     GIE=1; //总中断使能
}
void init_timer1(void)//定时器1作为ccp1捕捉的计数基本                                       timer1
{

    //分频 1:8; T1OSCEN disabled; nT1SYNC synchronize; 时钟 FOSC/4; TMR1ON off; 
T1CON = 0x30;  TMR1H = 0x00; TMR1L = 0x00;
        PIR1bits.TMR1IF = 0;
        T1CONbits.TMR1ON = 1;   // Start TMR1
}
void init_ccp1(void)//                                                                         ccp1
{

CCP1CON = 0x04;    
CCPR1L = 0x00;    
CCPR1H = 0x00;    
PIR1bits.CCP1IF = 0;
PIE1bits.CCP1IE = 1;
}


void init_uart_1(void)//串口1 wifi串口                                                         uart1
{


    TRISCbits.TRISC6=1;
    TRISCbits.TRISC7=1;
TX1STA=0X24;   //txen=1  异步  brgh=1
RC1STA=0X90; // 使能串口  使能接收
BAUD1CON=0X60;  //接收器空闲  电平不反向 
    BAUD1CONbits.BRG16=0;// 232 速率115200  使用高速波特率
    SPBRG=16;//010; 9600 207  115200 16
    RC1IE=0; //先不使能接收中断
TX1STAbits.TXEN=0x01; //发送使能
TX1IE=0;//禁止发送中断
PEIE=1;   //外部中断使能
GIE=1; //总中断使能
}


void sendchar(unsigned char data)
{
 while (!TX1STAbits.TRMT);
    TX1REG = data;    


}
void send(unsigned char *p)
{


     unsigned char length=0;
      length =strlen(p);
        for (length;length>0;length--)
        {
            sendchar(*p);
            p++;
        }
}
void send_data(unsigned char *p)
{


     unsigned char length=43;
     
        for (length;length>0;length--)
        {
            sendchar(*p);
            p++;
        }
}


void init_uart_2(void)//逆变器数据                                                                 uart2
{
    
    TRISGbits.TRISG1=1;
    TRISGbits.TRISG2=1; //根据文档置1 为rx tx 口
    ANSELGbits.ANSG1=0;
    ANSELGbits.ANSG2=0;
 //    ANSELGbits.ANSELG=0;
 ///   AN15=0;AN14=0;
   
TX2STA=0X20; //txen=1  异步0  brgh=0
RC2STA=0X90;// 使能串口  使能接收
BAUD2CON=0X60;//接收器空闲  电平不反向 
BAUD1CONbits.BRG16=0; //000
SP2BRGL=207;//2400
SP2BRGH=0;
RC2IE=0x01;
TX2STAbits.TXEN=0x00;
TX2IE=0x00;
PEIE=1;   //外部中断使能
GIE=1; //总中断使能
 //   RT485=0;//485 处于接收状态
}


//
//void init_interrupt(void)                                                         
//{
// PEIE=1;
// GIE=1;
//}


void WriteEE(unsigned char adds,unsigned char data)        
{
while(WR==1);                         //上一次写操作是否完成
EEADR=adds;                          //EEPROM地址
EEDAT=data;                     //准备写入EEPROM的数据
EEPGD=0;                              //指向EEPROM数据储存器
CFGS=0;  //指向EEPROM数据储存器
WREN=1;                               //使能写操作
        GIE=0;                                //禁止中断                               
        EECON2=0x55;                          
        EECON2=0xAA;                          //EEPROM解锁
        WR=1; 
        GIE=1;                                //开始写
        while(WR==1);                         //等待写操作完成
        if(EEIF==1)
        EEIF=0;             
        WREN=0;                               //禁止写操作
}
unsigned char ReadEE(unsigned char adds) 
{
    unsigned char num;
    while(RD==1);                        //上一次读操作是否完成
    EEADR=adds;               //EEPROM地址为00H
    EEPGD=0;                             //指向EEPROM数据储存器
CFGS=0; //指向EEPROM数据储存器
    RD=1;                                //开始读
    while(RD==1);                        //等待读操作完成
    num=EEDAT;                          //读出
    return(num);                         //返回读出的数
}
void updata (void)// updata
{
if(sys>=30000) //30000 1分钟
{ sys=0;
if(RPM_m>=1000)
{
run_time[0]=run_time[0]+1; // 本次运行时间
if(run_time[0]==0x3c)
{
run_time[1]=run_time[1]+1;
run_time[0]=0;
}
life_time[0]=life_time[0]+1;//总时间
if(life_time[0]==0x3c)
{ total_hour++;
life_time[0]=0;
life_time[1]=total_hour%256;
life_time[2]=total_hour/256;
}
}
if(shijian>=1)//每一分钟减少一分钟
{
shijian--;
}
else
shijian=0;
}
if(RPM_m>=1000)
send_buffer[37]=0x00;//发动机启动
else
send_buffer[37]=0x01;//发动机关闭
// 更新油量,剩余时间 每2ms更新
if(fuel_updata>=1)
{
fuel_updata=0;
if(youliang>643)                //dianya>3.14
{
   you_change=0;//0%
   send_buffer[21]|=0x10;//燃油过低

                                else if((youliang>510)&&(youliang<600) ) //2.5v<dainya<2.95v
{
   you_change=2;  //25%
    send_buffer[21]&=0xef;//燃油正常
}     
                                else if((youliang<365)&&(youliang>478))             //1.71   2.6 //提前预警
{
   you_change=4;//50%
    send_buffer[21]&=0xef;//燃油正常
}
                                else if((youliang<320)&&(youliang>175))  //0.89<dianya<1.52
{
   you_change=6;  //75%
     send_buffer[21]&=0xef;//燃油正常
}
                                else if ((youliang<102))                  //dianya<0.5v
{   
you_change=8; //100%
send_buffer[21]&=0xef;//燃油正常
}

if( you_change_old==you_change)
{
you_1++;

else
{
you_1=0;
you_change_old=you_change;
}
if(you_1>2)
{
youwei=you_change;   
you_1=0;
}
                        if((gonglv>200)&&(gonglv<=1750)) //875 20171.13
{     
      yw_time=((1305-((35*gonglv)/100))*(youwei*100))/800;     
}
                                else if((gonglv>1750)&&(gonglv<=2630))
{
   yw_time=((1128-((35*gonglv)/100))*(youwei*100))/800;
}
                                else if((gonglv>2630)&&(gonglv<5000))
{
   yw_time=((763-((112*gonglv)/1000))*(youwei*100))/800;
}    
                                else  
yw_time=1575*youwei/10;   //空载
                        if(gx_time==yw_time)//gx_time 用于保存上一次保存时间,::如果上一次的时间与现在算出的时间相等则不更新时间
{
}                  //如果不等则将新的时间更新gx_time 并且将新的时间显示;
                                else
{
   gx_time=yw_time;
   shijian=gx_time;
}
                                shijian=yw_time;//暂定2017512
                                youyou=120*youwei/8;//      
}//每2ms更新


}
void interrupt ISR(void) //                                                                    isr
{
if(CCP1IF==1)
{

unsigned int temp;

CCP1IF=0;

temp = CCPR1H;
temp = (temp << 8) + CCPR1L;
if(temp > RPM_bef)
RPM_data = temp - RPM_bef;//T1没有溢出
else
RPM_data = 0xffff - RPM_bef + temp;//T1溢出
RPM_No2++;
RPM_data = (RPM_data >> 1)+(time_bef >> 1);
RPM_bef  = temp;
time_bef = RPM_data;
RPM_m=  time_bef*60/DJJS;

if(RPM_No2 > (DJJS -1))
{
jisuan   = 1;
RPM_data = 0;
RPM_No2   = 0;
time_SQD = 0;
RPM_res  = 0;
}
if((RPM_m > 1000)||(count_SQD > 2))
//LED_lv = ~LED_lv;//亮灯

if((RPM_m > 1800) && (back_start == 0))
back_start = 10;


if(RPM_m > 1400)                
{
if(time_eng == 0)
time_eng = 1; 
}
else
time_eng = 0;  
if(RPM_No2 > 2)
time_ksdd = 0;


if(RPM_m > 200)
{
// time_dj = 50;
// DJ_go = 1;
// RES = 1;
// EN = 1;
time_xihuo = 0;
if(buzou_qd == 0)
{
if(stop_off == 0)
count_SQD++;
}
if(count_SQD == 2)
{
buzou_qd = 1;
count_SQD = 3;
BS = 588;// you men kai dao zui da  油门开到最大

BJDJ_en = 1;
}
}




}


   if((RC1IF==1)&&(RC1IE==1))
{
RC1IF=0;
if((RC1STAbits.FERR==1)||(RC1STAbits.OERR==1))
{
RC1STAbits.SPEN=0;
RC1STAbits.SPEN=1;
}
else
{

            tempbuffer[rx_cont_1] = RC1REG;
            rx_cont_1++;
            wifi_rxcount=0;
     
        }
    }
if((RC2IF==1)&&(RC2IE==1))
{
        RC2IF=0;
if((RC2STAbits.FERR==1)||(RC2STAbits.OERR==1))
{
RC2STAbits.SPEN=0;
RC2STAbits.SPEN=1;
}
else
{

rxbuffer_2[rx_cont_2] = RC2REG;
rx_cont_2++;
            if(rx_cont_2==16)
            {
                rx_cont_2=0;
rxd_over = 1;
            }
         }
        }
if((TMR0IF==1)&&(TMR0IE==1))
{
                      TMR0IF=0;   //定时器0 2ms
                      TMR0=6;
     sys++;
     wifi_rxcount++;
     fuel_updata++;
     updata_time++;
     time_2ms_tx++;
     time_sys++;
     bz_2ms = 1;
     if(allow_fuel)
     {
 fuel_time++;
     
     }
     if(allow_power)
     {
 power_time++;
     
     }


if(time_sys > 99)           
{
time_sys = 0;
time_02s = 1;
   }
   if((time_sys % 10)==0)//20mS
{
ADCON0bits.ADON=1;//startstart AD
time_20ms = 1;
}
  
}


}


void main(void)//                                                                            main
{
uint temp = 0;
uchar temp_8;
unsigned long int temp_L;
signed int temp_i;
uint ADJS_temp;

 
   power_ON = 1;
   time_ksdd = 10;
   time_power = 80;
   time_eng = 0;
   RPM_mb = RPM_max;
   time_start = 0;
   //BS_back    = 400;//125;       
   DJ_go = 0;
   back_start = 0;
   qidong = 0;
   //bz_xuan1 = 0;
   //bz_xuan2 = 0;
   LED_hong = led_off;
   //LED_lv   = led_on;
   time_led = 0;
   START_eng = 0;
   //DCF = 0;
   STOP_eng = 0;//1; // shi fang dian huo qi 释放点火器
   FM_back = 0;
   time_QDDJ = 0;
   buzou_qd  = 0;
   
    RPM_mb = 3100;
    speed_a = 2;
speed_b = 2;
speed_c = 4;
speed_d = 4;
speed_e = 4;
time_a = 40;//12;
time_b = 5;
time_c = 15;//5;
time_d = 5;
time_e = 5;
RPM_ok = 800;
RPM_daiji = 2800;
time_daiji = 10;
speed_f = 4;
jiaodu_xihuo = 90;
time_lengji = 12;
jd_lengji = 30;

buzou_qd = 0;
bz_wdok = 0;
RPM_m = 0;



init_system();
init_gpio();
init_uart_1();
init_timer0();
init_timer1();
init_ccp1();
init_data_send();
init_uart_2();
while(1)
{
if(!runed_time)
{
power_ON=1;//打开电源
runed_time=1;
Delay_ms(400);//上电稳定时间上电后46ms 发复位数据,直到260ms发完
send(wifi_cipmux);
Delay_ms(20);
send(cipserver);
Delay_ms(20);
RC1IE=1;//串口1 wifi 接收使能 发送命令返回需要6ms
life_time[0]=ReadEE(0); //总时间 分钟
life_time[1]=ReadEE(1);  //小时  小 
life_time[2]=ReadEE(2);//小时  大
total_hour=life_time[1]+(life_time[2]*256);
send_buffer[37]=0x01;//发动机状态关
}
if(rxd_over) //串口接收数据处理
{
unsigned long CRC_temp=0;
      rxd_over = 0;
for(int i=0;i<14;i++)
      {
data_buf[i]=rxd_buf[i];   
      }
     CRC_temp= CRC_16(data_buf,14);
      if(CRC_temp ==((rxd_buf[14] << 8)+rxd_buf[15] ))
      {  
      send_buffer[15]=rxd_buf[12];
      send_buffer[16]=rxd_buf[13];//以上两行,逆变器功率  
      gonglv=send_buffer[15]*256+send_buffer[16];
      send_buffer[19]=rxd_buf[10];//逆变器故障代码      
      memset(rxd_buf,0x00,16);


      }
}

if(updata_time>=1)//每2ms更新一次
{
updata();
send_buffer[12]=shijian%60;
send_buffer[11]=(shijian/60)%256;
send_buffer[10]=(shijian/60)/256;
send_buffer[9]=batter_power;
send_buffer[8]=youyou;
send_buffer[7]=life_time[0];//总时间 分钟
send_buffer[6]=life_time[1];//小时 小
send_buffer[5]=life_time[2];//小时 大
send_buffer[4]=run_time[0];//本次运行时间 低
send_buffer[3]=run_time[1]; //高
updata_time=0;


}
                
                


 
//--------------------------------上电执行---------------------------------
if(wifi_rxcount>=2) //wifi 收数据处理 收完数据5ms后开始数据处理 //有连接5ms 无连接7ms经验值4ms
{
   wifi_rxcount=0;
   if(rx_cont_1>0)
   {
switch (rx_cont_1)
{
   case 0x0a: memset(tempbuffer,0x00,100);RC_1=0;break;//接收到关闭命令
   case 0x0b:memset(tempbuffer,0x00,100);RC_1=0;break;//接收到连接命令
   case 0x21:{RC_1=0;
memcpy(cmd_data,tempbuffer,33);
memset(tempbuffer,0x00,100);
   switch(cmd_data[7])//根据收到的数据确定发数据给谁
   {        
case 0x30: send(wifi_send_0); replay=1;break;
//case 0x31: send(wifi_send_1); replay=3;  Delay_ms(100);send_data(repet_cmd_data);break;
default :{} break;
    }
  cmd_data_mode=cmd_data[24];
  memset(cmd_data,0x00,33);
switch(cmd_data_mode) //根据收到的数据改变发动机
{
case 0x00://发动机1需要转动0启动1关闭启动
   {
   if(RPM_m==0)
   {
start_qd = 1;
stop_off = 0;
time_power_on = 0;
   }
   
   } break;
case 0x01://发动机1不需要转动 停止
   {
stop_off = 1;
start_qd = 0;
WriteEE(0,life_time[0]);//发动机停止 保持总运行时间
WriteEE(1,life_time[1]);
WriteEE(2,life_time[2]);

   } break;
default:{}
   break;
}
};break;//接受到数据
   case 0x2e:memset(tempbuffer,0x00,100);RC_1=0;Allow_connect=0;break;//无连接发数据失败
   case 0x1a:memset(tempbuffer,0x00,100);RC_1=0;Allow_connect=1;break;//有连接可以发数据
   default : memset(tempbuffer,0x00,100);break;
}
rx_cont_1=0;
   }
}
//------------------------------------------------------------收数据类型


if(time_2ms_tx>=250)//定时发送数据 2ms*250=500ms
{
time_2ms_tx=0;
time_updata=1;
send_send=1;


}
if(time_updata) //表示更新数据时间到达
{
if(send_send) //没次更新时间到达就只发送一次更新数据
{
send(wifi_send_0);
send_send=0;
}
if(Allow_connect)
{
send_buffer[14]=CRC_16(send_buffer,14)/256;
send_buffer[15]=CRC_16(send_buffer,14)%256;
send_data(send_buffer);
time_updata=0;
Allow_connect=0;
}
}
if(replay) //回复命令确认
{
if(Allow_connect)
{
send_data(repet_cmd_data);
Allow_connect=0;
replay=0;
}
}

if(AD_js) //每200ms才一次温度
{
     
cur_temp = get_ad(TEMP);


if((cur_temp > 800)&&(cur_temp < 50))
      bz_wdok = 0x08;//  wu wen du CGQ  无温度传感器
      else
      bz_wdok = 0x02;


      if(cur_temp > 615)// wen du < 0  温度<0
      wendu = (615 - cur_temp)/13;
      else
      wendu = (615 - cur_temp)/(13 - (615-cur_temp)/100);
allow_fuel=1;//允许采油位
      data_AD = 0;
      count_AD = 0;
      AD_js = 0;
      }
if(fuel_time>=10)
{
youliang =get_ad(FUEL);
allow_fuel=0;//取消允许燃油采样
allow_power=1;//允许下面的电压采样
fuel_time=0;

}
if(power_time>=10)
{
batter_power=(get_ad(POWER)*15/70+4);
allow_power=0;//取消电压采样允许
power_time=0;
if(RPM_m>1000)
{
if(batter_power>=110)
send_buffer[21]&=0xdf;//电压正常
else
send_buffer[21]|=0x20;//电压过低


}
}

if(back_start == 10)
{
back_start = 33;
BS_back = 400;
//CW_CCW = 0;
BJDJ_en = 1;
}

if(bz_2ms)
{
bz_2ms = 0;       
if(mode_key1 == 1)
{
if((RPM_m == 0))//&& key_qd)//qi dong  启动
{
start_qd = 1;
mode_key1 = 0;
time_power_on = 0;
}
if(buzou_qd || (RPM_m > 100))//xi huo  熄火
{
stop_off = 1;
mode_key1 = 0;
}
}


if(start_qd == 1)
{
if((buzou_qd == 0))//&&(time_power_on > (JIYOU_sj + 5)))
{
start_qd = 0;
buzou_qd = 1;
//stop_off = 0;
bz_fail  = 0;
count_qd = 0;
STOP_eng = 0;


BS = 888;// you men kai dao zui da  油门开到最大
//CW_CCW = 1;
BJDJ_en = 1;
//EN = 1;
//RES = 1;
}
}


////////--------------------------------------------
if(buzou_qd == 1)// wen du ci ji, ji suan yu she zhi 温度采集 计算预设值
{
time_xihuo = 0;
time_power = 0;
time_ksdd = 0;
start_qd = 0;
FM_back = 0;
//DCF = 0; //da kai dian ci fa,gong you  打开电磁阀 供油


if(bz_wdok & 0x02)//有温度传感器
{
buzou_qd = 2;
BS_fm_y = BS_max;


if(wendu < 50)//25)
{
bz_wendu = 1;
BS_fm = 0;
}
else if(wendu > 90)
{
bz_wendu = 2;
BS_fm = BS_max;
}
else
{
bz_wendu = 3;
BS_fm = BS_max * (wendu - 50)/40;//25)/65;
}
if(BS_fm > BS_max)
BS_fm = BS_max;
}
else if(bz_wdok & 0x08)//无温度传感器
{
buzou_qd = 2;
BS_fm_y = BS_max;
BS_fm = 0;// kai 1/3//0; //风门预置 WOT 
bz_wendu = 4;
}
}
if(buzou_qd == 2)//复位   关到最小
{
FM_go = 1;
if(count_SQD > 2)
{
buzou_qd = 3; //手拉启动
}
if(BS_fm_y)
{
BS_fm_y--;
/*
if(bz_wdok & 0x08)
{


{
adss++;
if(adss > 7)
adss = 0; //kai dao zui da 开到最大
}
}
else
*/
{
if(adss)
adss--;
else
adss = 7;
}
}
else
{
FM_go = 0;
buzou_qd = 3;
}
}


if(buzou_qd == 3)//预置位置 
{
if(BS_fm > 0)
{
FM_go = 1;
BS_fm--;
BS_fm_y++; //记录风门位置
adss++;
if(adss > 7)
adss = 0;
}
else
{
if(count_SQD < 2)
buzou_qd = 4;
time_qidong = 0;
FM_go = 0;
}
}


if(RPM_m > RPM_ok)//启动ok
{
if(buzou_qd != 5)
{
time_qidong_ok++;
count_BS_FM = 22;//让风门保持一段时间
time_shibai = 0;
if((time_qidong_ok > 200)&&(bz_wdok))// & 0x02))
{
buzou_qd = 5;
count_SQD = 0;
FM_back = 0;
BS_fm = 0;
time_qidong_ok = 0;
time_xihuo = 0;
time_power = 0;
time_ksdd = 0;
BS_fm_y = 0;
time_qidong = 0;
bz_fail = 0;


if(wendu < 50)//25)
bz_wendu = 1;
else if(wendu > 90)
bz_wendu = 2;
else
bz_wendu = 3;


}
}
}
else
time_qidong_ok = 0;


////------------------------------------
if(buzou_qd == 4)//启动过程
{
if(RPM_m < 500)
{
if((time_QDDJ == 0)&&(count_SQD == 0))
START_eng = 1;
}
//else
// START_eng = 0;


time_daiji_s = 0;
RPM_temp = RPM_daiji;


if((time_QDDJ == 0)&&(count_SQD == 0))//bu shi wai bu qi dong 不是外部启动
qidong = 1; //qi dong guo cheng biao zi 启动过程标志


time_qidong++;
if(bz_wendu == 4)//wu wen du chuan gan qi 无温度传感器 
{
if(time_qidong > (time_d * 100))
{
time_qidong = 33333;
FM_go = 1; //jin ru qi dong biao zhi 进入启动标志


if(BS_fm < BS_max)//guan feng men  关风门
{
if(count_BS_FM < speed_f)
{
count_BS_FM++;
BS_fm++;
BS_fm_y = 0;
time_wuwendu = 0;
if(adss)
adss--;
else
adss = 7;
}
}
else
time_wuwendu++;


if(time_wuwendu > time_e *100)
{
time_wuwendu = 33333;
if(BS_fm_y < BS_max)//kai feng men  开风门
{
if(count_BS_FM < speed_f)
{
count_BS_FM++;
BS_fm_y++;


adss++;
if(adss > 7)
adss = 0;
}
}
else
{
time_qidong = 0;//hui dao guan feng men 回到关风门
time_wuwendu = 0;
}
}
}
}


if(bz_wendu == 1)////  <35
{
if(time_qidong > (time_a * 100))
{
time_qidong = 33333;
FM_go = 1; //jin ru qi dong biao zhi 进入启动标志


if(count_BS_FM < speed_a)
{
count_BS_FM++;
BS_fm++;
if((BS_fm / BS_max) %2) //=1 //guan feng men 关风门
{
if(adss)
adss--;
else
adss = 7;
}
else //kai feng men 开风门
{
adss++;
if(adss > 7)
adss = 0;
}
}
}
}


if(bz_wendu == 2)//// >100
{
if(time_qidong > (time_b * 100))
{
time_qidong = 33333;
FM_go = 1; //jin ru qi dong biao zhi 进入启动标志


if(count_BS_FM < speed_b)
{
count_BS_FM++;
BS_fm++;
if((BS_fm / BS_max) %2)//kai feng men  开风门
{
adss++;
if(adss > 7)
adss = 0;
}
else //guan feng men 关风门
{
if(adss)
adss--;
else
adss = 7;
}
}
}
}


if(bz_wendu == 3)//35--100du
{
if(time_qidong > (time_c * 100))
{
time_qidong = 33333;
FM_go = 1; //jin ru qi dong biao zhi 进入启动标志


if(count_BS_FM < speed_c)
{
count_BS_FM++;
BS_fm++;


if(BS_fm_y > BS_max)
BS_fm_y = BS_max;


if(BS_fm < BS_fm_y)//guan feng men  关风门
{
if(adss)
adss--;
else
adss = 7;
}
else
{
if(((BS_fm - BS_fm_y) / BS_max) %2)//guan feng men  关风门
{
if(adss)
adss--;
else
adss = 7;
}
else //kai feng men 开风门
{
adss++;
if(adss > 7)
adss = 0;
}
}
}
}
}
}


////--------------------------


if(buzou_qd == 5)//qi dong cheng gong kai feng men  启动过程开风门
{
FM_go = 1;
qidong = 0;
start_qd = 0; //qing chu yao kong qi dong biao zi  清楚遥控启动标志
START_eng = 0;


if(bz_wendu == 1)// <35du
{
BS_fm_y++; //guan dao zui xiao  关到最小
if(BS_fm_y < BS_max)
{
if(adss)
adss--;
else
adss = 7;
}
else if(BS_fm_y < BS_max*2)
{
if((BS_fm_y % BS_max) < (BS_max * jd_lengji /90))//kai 30 du  开30度
{
adss++;
if(adss > 7)
adss = 0;
}
}
else 
{
time_qidong_ok++;
BS_fm_y = BS_max *3;
}
temp = time_lengji;
if(time_qidong_ok > (temp * 100))// leng ji yan shi dao 冷机延时到
{
if((BS_fm < BS_max) && (count_BS_FM < speed_d))
{
count_BS_FM++;
BS_fm++;
adss++;
if(adss > 7)
adss = 0;
}
if(BS_fm > (BS_max - 5))
{
if(time_daiji_s == 0)
time_daiji_s = 1;
FM_go = 0;
}
}
}
else if(bz_wendu)
{
if((BS_fm_y < (BS_max + 30))&&(count_BS_FM < speed_e))
{
count_BS_FM++;
BS_fm_y++;
adss++;
if(adss > 7)
adss = 0;
}


if(BS_fm_y > (BS_max +10))
{
if(time_daiji_s == 0)
time_daiji_s = 1;
FM_go = 0;
}
}
}


/////---------------------------------------
if((FM_back == 1)&&(count_SQD < 2))
time_back++;
if(time_back > 200)
{
time_back = 222;
FM_go = 1;
BS_fm_y++;
if(BS_fm_y < (BS_max * jiaodu_xihuo/90))
{
if(adss)
adss--;
else
adss = 7;
}
else
{
FM_back = 2;
FM_go = 0;
time_back = 0;
}
}


/////---------------------------------------
BJDJ_A = 0; 
BJDJ_B = 0;
BJDJ_C = 0;
BJDJ_D = 0;
if(FM_go)
{
switch(adss)
{
case 0:
BJDJ_A= 1;
break;
case 1:
BJDJ_A= 1;
BJDJ_B =1;
break;
case 2:
BJDJ_B= 1;
break;
case 3:
BJDJ_B= 1;
BJDJ_C= 1;
break;
case 4:
BJDJ_C = 1;
break;
case 5:
BJDJ_C = 1;
BJDJ_D = 1;
break;
case 6:
BJDJ_D = 1;
break;
case 7:
BJDJ_D = 1;
BJDJ_A = 1;
break;
default:
;
}
}




}
if(stop_off) //熄火
{
//stop_off = 0;
buzou_qd = 0;
//FM_back = 1;
qidong = 0;
time_shibai = 0;
START_eng = 0;
STOP_eng  = 1;//0;//熄火
//DCF  = 1;
}

if(time_20ms)      
{
time_20ms = 0; 


if((RPM_m > 1000)&&(time_start < 252))      
time_start++;


if(time_power_on < 222)
time_power_on++;




else if(time_QDDJ)
{
time_QDDJ = 0;
if(buzou_qd != 5)
buzou_qd  = 0;
}


if(time_QDDJ > 4)
{
time_QDDJ = 3;
buzou_qd  = 1;
stop_off  = 0;
time_xihuo = 0;
time_power = 0;
time_ksdd = 0;


BS = 888;// you men kai dao zui da 油门开到最大
//CW_CCW = 1;
BJDJ_en = 1;
//EN = 1;
//RES = 1;
}


if(jiyou)
{
time_jiyou = 0;
send_buffer[21]&=0xbf;//有机油该位为0
}
else if(start_qd || buzou_qd)
{
send_buffer[21]|=0x40;//无机油,该位为1 
time_jiyou++;
}
if(time_jiyou > JIYOU_sj)//que ji you, xi huo  缺机油,熄火
{
if(stop_off == 0)
stop_off = 1;
if(time_jiyou == (JIYOU_sj + 1))
time_off_jy = 25;//ji you bao jing zhi shi 5S  机油报警值是5s


time_jiyou = JIYOU_sj + 2;
mode_key1 = 0;
buzou_qd  = 0;
time_power_on = 0;
}


count_BS_FM = 0;
if(time_dj) // xi huo hou you men ji xu zou 1S 熄火后油门,继续走1S
time_dj--;


if((RPM_m == 0)&&(buzou_qd == 0))//RPM = 0 ji shi  转速=0 计时
time_xihuo++;


if((time_xihuo > 100)&&(RPM_m == 0))
{
stop_off = 0;
STOP_eng = 0;//1;
//DCF = 0;


}
if((time_xihuo > 200)&&(RPM_m == 0))
{
buzou_qd = 0;
time_xihuo = 888;
bz_fail    = 0;
count_BS_FM = 0;
BS_fm_y = 0;
BS_fm   = 0;
//RES  = 0;
//EN = 0;
STOP_eng = 0;//1;
//DCF = 0;
FM_go = 0;


//mei you (qi dong) / (yao kong xue xi) ,ji you bao jing wan cheng, shi jin ru di gong hao mo shi  没有(启动)/(遥控学习) 机油报警完成,时间如低功耗模式
if(time_off_jy < 5)
time_power++;
if(time_power > 100)
{
power_ON = 0;
time_xihuo = 0;
LED_hong = led_off;
LED_lv   = led_off;
}
}
if(time_ksdd)
{
time_ksdd++;
if(time_ksdd > 49)
{
time_ksdd = 1;
power_ON = 0;
time_xihuo = 0;
LED_hong = led_off;
LED_lv   = led_off;
}
}
//power_ON = 1;
if(key_qd) //qi dong -- ting ji  an niu  启动 停止按钮
{
if((time_key1 == 0)&&(mode_key1 == 11))
mode_key1 = 1;//qi ting an jian duan an you xiao 启动按键短按以下
time_key1 = 0;
}
else if(time_key1 < 254)//88)
time_key1++;
if((time_key1 > 5))//&&(mode_key1 == 0))
{
LED_lv = led_on;
time_ksdd = 0;
power_ON = 1;
}
if((time_key1 == 15)&&(mode_key1 == 0))//qi dong  启动
mode_key1 = 11;
if(time_key1 == 250)//100)
{
mode_key1 = 0;


LED_lv    = led_on;
LED_hong  = led_on;
//time_yk  = 1;
//mode_yk   = 0;
time_xihuo = 0;
time_power = 0;
time_ksdd = 0;


}


////////----------------------------


if(change)
time_change++;


//////----------------------------
if(qidong) // qi dong guo cheng ji shi  启动过程计时
{
time_shibai++;
if(time_shibai > (250 + count_qd * 5))//qi dong shi bai,mei ci qi dong shi jina 3S,mei ci zeng jia 1S  启动失败,每次启动时间3s每次增加1s
{
time_shibai = 555;
qidong = 0;
buzou_qd = 6;
START_eng   = 0;
}
}
else if(time_shibai != 555)
time_shibai = 0;


if(time_shibai == 555)//qi dong shi bai jian ge ji shi 启动失败,间隔计时
{
time_jiange++;
if(time_jiange > (200 + count_qd * 5))//mei ci jian ge 3+ci shu miao 每次间隔 3+ 次数秒
{
count_qd++;
time_jiange = 0;
time_shibai = 0;
if(count_qd < 2)//3)
buzou_qd = 1;
else
{
count_qd = 0;
buzou_qd = 0;
bz_fail = 1;
}
}
}




if(time_RX)               
time_RX++;
if(time_RX > 0x88)
{
time_RX = 0;
Read_No = 0;
}


RPM_res++;                 
if(RPM_res > 20)
{
RPM_m = 0;
time_start = 0;
//STOP_eng = 0;
time_chaosu = 0;
time_eng = 0;
if(time_SQD > 20)//4S
{
time_SQD = 0;
count_SQD = 0;


buzou_qd = 0;
FM_back  = 1;
time_back = 0;
BS_fm_y  = 0;


if(buzou_qd != 5)
{
buzou_qd = 0;
qidong = 0;
}
}


if(buzou_qd == 5)
{
buzou_qd = 0;
FM_back  = 1;
time_back = 0;
BS_fm_y  = 0;
time_xihuo = 0;
time_power = 0;
time_ksdd = 0;
}
}


if(((buzou_qd == 5)|| stop_off)&&(RPM_m < 500) && (FM_back == 0))//xi huo guan feng men  熄火关风门 
{
buzou_qd = 0;
FM_back  = 1;
time_back = 0;
BS_fm_y  = 0;
}


if(time_eng &&(time_eng < 555))     
time_eng++;
}


if(time_02s)                         
{
time_02s  = 0;
count_02s++;


if(count_SQD > 2)
{
time_SQD++; //dan ci shou qi dng ji shi 单次手启动 计时
}


//if(count_02s > 1)
{
Write_on  = 1;
count_02s = 0;
}
if((time_daiji_s)&&(time_daiji_s < 240))
time_daiji_s++;


AD_js = 1;


if(time_off_jy)
{
time_off_jy--;
LED_hong = ~LED_hong;
}


if(time_led < 22)
time_led++;
if(time_led == 20)
LED_lv = led_off;


if( time_chaosu)
time_chaosu++;
if( time_chaosu > 14)
{
STOP_eng = 1;//0;
time_chaosu = 111;
}


if(buzou_qd == 4)
{
if(time_shibai < 555)
LED_lv = ~LED_lv;
}


if(time_shibai == 555)
{
LED_hong = ~LED_hong;
LED_lv = led_on;
}
else 
{ if(bz_fail)
LED_hong = led_on;
else if(time_off_jy < 2)
LED_hong = led_off;
}
}

            






}//while1


}