1、CANBUS 甲烷高低浓度传感器 /* / CAN_BUS 甲烷高低浓度传感器 / PUMA OF ONTARIO /*/* 说明 */MCU:PIC18F4580 (自带CAN控制器)/编译器:HI_TECH PICC18 V8.35/CH4_4580 2006.4.3/高级中断: 红外键入/低级中断: 2秒TIMER_0;CAN接收;/每2秒经比较后向主机发送CH4值,若6秒未发则必须发一次/TXB0-向主机送数据,源节点为SID=LOCALAD, 目标节点为DID=0X101,数据在TXB0D0:1=fs_data中,2个字节/TXB1-横向送数据,源节点为SID=LOCALAD,目标节
2、点为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
3、#define uchar unsigned char #define uint unsigned int#define ushort unsigned short #define ulong unsigned long #define CANCON CANCON_0 /pic18f4580.h中定义CANCON_0,CANSTAT_0 #define CANSTAT CANSTAT_0 /常数(CAN-OPERATION MODE:)#define CONFIG 0X80 /CAN BUS 配置模式#define LISTEN 0X70 /CAN BUS 监听模式 #define SELF_
4、CHK 0X40 /CAN BUS 自检模式#define SHUT_OFF 0X20 /CAN BUS 关闭模式#define NORMAL 0X0 /CAN BUS 正常模式#define bitset(var,bitno) (var)|=1(bitno) #define bitclr(var,bitno) (var)&=(1ch4h 切换点/#define WARM_UP_VAL 3.5 /切换预热点 #define HtoL_SWT_VAL 2.8 /ch4h-ch4l 切换点/* 数据表定义(ROM)*/ const uchar TAB_MMSR=0XC3,0XDC,0XC2,0XE
5、B,0XCA,0XE4,0XC8,0XEB; /密码输入 /* 全局变量定义 (RAM) * struct chillon uchar cunt; uint local_sid_1st; /本机SID_1: (0xxxH, 12位HEX) uint ch4_low_alm; /ch4报警下限值 (16位BCD) uint ch4_high_alm; /ch4报警上限值 (16位BCD) uchar work_mode; /工作模式 (0=CH4, 1=CH4/T) uchar local_type; /本机TYPE (01H=CH4, 13H=CH4/T) uchar ch4l_zero; /
6、低浓ch4 零位值 (8 位HEX) uint ch4l_k; /低浓ch4 k系数 (16位HEX) uint local_sid_2nd; /本机SID_2: (保留:for基带干线!) uchar ch4h_zero; /高浓ch4 零位值 (8 位HEX) uint ch4h_k; /高浓ch4 k系数 (16位HEX) uint ctrl_id1; /控制目标地址1 (12位HEX) uint ctrl_id2; /控制目标地址2 (12位HEX) uint ctrl_id3; /控制目标地址3 (12位HEX) uint ctrl_id4; /控制目标地址4 (12位HEX) ui
7、nt ch4_res_alm; /ch4复电限 (16位BCD) float coeff; /修正因数 (only for ch4l !) ; union brisbane /包含结构体的共用体! uchar ram_blk64; struct chillon ram_var; ; union brisbane ram_para; /flash参数在ram中的映射 uint master_sid=0X0101; /中心站SID uint rev_sid; /can_bus:RXB0接收到的SID uint rev_did; /can_bus:RXB0接收到的DID uchar rev_dat8
8、; /can_bus:RXB0接收到的数据域 uchar simul_test_set=0X0; /模拟断电/报警命令设置变量 uint ch4l_calib_gas; /低浓ch4标定气样值(16位BCD) uint ch4h_calib_gas; /高浓ch4标定气样值(16位BCD) uchar ch4_alarm_flag; /ch4报警标志: (D0=1:报警, D1=1:断电) uchar kout_flag; /开出控制重复确认标志:(D0=1:报警, D1=1:断电) uchar kout_cunt; /开出控制重复确认计数变量 uchar ch4_state_flag; /c
9、h4状态标志 (for 横向发送命令) /uchar protect_proc=0X0; /探头保护进程标志变量 /uchar protect_tmr=0X0; /探头保护定时计数变量 /uchar warm_up_cunt; /ch4切换预热计数 uchar swt_cunt; /ch4切换计时 uchar ch4_switch_state; /ch4切换状态变量:00h=低浓测量,01h=低-高过渡 /02h=高-低过渡, 03h=高浓测量 uint upload_ch4l_data; /ch4l: 04%-04095 uint upload_ch4h_data; /ch4h: 040%-
10、04095 uint upload_ch4; /FOR CAN_BUS上传!(统一量程ch4: 040%-04095) /uint ch4_data; /FOR CAN_BUS上传!(ch4: 04%-04095) uint real_ch4; /ch4实测值! uint original_ch4; /未经修正因数校正的ch4l值! (040%-04095) uint vtrk_data; /Vtrk*(R/4R)分压-ADC (05v-01023) persistent uint mid_fil_cache5; /中值滤波缓存 uint rank_cache5; /排序缓存 uint pea
11、k_fil_cache; /峰值滤波缓存 uchar peak_fil_cunt; /峰值滤波计数变量 uint epm_cfrm_cache52; /EEPROM数据校验缓存 uchar ir_data; /红外接收数据 uchar key_cache6; uchar *key_ptr=key_cache; uchar key_proc; uint fun_code; /功能代码=0xxx (2字节) uchar key_comb; /组合键标志 uchar key_tmr_cunt; /键盘超时检测定时计数变量(与定时中断配合!) uchar led_byte4; /LED显示缓存 uch
12、ar dsp_work_cunt; /LED翻屏显示定时计数变量 uchar dsp_work_item; uchar para_send_cunt=0X1E; /参数帧上传定时计数变量 (定时=30s) uchar upload_cunt; /CAN_BUS 数据上传定时计数变量 uchar fout_cunt; /fout 刷新计数变量 /* 位变量定义 * bit ir_ok=0; /1:红外接收到有效值 (红外中断+查询组合) bit key_working=0; /1:键盘操作进程中 bit key_tmr_on=0; /1:键盘超时检测定时启动 bit fix_on=0; /1:检
13、修状态启动 bit ch4l_zero_on=0; /1:低浓ch4自动调零开始 bit ch4h_zero_on=0; /1:高浓ch4自动调零开始 bit ch4l_calib_on=0; /1:低浓ch4自动标定开始 bit ch4h_calib_on=0; /1:高浓ch4自动标定开始 bit send_ok_0=0; /1: CAN_BUS/TXB0组发送成功 bit para_send_ok=0; /1: CAN_BUS/参数帧发送成功 bit master_ack_ok=0; /1: CAN_BUS/正确收到中心站ACK bit can_cmd_rev=0; /1:CAN_BUS
14、接收到新命令帧 (CAN/RXB0接收中断+查询组合) bit alarm_flash=0; /报警时LED闪烁 /bit peak_fil_start=0; /1: 峰值滤波开始 /bit ir_beeper; /Ir-Beeper控制标志位 bit send_flip=0; /横向发送切换标志位 /* 函数声明 * void port_initial(void); /I/O口初始化函数 void ad_initial(void); /ADC 模块初始化 void wdt_initial(void); /WDT 模块初始化 void tmr0_initial(void); /TMR0模块初始
15、化 void spi_initial(void); /SPI 模块初始化 void pwm_initial(void); /PWM 模块初始化 void can_initial(void); /CAN 模块初始化 void pwm_fout(void); /频率输出 void ch4_alarm_chk (void); /报警断电门限检测 void kout_clr (void); /开关量输出:清0 void kout_control (void); /开关量输出控制 /void protect(void); /探头保护 void ch4_switch_ctrl (void); /高低浓切换
16、控制 void get_flash(void); /读取flash_para-ram_para void flash_update (void); /保存ram_para-flash_para void flash_wr_cycle (void); /flash写时序周期 void flash_erase (ulong flash_add); /flash擦除操作 void flash_wr (ulong flash_add, uchar *ram_data); /flash写操作 uchar flash_rd (ulong flash_add);/flash读操作 void led_conf
17、ig(void); /LED驱动芯片14489配置寄存器设定 void led_dsp(void); /LED驱动芯片14489显示寄存器设定 void dsp_work (void); /工作画面显示 (温度/开入-切换显示) void dsp_ch4 (void); /ch4测量值显示 void dsp_ok(void); /显示:YYY void dsp_nod(void); /显示:ppp void dsp_fail(void); /显示:FFF void ir_rev(void); /红外接收 void key_manage(void); /键盘逻辑管理 void key_sync_
18、execute(void); /键盘命令处理及显示 (同步于键盘操作中断) uint adc_sample (uchar channel); /ADC采集 uint mid_filter(uint m); /中值滤波 uint peak_filter (uint n); /峰值滤波 void ch4l_zero_auto (void); /低浓ch4自动调零 (900) void ch4l_calib_auto (void); /低浓ch4自动标定 (909) void ch4h_zero_auto (void); /高浓ch4自动调零 (910) void ch4h_calib_auto (
19、void); /高浓ch4自动标定 (919) void can_send (uchar n); /can_bus 数据发送 void send_to_master_para (void); /向中心站上传参数帧 void send_to_master_dat (void); /向中心站上传ch4数据 void send_to_controller_dat (void); /向断电控制器发送数据 void send_id_set (uint send_sid,uint send_did,uchar send_type,uchar n); /发送ID寄存器SFR设定 void can_send_
20、LOW_ISR (uint send_sid,uint send_did,uchar send_type,uchar n); /自动标定同时can_bus 数据发送 (TMR0中断调用!) void can_opt_mode(uchar m); /CAN:改变CAN模块operation mode void can_cmd_execute (void); /CAN:命令帧处理 void can_cmd_ack (void); /CAN:命令帧应答 uchar compatible_state_code (uchar m); /横向命令发送的第3字节兼容代码转换 void delay_ms(ui
21、nt t); /延时函数(单位:ms) void delay_us(uchar t); /延时函数(单位:us) void delay_ir_us(uchar t); /延时函数(单位:us,红外接收中断专用) void delay_ir(uchar t); /延时函数(单位:us,红外接收中断专用) void delay_LOW_ISR_ms(uint t); /延时函数(单位:ms,TMR0中断专用)/*/ 主函数/* void main() uint m,n,t; ulong p; ulong tmp1,tmp2; port_initial(); /I/O口初始化 kout_clr ()
22、; /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 as
23、m(clrwdt); /WDT 清0 delay_ms(500); /延时500ms asm(clrwdt); /WDT 清0 led_byte0=0XFF; /显示: O led_config(); led_byte1=0X80; led_byte2=0X00; led_byte3=0X70; led_dsp(); asm(clrwdt); /WDT 清0 delay_ms(500); /延时500ms asm(clrwdt); /WDT 清0 delay_ms(500); /延时500ms asm(clrwdt); /WDT 清0 led_byte0=0XD1; /显示:ch4 1,2,3
24、. led_config(); led_byte1=0X0C; led_byte2=0X24; led_byte3=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_byte3=led_byte3+0X10; led_dsp(); /ch4l 3v开关电源=开启 if (n=(uchar)(ram_para.ram_var.local_sid_1st) pwr_3v_cs1=1; delay_ms(500); for (n=0; n5; n+) /中值滤波缓存清0! mid_fil_cachen=0x0; RCON=RCON|0X1F;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1