收藏 分享(赏)

stm32f407 io 口模拟 驱动sht10 温湿度传感器 c程序.doc

上传人:cjc2202537 文档编号:175860 上传时间:2018-03-23 格式:DOC 页数:24 大小:125KB
下载 相关 举报
stm32f407   io 口模拟  驱动sht10 温湿度传感器 c程序.doc_第1页
第1页 / 共24页
stm32f407   io 口模拟  驱动sht10 温湿度传感器 c程序.doc_第2页
第2页 / 共24页
stm32f407   io 口模拟  驱动sht10 温湿度传感器 c程序.doc_第3页
第3页 / 共24页
stm32f407   io 口模拟  驱动sht10 温湿度传感器 c程序.doc_第4页
第4页 / 共24页
stm32f407   io 口模拟  驱动sht10 温湿度传感器 c程序.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、STM32F407 IO 口模拟 驱动 SHT10 温湿度传感器 C 程序#include “sys.h“#include “delay.h“#include “usart.h“#include “led.h“#include “beep.h“#include “key.h“#include “max5481.h“#include “stmflash.h“/#define uchar u8#define uint u16/long loop_coun = 0;int wiper_value = 0; int bug_tx_coun = 0;int bug_tx_once_flag = 1;vo

2、latile u32 bug_coun = 0;/虫子数量volatile char bug_coun_flag = 0;u8 BUG_F_Buffer4=/虫子个数存储数组0x00,0x00,0x00,0x00,;#define BUG_F_LENTH sizeof(BUG_F_Buffer)/数组长度#define SIZE (BUG_F_LENTH / 4) + (BUG_F_LENTH % 4)? 1 : 0)u8 bug_data_tempBUG_F_LENTH=0;int led_run_coun = 0;char all_active_on_off_flag = 0;int pu

3、mp_on_off_flag = 0;int mag_id_40_on_off_flag = 0;uint temp_data_a = 0;uint temp_data_b = 0;uint temp_data_c = 0;uint temp_data_d = 0;#define QITITANCE_ID 0X01/气体探测板的 id 号uchar get_co2_cmd_value_buffer=/得到 CO2 含量 QITITANCE_ID,0x03,0x00,0x00,/第 0 个寄存器0x00,0x01,/要读取的数据长度0x84,0x0A,/CRC;uchar get_o2_cmd_

4、value_buffer=/得到 氧气含量 QITITANCE_ID,0x03,0x00,0x01,/第 1 个寄存器0x00,0x01,/要读取的数据长度0xD5,0xCA,/CRC;uchar get_ph3_cmd_value_buffer=/得到 磷化氢 含量 QITITANCE_ID,0x03,0x00,0x02,/第 0 个寄存器0x00,0x01,/要读取的数据长度0x25,0xCA,/CRC;uchar get_3_gas_cmd_value_buffer8=/得到三种气体含量QITITANCE_ID,0x03,0x00,0x00,/第 0 个寄存器0x00,0x03,/要读取

5、的数据长度0x05,0xCB,/CRC;uchar temp_cmd_value_buffer=/临时数组QITITANCE_ID,0x03,0x02,0x00,0x00,;volatile int get_gas_coun = 0;struct SYS_3_GAS_VALUEint sys_co2;int sys_o2;int sys_ph3;sys_3_gas_value;int sys_co2 = 0;/325 代表为 3.25% 的含量int sys_o2 = 0;/205 代表为 20.5% 的含量int sys_ph3 = 0;/260 代表为 260ppm 的含量uchar ge

6、t_gas_crc_h_byte = 0;uchar get_gas_crc_l_byte = 0;uint get_gas_crc = 0;int rec_usart_1_data_judge_flag = 0;int zhu_base_time_coun = 0;/68 06 16 /01 03 00 00 00 03 05 CB /01 03 06 00 02 00 CA 00 00 78 8B int led_run_enable_active_flag = 0;int led_run_on_coun = 0;int rec_usart_2_data_judge_flag = 0;in

7、t led_run_uart_2_enable_on_flag = 0;int led_run_uart_2_coun = 0;uchar uart_2_crc_h_byte = 0;uchar uart_2_crc_l_byte = 0;u8 USART_TX_BUF100=/485 的发送数组0;u8 USART_TX_BUF_272=/网口的发送数组 64+8=72 个字节 前 8 个字节为 0 最后 1 个为 crc 值0;int dcf_is_on_coun = 0 ;/ 命令中 1 的个数 当大于 5 的时候,认为命令不合理,放弃执行int dcf_is_on_off_buffer

