43 基于单片机的温度和烟雾检测

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DS18B20读取温度,滑动变阻器链接ADC0832数模转换模拟烟雾,
通过lcd1602显示屏显示,
超过阈值则对应的led灯亮起,蜂鸣器报警

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

复制代码
#include <REGX52.H>#include<intrins.h>#include<stdio.h>#include "Delay.h"#include "LCD1602.h"#define uchar unsigned char#define uint unsigned  intsbit DS=P2^4;                 //DS18B20温度传感器sbit CS=P1^0;                 //adc0832引脚sbit CLK=P1^1;
sbit DIO=P1^2;           
sbit led1 = P1^3;
sbit led2 = P1^4;
sbit beep = P3^0;typedef unsigned char u8;typedef unsigned int  u16;static uint temp;static float ftemp = 0.0f;//温度转变uint temp;static unsigned char num;static int wdyz=60,mqyz=80;  
double u1,u;static int flag1=0,flag2=0,flag3=0;void tmpchange();uint tmp();void beep\_warning();void ajpd();void Time0\_Init()          //定时器初始化{
TMOD = 0x01;           //定时器0工作在方式1    IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5msTR0=1;                 //定时器开始EA=1;
}void Time0_Int() interrupt 1 //中断程序{
   TH0  = 0xfe;             //重新赋值
   TL0  = 0x33;
    num++;	if(num==200)
	{	    tmpchange();        //让18b20开始转换温度
	    temp = tmp();       //读取温度
	    ftemp = temp/10.0f; //转换温度
		num=0;
	}
}uchar get\_AD\_Res()            //ADC0832启动读取函数 有害气体{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	CLK=1;\_nop\_();
	
	CLK=0;DIO=0;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
	}
	CS=1;	
	return(data1 == data2)?data1:0;
}void dsreset(void)            //发出命令{
  uint i;
  DS=0;		              
  i=103;				   //将总线拉低480us~960us

  while(i>0)i--;
  DS=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
  i=4;					   //15us~60us等待
  while(i>0)i--;  //while(DS);}bit tmpreadbit(void)          //读取数据{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;   return (dat);
}uchar tmpread(void)           //读取数据{
  uchar i,j,dat;
  dat=0;  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }  return(dat);
}void tmpwritebyte(uchar dat)  //传输数据给DS18B20{
  uint i;
  uchar j;
  bit testb;  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}void tmpchange(void)          //DS18B20开始工作{  dsreset();  Delay(1);  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);  
}					  
uint tmp()                    //获得温度{  float tt;
  uchar a,b;  dsreset();  Delay(1);  tmpwritebyte(0xcc);  tmpwritebyte(0xbe);
  a=tmpread();//低八位
  b=tmpread();//高八位
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
  temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
  return temp;
}void beep_warning() //温度传感器蜂鸣器警报并且电机转动{	if(ftemp>wdyz)
	{
		flag1 = 1;
		led1 = 1;
	}	else if(ftemp<=wdyz)
	{
		flag1 = 2;
		led1 = 0;
	}	if(u1 > mqyz)
	{
		flag2 = 1;
		led2 = 1;
	}	else if(u1<=mqyz)
	{
		flag2 = 2;
		led2 = 0;
	}
	
	flag3 = flag1 * flag2;	if(flag3 == 1)
	{
		beep = 0;
	}	else if(flag3 == 2)
	{
		beep = 0;
	}	else if(flag3 == 4)
	{
		beep = 1;
	}
	
}void main()					  //主函数{	
	LCD_Init();         //显示屏初始化
	Time0\_Init();	LCD\_ShowString(1,1,"wendu:");	LCD_ShowString(2,1,"mq:");
	beep = 1;	while(1)
	{
		u=get\_AD\_Res(); //MQ
		u1 = (u/255)*120;	  LCD_ShowNum(1,7,ftemp,2); //第一行显示温度
		LCD\_ShowNum(2,4,u1,3);	  beep\_warning(); //温度、电压、电流超出报警
	}	
}

四、实现现象

具体动态效果看B站演示视频:

B站演示视频

基于单片机的温度和烟雾检测

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘资料下载https://pan.baidu.com/s/1oj18qZZfbRD4edT3ZQD62Q?pwd=4he2

相关推荐
cjy_Somnr1 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰2 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤4 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟6 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞6 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲7 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up7 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技16 小时前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
单片机日志17 小时前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣18 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法