CANBUS 甲烷高低浓度传感器Word格式文档下载.docx
《CANBUS 甲烷高低浓度传感器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《CANBUS 甲烷高低浓度传感器Word格式文档下载.docx(152页珍藏版)》请在冰点文库上搜索。
#defineLISTEN0X70//CANBUS监听模式
#defineSELF_CHK0X40//CANBUS自检模式
#defineSHUT_OFF0X20//CANBUS关闭模式
#defineNORMAL0X0//CANBUS正常模式
#definebitset(var,bitno)((var)|=1<
<
(bitno))
#definebitclr(var,bitno)((var)&
=~(1<
(bitno)))
#defineled_offRE1//LED电源开关
#defineled_csRE2//LED驱动芯片14489片选端
#defineir_inRB1//红外接收
#defineds1820_inRA4//DS18B20数据线
#defineds1820_in_ioTRISA4//DS18B20数据线I/O方向设置
#defineb25_1RB4//B25输出1(beeper)
#defineb25_2RB5//B25输出2(常闭)
#defineb25_3RB6//B25输出3(常开)
#defineb25_4RB7//B25输出4(保留)
#definex9c102_cs1RD0//X9C102片选1(FOR低浓CH4)
#definex9c102_ud1RD1//X9C102方向选择1(FOR低浓CH4)
#definex9c102_inc1RD2//X9C102脉冲输入1(FOR低浓CH4)
#definex9c102_cs2RD3//X9C102片选2(FOR高浓CH4)
#definex9c102_ud2RD4//X9C102方向选择2(FOR高浓CH4)
#definex9c102_inc2RD5//X9C102脉冲输入2(FOR高浓CH4)
#definepwr_3v_cs1RD6//3v开关电源使能1(FOR低浓CH4)
#definepwr_3v_cs2RD7//3v开关电源使能2(FOR高浓CH4)
#defineHALF0X0//常数(FORdelay_ir())
#defineFULL0X01
#defineFAN_LOCK_VAL3.0//CH4风机闭锁
#defineFAN_LOCK_VAL_DOWN1.51//CH4风机闭锁下限(解锁!
#definePROTECT_VAL4.0//CH4探头保护值
#defineZERO_AD_UP20//CH4自动调零AD码值上限=20
#defineZERO_AD_DOWN10//CH4自动调零AD码值下限=10
#defineLtoH_SWT_VAL3.8//ch4l-->
ch4h切换点
//#defineWARM_UP_VAL3.5//切换预热点
#defineHtoL_SWT_VAL2.8//ch4h-->
ch4l切换点
//******************************数据表定义(ROM)*************************************
//constucharTAB_MMSR[]={0XC3,0XDC,0XC2,0XEB,0XCA,0XE4,0XC8,0XEB};
//密码输入
//******************************全局变量定义(RAM)*********************************
structchillon
{ucharcunt;
uintlocal_sid_1st;
//本机SID_1:
(0xxxH,12位HEX)
uintch4_low_alm;
//ch4报警下限值(16位BCD)
uintch4_high_alm;
//ch4报警上限值(16位BCD)
ucharwork_mode;
//工作模式(0=CH4,1=CH4/T)
ucharlocal_type;
//本机TYPE(01H=CH4,13H=CH4/T)
ucharch4l_zero;
//低浓ch4零位值(8位HEX)
uintch4l_k;
//低浓ch4k系数(16位HEX)
uintlocal_sid_2nd;
//本机SID_2:
(保留:
for基带干线!
ucharch4h_zero;
//高浓ch4零位值(8位HEX)
uintch4h_k;
//高浓ch4k系数(16位HEX)
uintctrl_id1;
//控制目标地址1(12位HEX)
uintctrl_id2;
//控制目标地址2(12位HEX)
uintctrl_id3;
//控制目标地址3(12位HEX)
uintctrl_id4;
//控制目标地址4(12位HEX)
uintch4_res_alm;
//ch4复电限(16位BCD)
floatcoeff;
//修正因数(onlyforch4l!
)
};
unionbrisbane//包含结构体的共用体!
{ucharram_blk[64];
structchillonram_var;
unionbrisbaneram_para;
//flash参数在ram中的映射
uintmaster_sid=0X0101;
//中心站SID
uintrev_sid;
//can_bus:
RXB0接收到的SID
uintrev_did;
RXB0接收到的DID
ucharrev_dat[8];
RXB0接收到的数据域
ucharsimul_test_set=0X0;
//'
模拟断电/报警命令'
设置变量
uintch4l_calib_gas;
//低浓ch4标定气样值(16位BCD)
uintch4h_calib_gas;
//高浓ch4标定气样值(16位BCD)
ucharch4_alarm_flag;
//ch4报警标志:
(D0=1:
报警,D1=1:
断电)
ucharkout_flag;
//开出控制重复确认标志:
(D0=1:
ucharkout_cunt;
//开出控制重复确认计数变量
ucharch4_state_flag;
//ch4状态标志(for横向发送命令)
//ucharprotect_proc=0X0;
//探头保护进程标志变量
//ucharprotect_tmr=0X0;
//探头保护定时计数变量
//ucharwarm_up_cunt;
//ch4切换预热计数
ucharswt_cunt;
//ch4切换计时
ucharch4_switch_state;
//ch4切换状态变量:
00h=低浓测量,01h=低->
高过渡
//02h=高->
低过渡,03h=高浓测量
uintupload_ch4l_data;
//ch4l:
0~4%-->
0~4095
uintupload_ch4h_data;
//ch4h:
0~40%-->
uintupload_ch4;
//FORCAN_BUS上传!
(统一量程ch4:
0~4095)
//uintch4_data;
(ch4:
uintreal_ch4;
//ch4实测值!
uintoriginal_ch4;
//未经修正因数校正的ch4l值!
(0~40%-->
0~4095)
uintvtrk_data;
//Vtrk*(R/4R)分压-->
ADC(0~5v-->
0~1023)
persistentuintmid_fil_cache[5];
//中值滤波缓存
uintrank_cache[5];
//排序缓存
uintpeak_fil_cache;
//峰值滤波缓存
ucharpeak_fil_cunt;
//峰值滤波计数变量
uintepm_cfrm_cache[5][2];
//EEPROM数据校验缓存
ucharir_data;
//红外接收数据
ucharkey_cache[6];
uchar*key_ptr=key_cache;
ucharkey_proc;
uintfun_code;
//功能代码=0xxx(2字节)
ucharkey_comb;
//组合键标志
ucharkey_tmr_cunt;
//键盘超时检测定时计数变量(与定时中断配合!
ucharled_byte[4];
//LED显示缓存
uchardsp_work_cunt;
//LED翻屏显示定时计数变量
uchardsp_work_item;
ucharpara_send_cunt=0X1E;
//参数帧上传定时计数变量(定时=30s)
ucharupload_cunt;
//CAN_BUS数据上传定时计数变量
ucharfout_cunt;
//fout刷新计数变量
//******************************位变量定义**********************************
bitir_ok=0;
//1:
红外接收到有效值(红外中断+查询组合)
bitkey_working=0;
键盘操作进程中
bitkey_tmr_on=0;
键盘超时检测定时启动
bitfix_on=0;
检修状态启动
bitch4l_zero_on=0;
低浓ch4自动调零开始
bitch4h_zero_on=0;
高浓ch4自动调零开始
bitch4l_calib_on=0;
低浓ch4自动标定开始
bitch4h_calib_on=0;
高浓ch4自动标定开始
bitsend_ok_0=0;
//1:
CAN_BUS/TXB0组发送成功
bitpara_send_ok=0;
CAN_BUS/参数帧发送成功
bitmaster_ack_ok=0;
CAN_BUS/正确收到中心站ACK
bitcan_cmd_rev=0;
CAN_BUS接收到新命令帧(CAN/RXB0接收中断+查询组合)
bitalarm_flash=0;
//报警时LED闪烁
//bitpeak_fil_start=0;
峰值滤波开始
//bitir_beeper;
//Ir-->
Beeper控制标志位
bitsend_flip=0;
//横向发送切换标志位
//******************************函数声明************************************
voidport_initial(void);
//I/O口初始化函数
voidad_initial(void);
//ADC模块初始化
voidwdt_initial(void);
//WDT模块初始化
voidtmr0_initial(void);
//TMR0模块初始化
voidspi_initial(void);
//SPI模块初始化
voidpwm_initial(void);
//PWM模块初始化
voidcan_initial(void);
//CAN模块初始化
voidpwm_fout(void);
//频率输出
voidch4_alarm_chk(void);
//报警断电门限检测
voidkout_clr(void);
//开关量输出:
清0
voidkout_control(void);
//开关量输出控制
//voidprotect(void);
//探头保护
voidch4_switch_ctrl(void);
//高低浓切换控制
voidget_flash(void);
//读取flash_para-->
ram_para
voidflash_update(void);
//保存ram_para-->
flash_para
voidflash_wr_cycle(void);
//flash写时序周期
voidflash_erase(ulongflash_add);
//flash擦除操作
voidflash_wr(ulongflash_add,uchar*ram_data);
//flash写操作
ucharflash_rd(ulongflash_add);
//flash读操作
voidled_config(void);
//LED驱动芯片14489配置寄存器设定
voidled_dsp(void);
//LED驱动芯片14489显示寄存器设定
voiddsp_work(void);
//工作画面显示(温度/开入-->
切换显示)
voiddsp_ch4(void);
//ch4测量值显示
voiddsp_ok(void);
//显示:
YYY
voiddsp_nod(void);
ppp
voiddsp_fail(void);
FFF
voidir_rev(void);
//红外接收
voidkey_manage(void);
//键盘逻辑管理
voidkey_sync_execute(void);
//键盘命令处理及显示(同步于键盘操作中断)
uintadc_sample(ucharchannel);
//ADC采集
uintmid_filter(uintm);
//中值滤波
uintpeak_filter(uintn);
//峰值滤波
voidch4l_zero_auto(void);
//低浓ch4自动调零(900)
voidch4l_calib_auto(void);
//低浓ch4自动标定(909)
voidch4h_zero_auto(void);
//高浓ch4自动调零(910)
voidch4h_calib_auto(void);
//高浓ch4自动标定(919)
voidcan_send(ucharn);
//can_bus数据发送
voidsend_to_master_para(void);
//向中心站上传参数帧
voidsend_to_master_dat(void);
//向中心站上传ch4数据
voidsend_to_controller_dat(void);
//向断电控制器发送数据
voidsend_id_set(uintsend_sid,uintsend_did,ucharsend_type,ucharn);
//发送ID寄存器SFR设定
voidcan_send_LOW_ISR(uintsend_sid,uintsend_did,ucharsend_type,ucharn);
//自动标定同时can_bus数据发送(TMR0中断调用!
voidcan_opt_mode(ucharm);
//CAN:
改变CAN模块operationmode
voidcan_cmd_execute(void);
命令帧处理
voidcan_cmd_ack(void);
命令帧应答
ucharcompatible_state_code(ucharm);
//横向命令发送的第3字节兼容代码转换
voiddelay_ms(uintt);
//延时函数(单位:
ms)
voiddelay_us(uchart);
us)
voiddelay_ir_us(uchart);
us,红外接收中断专用)
voiddelay_ir(uchart);
voiddelay_LOW_ISR_ms(uintt);
ms,TMR0中断专用)
//*********************************************************
//主函数
voidmain()
{
uintm,n,t;
ulongp;
ulongtmp1,tmp2;
port_initial();
//I/O口初始化
kout_clr();
//4路开关量输出:
ad_initial();
wdt_initial();
tmr0_initial();
spi_initial();
pwm_initial();
get_flash();
//读取flash预存参数->
RAM变量
can_initial();
//CAN模块初始化
//是上电复位!
if(((RCON&
0X1F)==0X1C)&
&
(STKFUL==0)&
(STKUNF==0))
{asm("
clrwdt"
);
//WDT清0
delay_ms(500);
//延时500ms
asm("
//WDT清0
led_byte[0]=0XFF;
O
led_config();
led_byte[1]=0X80;
led_byte[2]=0X00;
led_byte[3]=0X70;
led_dsp();
led_byte[0]=0XD1;
ch41,2,3...
led_byte[1]=0X0C;
led_byte[2]=0X24;
led_byte[3]=0X00;
t=(uchar)(ram_para.ram_var.local_sid_1st)+60;
for(n=0;
n<
t;
n++)//延时local_sid_1st*500ms-->
开启3v开关电源
//再延时60*500ms-->
等待ch4l探头上电稳定
if((n%2)==0)
{led_byte[3]=led_byte[3]+0X10;
}
//ch4l3v开关电源=开启
if(n>
=(uchar)(ram_para.ram_var.local_sid_1st))
{pwr_3v_cs1=1;
}
}
5;
n++)//中值滤波缓存清0!
{mid_fil_cache[n]=0x0;
RCON=RCON|0X1F;