基于51单片机的报警器(温度,烟雾,DS18B20,ADC0832)

请添加图片描述

烟雾报警器:
1、测量温度和烟雾浓度
2、温度超过上下限,报警;烟雾超过上限报警
3、通过按键设置报警值请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include "reg51.h"
#include "lcd1602.h"
#include"Ds18b20.h"
#include "ADC0832.h"
sbit k1=P1^0;					
sbit k2=P1^1;					
sbit k3=P1^2;
sbit beep=P2^3;//蜂鸣器				
uint time=0;					//定时

uchar xian1[]="Y:00% T:00 C";
uchar xian2[]="00% L:00 H:00";//参数

uchar wendu=0,yan=0;//温度
uchar lim1=50,lim2=10,lim3=30;//阀值
uchar mode=0;
//主函数
void main()
{
	xian1[10]=0xdf;
	init_1602();				//初始化LCD
	TMOD|=0X01;					//模式1
	TH0=0XFC;					//1ms
	TL0=0X18;	
	ET0=1;						//打开定时器0中断允许
	EA=1;						//打开总中断
	TR0=1;						//打开定时器
	while(1)
	{
		if(!k1)//设置
		{
			if(mode<3)
				mode++;
			else
				mode=0;
			while(!k1);
		}
		if(!k2)//加
		{
			if(mode==1)
			{
				if(lim1<99)
					lim1++;
			}
			if(mode==2)
			{
				if(lim2<lim3)
					lim2++;
			}
			if(mode==3)
			{
				if(lim3<99)
					lim3++;
			}
			while(!k2);
		}
		if(!k3)//减
		{
			if(mode==1)
			{
				if(lim1>0)
					lim1--;
			}
			if(mode==2)
			{
				if(lim2>0)
					lim2--;
			}
			if(mode==3)
			{
				if(lim3>lim2)
					lim3--;
			}
			while(!k3);
		}
	}
}
//定时器中断
void Timer0() interrupt 1		//定时器0中断
{
	uint i;
	if(time<300)//定时0.3s
		time++;
	else
	{
		time=0;
		wendu=Ds18b20ReadTemp();//测温
		i=ADC(1);
		yan=i*99/127;//烟雾
		//报警
		if((yan>lim1)||(wendu>lim3)||(wendu<lim2))
			beep=0;
		else
			beep=1;
		//显示
		xian1[2]=yan/10+0x30;
		xian1[3]=yan%10+0x30;
		xian1[8]=wendu/10+0x30;
		xian1[9]=wendu%10+0x30;
		xian2[0]=lim1/10+0x30;
		xian2[1]=lim1%10+0x30;
		xian2[6]=lim2/10+0x30;
		xian2[7]=lim2%10+0x30;
		xian2[11]=lim3/10+0x30;
		xian2[12]=lim3%10+0x30;
		write_string(1,0,xian1);
		write_string(2,0,xian2);
		//设置光标
		if(mode==1)
		{
			write_sfm(2,1);
		}
		if(mode==2)
		{
			write_sfm(2,7);
		}
		if(mode==3)
		{
			write_sfm(2,12);
		}
		if(mode==0)
		{
			 write_com(0x0c);
		}
		else
			write_com(0x0e);
	}
	TH0=0XFC;				   //1ms
	TL0=0X18;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的51单片机温度报警器汇编程序,使用DS18B20温度传感器,当温度超过设定值时,会触发蜂鸣器报警。 ``` ;******************************************************************************* ; 51单片机温度报警器汇编程序 ; 使用DS18B20温度传感器,当温度超过设定值时,会触发蜂鸣器报警。 ;******************************************************************************* ; 定义端口地址 sbit DQ=P3^7 ;DS18B20数据线 sbit beep=P1^5 ;蜂鸣器 ; 定义变量 temp db 0 ;存放温度值 flag db 0 ;用于判断是否超过设定值 ; 定义常量 set_temp equ 30 ;设定温度值 ;************************************* ; 主程序 ;************************************* main: mov beep, #1 ;初始化蜂鸣器 mov temp, #0 ;初始化温度值 mov flag, #0 ;初始化标志位 ;************************************* ; 初始化DS18B20 ;************************************* init_ds18b20: clr DQ ;将DQ拉低 mov r6, #100 ;延时1us loop1: djnz r6, loop1 setb DQ ;将DQ拉高 mov r6, #8 ;延时60us loop2: djnz r6, loop2 clr DQ ;将DQ拉低 mov r6, #100 ;延时1us loop3: djnz r6, loop3 setb DQ ;将DQ拉高 mov r6, #8 ;延时60us loop4: djnz r6, loop4 ;************************************* ; 读取温度值 ;************************************* read_temp: clr DQ ;将DQ拉低 mov r6, #100 ;延时1us loop5: djnz r6, loop5 setb DQ ;将DQ拉高 mov r6, #8 ;延时60us loop6: djnz r6, loop6 clr DQ ;将DQ拉低 mov r6, #100 ;延时1us loop7: djnz r6, loop7 setb DQ ;将DQ拉高 mov r6, #8 ;延时60us loop8: djnz r6, loop8 clr C ;读取温度值 mov A, #0 ;初始化A寄存器 mov r7, #8 ;读取8位温度值 loop9: clr C ;清除进位标志位 rlc A ;左移一位 mov DQ, #0 ;将DQ拉低 mov r6, #2 ;延时15us loop10: djnz r6, loop10 mov C, DQ ;将DQ的状态存入进位标志 mov DQ, #1 ;将DQ拉高 mov r6, #2 ;延时15us loop11: djnz r6, loop11 mov C, DQ ;将DQ的状态存入进位标志 mov DQ, #0 ;将DQ拉低 djnz r7, loop9 ;继续读取下一位 mov temp, A ;将温度值存入temp变量 ;************************************* ; 判断温度是否超过设定值 ;************************************* judge_temp: mov A, temp ;将温度值存入A寄存器 subb A, set_temp ;比较温度值和设定值 mov flag, CY ;将比较结果存入标志位 ;************************************* ; 报警 ;************************************* alarm: mov A, flag ;读取标志位 jz no_alarm ;温度未超过设定值,不报警 mov beep, #0 ;温度超过设定值,触发蜂鸣器报警 sjmp alarm ;循环报警 no_alarm: mov beep, #1 ;恢复蜂鸣器 sjmp main ;循环检测温度 ;************************************* ; 程序结束 ;************************************* end ``` 注意:此程序仅供参考,具体实现可能需要根据不同的硬件环境进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值