8、40=0;int led_run_uart_2_tx_coun = 0;int uart_2_tx_enable_led_flash_flag = 0;int led_bug_coun = 0;#define UART2_TIME_OUT_MIN_VALUE 600 / 默认 10 分钟 10*60int temp_dcf_id_v = 0;uint humidity_sys = 0;uint temp_sys = 0;float bug_parameter_humidity = 0.0;float bug_parameter_temperature = 0.0;uint test_a = 0

9、;uint test_b = 0;/qqqqqqqqqqqqqqqqqqqqqqq/void power_on_event(void)/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeint i;int led_flash_times = 2;/led 闪灯的次数for(i=0;i24) BUG_F_Buffer2 = (bug_coun16) BUG_F_Buffer1 = (bug_coun8) BUG_F_Buffer0 = (bug_coun0) STMFLASH_Write(FLASH_SAVE_ADDR,(u32*)BUG_F_Buffer,SIZE);void

10、cpu_soft_reset(void)NVIC_SystemReset();/软件复位/气体探测板 CRC16 计算函数unsigned short QITI_CRC_16(unsigned char*bufData,int nLength) unsigned short crc=0xFFFF; unsigned char j,Tmp=0; int i; for(i=0;i1; if(Tmp)crc=(crc0xA001); return crc; void set_bug_power_on_off(int pow_status)/0 关测虫板的电源 1 开测虫板的电源if( pow_sta

11、tus = 1 )set_el_mag_id_status(39,1);/39 路else if( pow_status = 0 )set_el_mag_id_status(39,0);void set_air_dcf_power_on_off(int pow_status)/0 关 空气电磁阀 的电源 1 开 空气电磁阀 的电源if( pow_status = 1 )set_el_mag_id_status(40,1);/40 路else if( pow_status = 0 )set_el_mag_id_status(40,0);void set_alarm_power_on_off(in

12、t pow_status)/0 关 警报器 的电源 1 开 警报器 的电源if( pow_status = 1 )set_el_mag_id_status(38,1);/38 路else if( pow_status = 0 )set_el_mag_id_status(38,0);void set_1_bug_dcf_power_on_off(int pow_status)/0 关 1 路电磁阀 的电源 1开 1 路电磁阀 的电源if( pow_status = 1 )set_el_mag_id_status(33,1);/33 路else if( pow_status = 0 )set_el

13、_mag_id_status(33,0);uchar GetCRC(uchar Arr,uint ArrStar,uint ArrNum)/西城科技的 crc 算法uint i;uchar crc=0,j;for (i=0;i1)0x8c; else crc=1;return crc;void uart_2_tx_fun(void)/网口 2 的发送函数 仅仅发送 72 个字节的数据int i = 0;uchar crc_temp = 0 ;USART_TX_BUF_20 = 0;USART_TX_BUF_21 = 0;USART_TX_BUF_22 = 0;USART_TX_BUF_23 =

14、 0;USART_TX_BUF_24 = 0;USART_TX_BUF_25 = 0;USART_TX_BUF_26 = 0;USART_TX_BUF_27 = 0;crc_temp = GetCRC(USART_TX_BUF_2,72-63-1,63);USART_TX_BUF_271 = crc_temp;/最后一个字节为 crc 值for(i=0;i 8) USART_TX_BUF_210 = (sys_o2 0) /o2USART_TX_BUF_211 = (sys_co2 8) USART_TX_BUF_212 = (sys_co2 0) /co2USART_TX_BUF_213 =

15、 (sys_ph3 8) USART_TX_BUF_214 = (sys_ph3 0) /ph3USART_TX_BUF_215 = (bug_coun 8) USART_TX_BUF_216 = (bug_coun 0) /bugUSART_TX_BUF_217 = 0x00;USART_TX_BUF_218 = 0x00;USART_TX_BUF_219 = 0x00;USART_TX_BUF_220 = 0x00;USART_TX_BUF_221 = 0x00;USART_TX_BUF_222 = 0x00;USART_TX_BUF_223 = 0x00;USART_TX_BUF_224

16、 = 0x00;USART_TX_BUF_225 = 0x00;USART_TX_BUF_226 = 0x00;USART_TX_BUF_227 = 0x00;USART_TX_BUF_228 = 0x00;USART_TX_BUF_229 = 0x00;USART_TX_BUF_230 = 0x00;USART_TX_BUF_231 = 0x00;USART_TX_BUF_232 = 0x00;USART_TX_BUF_233 = 0x00;USART_TX_BUF_234 = 0x00;USART_TX_BUF_235 = 0x00;USART_TX_BUF_236 = 0x00;USAR

17、T_TX_BUF_237 = 0x00;USART_TX_BUF_238 = 0x00;USART_TX_BUF_239 = 0x00;USART_TX_BUF_240 = 0x00;USART_TX_BUF_241 = 0x00;USART_TX_BUF_242 = 0x00;USART_TX_BUF_243 = 0x00;USART_TX_BUF_244 = 0x00;USART_TX_BUF_245 = 0x00;USART_TX_BUF_246 = 0x00;USART_TX_BUF_247 = 0x00;USART_TX_BUF_248 = 0x00;void get_gas_bug

18、_value_fun(void)int i = 0;/sys_o2 = 0;/sys_co2 = 0;/sys_ph3 = 0;/bug_coun = 0;/通过 485 口将命令发送出去 气体板接收for(i=0;i= (100 * 400) )/大于 400ms 就自动退出 这 400ms 包括气体板子向 stm32 发数据的时间get_gas_coun = 0;sys_co2 = 0;sys_o2 = 0;sys_ph3 = 0;/都为 0 说明是不正常的情况 USART_RX_COUN = 0;break;if( USART_RX_COUN = 1 )/485 收到任何一个字节的时候就

19、去判断if( rec_usart_1_data_judge_flag = 0 )usart_1_rec_end_loop+;/当有数据进入的时候 清 0 当该值大于某个值的时候 说明没有数据进入了,然后再去判断收到的数组if( usart_1_rec_end_loop = (100 * 10) )/10ms 不再收到数据的时候 认为数据接收完毕usart_1_rec_end_loop = 0;if(USART_RX_COUN = 11)/正好有 11 个字节的数据rec_usart_1_data_judge_flag = 1;/进入判断过程 elserec_usart_1_data_judge

20、_flag = 0;else if(rec_usart_1_data_judge_flag = 1)if( rec_usart_1_data_judge_flag = 1 )/判断 if( USART_RX_BUF0 = QITITANCE_ID ) /共接收 11 个字节的数据 后 2 个字节为 crc 值get_gas_crc_h_byte = ( get_gas_crc 8);get_gas_crc_l_byte = ( get_gas_crc 0);/crc 低字节在前 高字节在后/crc 正确if( USART_RX_BUF9 = get_gas_crc_l_byte ) sys_o

21、2 = (uint)USART_RX_BUF5 8) + USART_RX_BUF6;sys_ph3 = (uint)USART_RX_BUF7 8) + USART_RX_BUF8;else/crc 错误sys_co2 = 0;sys_o2 = 0;sys_ph3 = 0;else/清 0 接收缓冲区for(i=0;i200;i+)USART_RX_BUFi = 0;USART_RX_COUN = 0;/字节数清 0rec_usart_1_data_judge_flag = 0;get_gas_coun = 0;break;delay_ms(30);/必要的延时 可能由于 气体板硬件原因导致

22、/虫子数量由中断计算void clear_uart_1_rx_buffer(void)int i = 0;for(i=0;i200;i+)USART_RX_BUFi = 0;void clear_uart_2_rx_buffer(void)int i = 0;for(i=0;i200;i+)USART_RX_BUF_2i = 0;void clear_uart_1_tx_buffer(void)int i = 0;for(i=0;i200;i+)USART_TX_BUFi = 0;void clear_uart_2_tx_buffer(void)int i = 0;for(i=0;i200;i+)USART_TX_BUF_2i = 0;/sht10/温湿度传感器/由 51 单片机程序移植过来enum TEMP,HUMI;/这种类型写法比较不常用 enum 可以不指定对象名, 匿名枚举的作用等价于宏变量/enum TEMP=7,HUMIenvironment;/这是经常的用法 使用的时候如下 environment = TEMP;usart_1_send_data(environment); 而不是

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

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报