相关控制
来源:互联网 发布: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
}
* 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
}
阅读全文
0 0
- 相关控制
- Delphi控制Excel相关
- Oracle流程控制相关
- PID控制相关在线教程
- vfp控制excel相关文章
- VC进程控制相关代码
- VC进程控制相关代码
- 版本控制Subversion相关资源
- js控制flash及其相关
- Android 控制WIFI相关操作
- Android 控制WIFI相关操作
- Unity 角色控制相关操作
- 版本控制svn相关了解
- Unity 角色控制相关操作
- HEVC速率控制相关标准
- BOM相关的权限控制
- AD 控制域 相关命令
- Android控制手机振动相关
- session是什么?
- Django 改为用pymysql方法
- P3329 [ZJOI2011]最小割
- 设计模式--适配器模式(简要)(四)
- 字符串回文判断(palindrome)
- 相关控制
- Stax用法示例
- JSP<1.1>
- 函数默认参数
- MyBatis配置C3P0连接池
- Android双击返回键退出程序的实现方法
- 舞步学院PUA就是个坑,大家千万不要信(真事)
- 服务一带一路-逐浪CMS软件团队物联网研发成果显赫
- Android线程—多线程编程核心技术