CANBUS 甲烷高低浓度传感器.docx

上传人:b****2 文档编号:12903107 上传时间:2023-04-22 格式:DOCX 页数:152 大小:51.68KB
下载 相关 举报
CANBUS 甲烷高低浓度传感器.docx_第1页
第1页 / 共152页
CANBUS 甲烷高低浓度传感器.docx_第2页
第2页 / 共152页
CANBUS 甲烷高低浓度传感器.docx_第3页
第3页 / 共152页
CANBUS 甲烷高低浓度传感器.docx_第4页
第4页 / 共152页
CANBUS 甲烷高低浓度传感器.docx_第5页
第5页 / 共152页
点击查看更多>>
下载资源
资源描述

CANBUS 甲烷高低浓度传感器.docx

《CANBUS 甲烷高低浓度传感器.docx》由会员分享,可在线阅读,更多相关《CANBUS 甲烷高低浓度传感器.docx(152页珍藏版)》请在冰豆网上搜索。

CANBUS 甲烷高低浓度传感器.docx

CANBUS甲烷高低浓度传感器

//***********************************************

//CAN_BUS甲烷高低浓度传感器

//PUMAOFONTARIO

//***********************************************

//************************************************说明***************************************************

//MCU:

PIC18F4580(自带CAN控制器)

//编译器:

HI_TECHPICC18V8.35

//CH4_45802006.4.3

//高级中断:

红外键入

//低级中断:

2秒TIMER_0;CAN接收;

//每2秒经比较后向主机发送CH4值,若6秒未发则必须发一次

//TXB0---向主机送数据,源节点为SID=LOCALAD,目标节点为DID=0X101,数据在TXB0D0:

1=fs_data中,2个字节

//TXB1---横向送数据,源节点为SID=LOCALAD,目标节点为DID,据在TXB1D0:

1中,2个字节

//TXB2---向主机送参数表,源节点为SID=LOCALAD,目标节点为DID=0X101,数据在TXB2D0:

7中,8个字节,字节长度=9

//CH4经与报警、断电门限比较后向控制器发控制信号,放在TXB1中

//每隔4秒钟向控制器(横向)发一次联络信号(数据长度=0),表示CH4传感器通讯正常

//TRKVOLT可测得

//控制目标(也是数据发送目标)可有4个:

DID1、DID2、DID3、DID4

//**********************************************************************************************************

#include"stdlib.h"

#include"math.h"

#include"stdio.h"

#include"pic18.h"

#include"delay.h"

#defineucharunsignedchar

#defineuintunsignedint

#defineushortunsignedshort

#defineulongunsignedlong

#defineCANCONCANCON_0//pic18f4580.h中定义CANCON_0,CANSTAT_0

#defineCANSTATCANSTAT_0

//常数(CAN-->OPERATIONMODE:

#defineCONFIG0X80//CANBUS配置模式

#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;//can_bus:

RXB0接收到的DID

ucharrev_dat[8];//can_bus:

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:

报警,D1=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%-->0~4095

uintupload_ch4;//FORCAN_BUS上传!

(统一量程ch4:

0~40%-->0~4095)

//uintch4_data;//FORCAN_BUS上传!

(ch4:

0~4%-->0~4095)

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;//1:

键盘操作进程中

bitkey_tmr_on=0;//1:

键盘超时检测定时启动

bitfix_on=0;//1:

检修状态启动

bitch4l_zero_on=0;//1:

低浓ch4自动调零开始

bitch4h_zero_on=0;//1:

高浓ch4自动调零开始

bitch4l_calib_on=0;//1:

低浓ch4自动标定开始

bitch4h_calib_on=0;//1:

高浓ch4自动标定开始

bitsend_ok_0=0;//1:

CAN_BUS/TXB0组发送成功

bitpara_send_ok=0;//1:

CAN_BUS/参数帧发送成功

bitmaster_ack_ok=0;//1:

CAN_BUS/正确收到中心站ACK

bitcan_cmd_rev=0;//1:

CAN_BUS接收到新命令帧(CAN/RXB0接收中断+查询组合)

bitalarm_flash=0;//报警时LED闪烁

//bitpeak_fil_start=0;//1:

峰值滤波开始

//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);//CAN:

命令帧处理

voidcan_cmd_ack(void);//CAN:

命令帧应答

ucharcompatible_state_code(ucharm);//横向命令发送的第3字节兼容代码转换

voiddelay_ms(uintt);//延时函数(单位:

ms)

voiddelay_us(uchart);//延时函数(单位:

us)

voiddelay_ir_us(uchart);//延时函数(单位:

us,红外接收中断专用)

voiddelay_ir(uchart);//延时函数(单位:

us,红外接收中断专用)

voiddelay_LOW_ISR_ms(uintt);//延时函数(单位:

ms,TMR0中断专用)

//*********************************************************

//主函数

//*********************************************************

voidmain()

{

uintm,n,t;

ulongp;

ulongtmp1,tmp2;

port_initial();//I/O口初始化

kout_clr();//4路开关量输出:

清0

ad_initial();//ADC模块初始化

wdt_initial();//WDT模块初始化

tmr0_initial();//TMR0模块初始化

spi_initial();//SPI模块初始化

pwm_initial();//PWM模块初始化

get_flash();//读取flash预存参数->RAM变量

can_initial();//CAN模块初始化

//是上电复位!

if(((RCON&0X1F)==0X1C)&&(STKFUL==0)&&(STKUNF==0))

{asm("clrwdt");//WDT清0

delay_ms(500);//延时500ms

asm("clrwdt");//WDT清0

delay_ms(500);//延时500ms

asm("clrwdt");//WDT清0

led_byte[0]=0XFF;//显示:

O

led_config();

led_byte[1]=0X80;

led_byte[2]=0X00;

led_byte[3]=0X70;

led_dsp();

asm("clrwdt");//WDT清0

delay_ms(500);//延时500ms

asm("clrwdt");//WDT清0

delay_ms(500);//延时500ms

asm("clrwdt");//WDT清0

led_byte[0]=0XD1;//显示:

ch41,2,3...

led_config();

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开启3v开关电源

{asm("clrwdt");//WDT清0

//再延时60*500ms-->等待ch4l探头上电稳定

if((n%2)==0)

{led_byte[3]=led_byte[3]+0X10;

led_dsp();

}

//ch4l3v开关电源=开启

if(n>=(uchar)(ram_para.ram_var.local_sid_1st))

{pwr_3v_cs1=1;}

delay_ms(500);

}

for(n=0;n<5;n++)//中值滤波缓存清0!

{mid_fil_cache[n]=0x0;}

}

RCON=RCON|0X1F;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1