健康系统不能用怎么办,健康系统出不来了怎么办

首页 > 实用技巧 > 作者:YD1662023-10-29 05:15:12

二、MQ-2的工作原理
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。

健康系统不能用怎么办,健康系统出不来了怎么办(9)

5 部分核心代码

/** \file max30102.cpp ****************************************************** * * Project: MAXREFDES117# * Filename: max30102.cpp * Description: This module is an embedded controller driver for the MAX30102 * * Revision History: *\n 1-18-2016 Rev 01.00 GL Initial release. *\n */ #include "max30102.h" #include "myiic.h" #define max30102_WR_address 0xAE bool maxim_max30102_write_reg(uint8_t uch_addr, uint8_t uch_data) /** * \brief Write a value to a MAX30102 register * \par Details * This function writes a value to a MAX30102 register * * \param[in] uch_addr - register address * \param[in] uch_data - register data * * \retval true on success */ { /* 第1步:发起I2C总线启动信号 */ i2c_Start(); /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ i2c_SendByte(max30102_WR_address | I2C_WR); /* 此处是写指令 */ /* 第3步:发送ACK */ if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 第4步:发送字节地址 */ i2c_SendByte(uch_addr); if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 第5步:开始写入数据 */ i2c_SendByte(uch_data); /* 第6步:发送ACK */ if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 发送I2C总线停止信号 */ i2c_Stop(); return true; /* 执行成功 */ cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */ /* 发送I2C总线停止信号 */ i2c_Stop(); return false; } bool maxim_max30102_read_reg(uint8_t uch_addr, uint8_t *puch_data) /** * \brief Read a MAX30102 register * \par Details * This function reads a MAX30102 register * * \param[in] uch_addr - register address * \param[out] puch_data - pointer that stores the register data * * \retval true on success */ { /* 第1步:发起I2C总线启动信号 */ i2c_Start(); /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ i2c_SendByte(max30102_WR_address | I2C_WR); /* 此处是写指令 */ /* 第3步:发送ACK */ if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 第4步:发送字节地址, */ i2c_SendByte((uint8_t)uch_addr); if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 第6步:重新启动I2C总线。下面开始读取数据 */ i2c_Start(); /* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ i2c_SendByte(max30102_WR_address | I2C_RD); /* 此处是读指令 */ /* 第8步:发送ACK */ if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 第9步:读取数据 */ { *puch_data = i2c_ReadByte(); /* 读1个字节 */ i2c_NAck(); /* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */ } /* 发送I2C总线停止信号 */ i2c_Stop(); return true; /* 执行成功 返回data值 */ cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */ /* 发送I2C总线停止信号 */ i2c_Stop(); return false; } bool maxim_max30102_init(void) /** * \brief Initialize the MAX30102 * \par Details * This function initializes the MAX30102 * * \param None * * \retval true on success */ { if(!maxim_max30102_write_reg(REG_INTR_ENABLE_1, 0xc0)) // INTR setting return false; if(!maxim_max30102_write_reg(REG_INTR_ENABLE_2, 0x00)) return false; if(!maxim_max30102_write_reg(REG_FIFO_WR_PTR, 0x00)) //FIFO_WR_PTR[4:0] return false; if(!maxim_max30102_write_reg(REG_OVF_COUNTER, 0x00)) //OVF_COUNTER[4:0] return false; if(!maxim_max30102_write_reg(REG_FIFO_RD_PTR, 0x00)) //FIFO_RD_PTR[4:0] return false; if(!maxim_max30102_write_reg(REG_FIFO_CONFIG, 0x6f)) //sample avg = 8, fifo rollover=false, fifo almost full = 17 return false; if(!maxim_max30102_write_reg(REG_MODE_CONFIG, 0x03)) //0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED return false; if(!maxim_max30102_write_reg(REG_SPO2_CONFIG, 0x2F)) // SPO2_ADC range = 4096nA, SPO2 sample rate (400 Hz), LED pulseWidth (411uS) return false; if(!maxim_max30102_write_reg(REG_LED1_PA, 0x17)) //Choose value for ~ 4.5mA for LED1 return false; if(!maxim_max30102_write_reg(REG_LED2_PA, 0x17)) // Choose value for ~ 4.5mA for LED2 return false; if(!maxim_max30102_write_reg(REG_PILOT_PA, 0x7f)) // Choose value for ~ 25mA for Pilot LED return false; return true; } bool maxim_max30102_read_fifo(uint32_t *pun_red_led, uint32_t *pun_ir_led) /** * \brief Read a set of samples from the MAX30102 FIFO register * \par Details * This function reads a set of samples from the MAX30102 FIFO register * * \param[out] *pun_red_led - pointer that stores the red LED reading data * \param[out] *pun_ir_led - pointer that stores the IR LED reading data * * \retval true on success */ { uint32_t un_temp; uint8_t uch_temp; *pun_ir_led = 0; *pun_red_led = 0; maxim_max30102_read_reg(REG_INTR_STATUS_1, &uch_temp); maxim_max30102_read_reg(REG_INTR_STATUS_2, &uch_temp); /* 第1步:发起I2C总线启动信号 */ i2c_Start(); /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ i2c_SendByte(max30102_WR_address | I2C_WR); /* 此处是写指令 */ /* 第3步:发送ACK */ if (i2c_WaitAck() != 0) { printf("read fifo failed"); goto cmd_fail; /* EEPROM器件无应答 */ } /* 第4步:发送字节地址, */ i2c_SendByte((uint8_t)REG_FIFO_DATA); if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } /* 第6步:重新启动I2C总线。下面开始读取数据 */ i2c_Start(); /* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ i2c_SendByte(max30102_WR_address | I2C_RD); /* 此处是读指令 */ /* 第8步:发送ACK */ if (i2c_WaitAck() != 0) { goto cmd_fail; /* EEPROM器件无应答 */ } un_temp = i2c_ReadByte(); i2c_Ack(); un_temp <<= 16; *pun_red_led = un_temp; un_temp = i2c_ReadByte(); i2c_Ack(); un_temp <<= 8; *pun_red_led = un_temp; un_temp = i2c_ReadByte(); i2c_Ack(); *pun_red_led = un_temp; un_temp = i2c_ReadByte(); i2c_Ack(); un_temp <<= 16; *pun_ir_led = un_temp; un_temp = i2c_ReadByte(); i2c_Ack(); un_temp <<= 8; *pun_ir_led = un_temp; un_temp = i2c_ReadByte(); i2c_Ack(); *pun_ir_led = un_temp; *pun_red_led &= 0x03FFFF; //Mask MSB [23:18] *pun_ir_led &= 0x03FFFF; //Mask MSB [23:18] /* 发送I2C总线停止信号 */ i2c_Stop(); return true; cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */ /* 发送I2C总线停止信号 */ i2c_Stop(); return false; } bool maxim_max30102_reset() /** * \brief Reset the MAX30102 * \par Details * This function resets the MAX30102 * * \param None * * \retval true on success */ { if(!maxim_max30102_write_reg(REG_MODE_CONFIG, 0x40)) return false; else return true; }

