硬件设计
(末尾附文件)
原理图:
仿真图:
程序设计
//程序头函数
#include <reg52.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
//管脚声明
//输出
sbit LED_wenduH= P1^2; //温度上限
sbit LED_wenduL= P1^3; //温度下限
sbit LED_yanwu = P1^4; //烟雾
sbit LED_LED = P1^1; //开灯
sbit baojing= P2^3; //报警
//输入
sbit DQ = P2^0; //18b20
sbit door=P1^6; //霍尔传感器
sbit hongwai=P1^7; //热释电
sbit light=P1^5; //光线传感器
//1602_245
sbit CE_1602=P1^0; //245的CE
//ADC0809
sbit ST=P2^7;
sbit EOC=P2^6;
sbit OE=P2^5;
//按键
sbit owner=P3^4; //主人是否在家切换
sbit Key1=P3^5; //设置
sbit Key2=P3^6; //加
sbit Key3=P3^7; //减
//LCD管脚声明
sbit LCDRS = P3^2;
sbit LCDEN= P3^3;
//LCD数组
uchar code Init1[] ="T: C E: "; //第一行固定显示
uchar code Init2[] =" Stay at home "; //第二行主人在家时显示
uchar code tab0[] ="TH: C TL: C "; //第二行设置温度上下限时显示
uchar code tab1[] ="EH: "; //第二行设置烟雾上限是显示
uchar code tab2[] ="Someone to enter"; //第二行有人进入触发报警时显示
uchar code tab3[] ="Master go out "; //主人外出时显示
bit bdata flag_owner,BJ,shanshuo;
uchar Mode=0,m;
signed char w; //温度值全局变量
uint c; //温度值全局变量
bit bdata flag=0,flag_BJ,flag_set;
//酒精含量变量
uchar temp; //酒精值
uchar wendu_H=28; //温度值上限
uchar wendu_L=15; //温度值下限
uchar yanwu_H=50; //烟雾上限
//函数声明
extern uchar ADC0809();
extern void Key();
//LCD延时
void LCDdelay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
P0=0xff;
CE_1602=0; //液晶工作时,CE置0,245向液晶传输数据
LCDRS=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
CE_1602=1; //传输完后置高电平
P0=0xff;
}
//写数据
void write_data(uchar date)
{
P0=0xff;
CE_1602=0;
LCDRS=1;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
CE_1602=1;
P0=0xff;
}
//1602初始化// 显示屏幕
void Init1602()
{
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80);//设置位置
for(i=0;i<16;i++)
{
write_data(Init1[i]);
}
write_com(0x80+0x40);//设置位置
for(i=0;i<16;i++)
{
write_data(Init2[i]);
}
}
//配合写程序实现显示温度和烟雾在屏幕上,分模式
void Display_1602()
{ uchar i;
//时时温度
write_com(0x80+2); //指定第一行第二列
write_data(0x30+c/100); //开始显示温度值的百位,。例如温度值时123,123除以100的商是1,显示的就是1,+0x30的目的是得到液晶中数字的显示码
write_data(0x30+c%100/10); //123除以100的余数是23,23再除以10得到的商是2,这里显示的就是2
write_data('.'); //显示小数点
write_data(0x30+c%10); //23除以10的余数是3,这里显示的就是3
write_data(0xdf); //显示°
//时时烟雾
write_com(0x80+13);
write_data(0x30+temp/100);
write_data(0x30+temp%100/10);
write_data(0x30+temp%10);
if(flag_owner==0) //主人在家时
{
write_com(0x80+0x40);//设置位置
if (Mode==0) //不是设置状态时 0
for(i=0;i<16;i++) //正常显示
write_data(Init2[i]);
else if(Mode==1||Mode==2)//设置状态时 1,2
{
for(i=0;i<3;i++) //显示上限值
write_data(tab0[i]);
if(shanshuo==0||Mode==2)
{
write_data(0x30+wendu_H/10);
write_data(0x30+wendu_H%10);
}
else if(shanshuo==1&&Mode==1) //shanshuo控制字符闪烁 1
{
write_data(' ');
write_data(' ');
}
write_data(0xdf); //显示°
for(i=6;i<11;i++)
write_data(tab0[i]); //显示下限
if(shanshuo==0||Mode==1)
{
write_data(0x30+wendu_L/10);
write_data(0x30+wendu_L%10);
}
else if(shanshuo==1&&Mode==2)
{
write_data(' ');
write_data(' ');
}
write_data(0xdf); //显示°
write_data('C'); //显示字母C
write_data(' '); //空格
}
else if(Mode==3) //设置烟雾报警值
{ write_com(0x80+0x40); //设置位置
for(i=0;i<3;i++)
write_data(tab1[i]);
if(shanshuo==0)
{
write_data(0x30+yanwu_H/100);
write_data(0x30+yanwu_H%100/10);
write_data(0x30+yanwu_H%10);
}
else if(shanshuo==1&&Mode==3)
{
write_data(' ');
write_data(' ');
write_data(' ');
}
for(i=6;i<16;i++)
write_data(tab1[i]);
}
}
else if(flag_owner==1) //主人外出
{
write_com(0x80+0x40);//设置位置
if(flag_BJ==0)
for(i=0;i<16;i++)
write_data(tab3[i]);
if(flag_BJ==1)
for(i=0;i<16;i++)
write_data(tab2[i]);
}
}
//1ms延时程序
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
/*****18b20延时子程序*****///
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****初始化DS18B20*****///
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay_DS18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_DS18B20(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay_DS18B20(14);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****///
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
}
}
.
文件仅供参考
链接:https://pan.baidu.com/s/13EOTQo611sjVsQhhL_QhgQ
提取码:vhvt
.