一、基本功能
1、检测设置点的烟雾、温度参数并用LCD1602实时显示;
2、手动设置阈值;
3、当检测参数超过限度时能及时进行声光报警;
二、原理图
系统采用AT89C51作为系统主控。
单片机P0口连接锁存器,锁存器连接8255A作为单片机的扩展。
P1口连接ADC0808 模数转换器,模拟烟雾传感器情况。
P2口连接各组件,包括报警指示灯、阈值调节按键读取…
P3口作为控制各端口。
8255A PA口连接LCD1602显示温度及烟雾数值。
PC口作为点阵的输入(未实现)。
三、程序
1、头文件及相关定义
//程序头函数
#include <reg52.h>
#include <display.h>
#include<intrins.h>
#include<ds18b20.h>
#include<absacc.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1 //定义P1口为Data_ADC0809
#define D8255 XBYTE[0x7f03] //8255控制口地址
#define D8255A XBYTE[0x7f00] //8255 PA口地址
#define D8255B XBYTE[0x7f01] //8255 PB口地址
#define D8255C XBYTE[0x7f02] //8255 PC口地址
//管脚声明
sbit LED_yanwu= P2^1; //烟雾报警灯
sbit LED_wendu= P2^2;
sbit baojing= P2^3; //蜂鸣器接口
//ADC0808
sbit ST=P3^4;
sbit EOC=P3^5;
sbit OE=P2^0;
//按键
sbit Key1=P2^4; //设置键
sbit Key2=P2^5; //加按键
sbit Key3=P2^6; //减按键
//含量变量
uchar temp_wendu;
uchar temp_yanwu;
uchar yushe_wendu=45; //用于读取ADC数据
uchar yushe_yanwu=45; //烟雾预设值4//按钮模式|
uchar Mode=0; //1是设置温度阀值 2是设置烟雾阀值
//函数声明
extern uchar ADC0809();
extern void Key();
//ADC0809读取信息
uchar ADC0809()
{
uchar temp_=0x00;
//初始化高阻态
OE=0;
//转化初始化
ST=0;
//开始转换
ST=1;
ST=0;
//外部中断等待AD转换结束
while(EOC==0)
//读取转换的AD值
OE=1;
temp_=Data_ADC0809;
OE=0;
return temp_;
}
void Key()
{
//模式选择
if(Key1==0) //设置按键
{
while(Key1==0);
if(Mode>=3) Mode=0;
else
{
write_com(0x0f);//打开显示 无光标 光标闪烁
Mode++; //模式加一
switch(Mode) //判断模式的值
{
case 1:
{
write_com(0x80+7);//为1时 温度阀值的位置闪烁
break; //执行后跳出switch
}
case 2: //当模式加到3时
{
write_com(0x80+13);
break;
}
case 3: //当模式加到3时
{
write_com(0x0c);//打开显示 无光标 无光标闪烁
Mode=0; //模式清零
break;
}
}
}
}
if(Key2==0 && Mode==1)// 给温度加一
{
while(Key2==0);
yushe_wendu++; //同温度阀值设置
write_com(0x80+7);
write_data(0x30+yushe_wendu/100);
write_data(0x30+yushe_wendu%100/10);
write_data(0x30+yushe_wendu%10);
write_com(0x80+7);
}
if(Key2==0 && Mode==2)//给烟雾加一
{
while(Key2==0);
yushe_yanwu++; //同温度阀值设置
write_com(0x80+13);
write_data(0x30+yushe_yanwu/100);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
write_com(0x80+13);
}
if(Key3==0&&Mode==1)//温度减一
{
while(Key3==0);
yushe_wendu--; //同上
if(yushe_yanwu<=0)
yushe_yanwu=0;
write_com(0x80+7);
write_data(0x30+yushe_wendu/100);
write_data(0x30+yushe_wendu%100/10);
write_data(0x30+yushe_wendu%10);
write_com(0x80+7);
}
if(Key3==0&&Mode==2)//烟雾减一
{
while(Key3==0);
yushe_yanwu--; //同上
if(yushe_yanwu<=0)
yushe_yanwu=0;
write_com(0x80+13);
write_data(0x30+yushe_yanwu/100);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
write_com(0x80+13);
}
}
2、主函数
/*******主函数*********/
void main()
{
Init1602(); //调用初始化显示函数
Init_Ds();
while(1) //进入循环
{
temp_yanwu=ADC0809(); //读取烟雾值
temp_wendu=Get_Tem();
Key(); //调用按键函数 扫描按键
if(Mode==0) //只有当模式为0时才会执行以下的阀值判断部分
{
Display_1602_wendu(yushe_wendu,temp_wendu);
Display_1602_yanwu(yushe_yanwu,temp_yanwu); //显示预设烟雾,烟雾值
if(temp_yanwu>=yushe_yanwu)
{
LED_yanwu=0; //烟雾指示灯亮
baojing=0;
}
if(temp_yanwu<yushe_yanwu)
{
LED_yanwu=1;
}
if(temp_wendu>=yushe_wendu)
{
LED_wendu=0;
baojing=0;
}
if(temp_wendu<yushe_wendu)
{
LED_wendu=1;
}
if(temp_yanwu<yushe_yanwu && temp_wendu<=yushe_wendu)
{
baojing=1; //停止报警
}
}
}
}
总结
资源获取:https://download.csdn.net/download/weixin_51306846/87134504?spm=1001.2014.3001.5501
或者
https://item.taobao.com/item.htm?ft=t&id=693838763431