//DHT11温湿度传感器部分 #include "reg52.h" #include "LCD1602.h" #include "intrins.h" //typedef unsigned char uchar; //typedef unsigned int uint; //定义变量 sbit Data=P3^6; uchar rec_dat[13];//用于保存接收到的数据组 void DHT11_delay_us(uchar n) { while(--n); } void DHT11_delay_ms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void DHT11_start() { Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(20); //延时18ms以上 Data=1; DHT11_delay_us(30); } uchar DHT11_rec_byte() //接收一个字节 { uchar i,dat=0; for(i=0;i<8;i ) //从高到低依次接收8位数据 { while(!Data); //等待50us低电平过去 DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //移位使正确接收8位数据,数据为0时直接移位 if(Data==1) //数据为1时,使dat加1来接收数据1 dat =1; while(Data); //等待数据线拉低 } return dat; } void DHT11_receive() //接收40位的数据 { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start(); if(Data==0) { while(Data==0); //等待拉高 DHT11_delay_us(40); //拉高后延时80us R_H=DHT11_rec_byte(); //接收湿度高八位 R_L=DHT11_rec_byte(); //接收湿度低八位 T_H=DHT11_rec_byte(); //接收温度高八位 T_L=DHT11_rec_byte(); //接收温度低八位 revise=DHT11_rec_byte(); //接收校正位 DHT11_delay_us(25); //结束 if((R_H R_L T_H T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } /*数据处理,方便显示*/ rec_dat[0]=RH/10 '0'; rec_dat[1]=(RH) '0'; rec_dat[2]='%'; rec_dat[3]='R'; rec_dat[4]='H'; rec_dat[5]=' '; rec_dat[6]=' '; rec_dat[7]=(TH/10) '0'; rec_dat[8]=(TH) '0'; rec_dat[9]='^'; rec_dat[10]='C'; } } void main() { //使用lcd1602显示数据 DHT11_receive(); lcd1602(rec_dat); }

// MQ-2烟雾传感器 unsigned char GetYanWuValue(void) { unsigned int sum=0; unsigned char m,value=0; for(m=0;m<20;m ) //读50次AD值 sum = adc0832(0) sum; //读到的AD值,将读到的数据累加到sum value=(unsigned char)(sum/20); //跳出上面的for循环后,将累加的总数除以50得到平均值value if(value > ADC_Zero) value = value - ADC_Zero; //首先减去零点漂移 else value = 0; return value; }

完整代码可进群免费领取。

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取:

健康系统不能用怎么办,健康系统出不来了怎么办(10)

健康系统不能用怎么办,健康系统出不来了怎么办(11)

上一页123末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.