完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
设计目标
总电路图 电源部分 电路供电可使用单个锂电池或外部5V供电,电路集成锂电池充电电路(TP4056),外部电源与锂电池供电自动切换,有外部供电时,使用外部电源,5V电源由SX1308经过升压得到,一个拨动开关控制系统电源(不控制锂电池充电,即系统未开,有外部供电也会对锂电池进行充电),3.3V由升压得到的5V经过稳压得到,火焰检测方向指示灯的电源可控,即可以控制指示灯是否显示。 四方向火焰检测 使用四个红外接收二极管作为火焰检测传感器,使用4路电压比较器LM339进行电压比较,检测到火焰输出低电平。可调整比较值VREF1,调整检测灵敏度。 烟雾与温度检测 烟雾检测使用MQ-2B烟雾传感器,温度使用NTC,分别设置比较阈值VREF2,VREF3,通过二路比较器LM393进行电压比较,输出端使用二极管来实现5V转3.3V。 软件设计 代码功能较为简单,有注释,就不多讲了。 #include "stm8l15x.h"//STM8L051/151公用库函数 #include "bsp_led.h" #include "stdio.h" void delay_us(u16 nCount); void delay_ms(u16 nCount); /********************************************************************************************************** * 函 数 名: delay_us * 功能说明: 微秒延时程序 * 形 参:nCount要延时的微秒数 * 返 回 值: 无 **********************************************************************************************************/ void delay_us(u16 nCount) { nCount *= 3; while (--nCount); } /********************************************************************************************************** * 函 数 名: delay_ms * 功能说明: 毫秒延时程序 * 形 参:nCount要延时的毫米数 * 返 回 值: 无 **********************************************************************************************************/ void delay_ms(u16 nCount) { while (nCount--) { delay_us(1000); } } void UART1_Send_byte(unsigned char byte) //发送一个8位的数据 { USART_SendData8(USART1, byte);//将接收到的数据发送出去 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } void UART1_Send_str(unsigned char *str) //发送字符串的数据 { while (*str) { UART1_Send_byte(*str); str++; } } //将有符合整数转换为字符串 char *itoa(int num, char *str, int radix) { char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //索引表 unsigned unum;//存放要转换的整数的绝对值,转换的整数可能是负数 int i = 0, j, k; //i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。 //获取要转换的整数的绝对值 if (radix == 10 && num < 0) //要转换成十进制数并且是负数 { unum = (unsigned) - num; //将num的绝对值赋给unum str[i++] = '-'; //在字符串最前面设置为'-'号,并且索引加1 } else unum = (unsigned)num; //若是num为正,直接赋值给unum //转换部分,注意转换后是逆序的 do { str[i++] = index[unum % (unsigned)radix]; //取unum的最后一位,并设置为str对应位,指示索引加1 unum /= radix; //unum去掉最后一位 } while (unum);//直至unum为0退出循环 str = ' |