1.设计任务
基于单片机的厨房天然气泄漏检测报警系统设计
基本要求:能检测厨房内天然气泄漏,并报警。
创新:当厨房内烟雾、蒸汽达到设定值时同时报警。
任务区分:A——通过播放蜂鸣声音报警,频率不同,报警的含义不同。
2. 设计要求
2.1系统方案论证
根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。
2.2系统硬件电路设计
根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。
主函数
//³ÌÐòÍ·º¯Êý
#include <reg52.h>
#include <intrins.h>
//ÏÔʾº¯Êý
#include <display.h>
//ºê¶¨Òå
#define uint unsigned int
#define uchar unsigned char
//¹Ü½ÅÉùÃ÷
sbit LED_R= P2^2;
sbit LED_G= P2^0;
sbit FENG = P2^5;
sbit CS = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^3;
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;
unsigned char dat = 0; //
unsigned char CH=0; //
unsigned int sum=0; //
unsigned char m=0;
bit bdata flag; //
uchar set; //
uchar K_ZERO=40; //
void gaopin(void);
//º¯ÊýÉùÃ÷
extern void Key();
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
//CH4Ũ¶È±äÁ¿
uchar temp=0;
uchar WARNING=150; //
/****************************************************************************
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //³õʼ»¯
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 )
{
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0;
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ )
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++)
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test)
dat = test;
nop_();
CS = 1;
DATO = 1;
Clk = 1;
return dat;
}
void init()
{
TMOD=0x01; //
TL0=0xb0;
TH0=0x3c; //
EA=1; //
ET0=1; //
TR0=1; //
}
void AlcoholCalibration(void)
{
sum = 0;
for(m=0;m<50;m++)
{
sum = adc0832(0)+sum;
}
temp=sum/50;
K_ZERO = 500 * temp / 256;
Display_1602(0,WARNING);
}
void main()
{
Init1602(); //
init(); //
while(1)
{
for(m=0;m<50;m++)
sum = adc0832(0)+sum;
temp=sum/50;
if (temp > K_ZERO)
temp = temp - K_ZERO;
else
temp= 0;
sum=0; //
if(set==0) //
Display_1602(temp,WARNING); //
if(temp<WARNING&&set==0) //
{
flag=0; //
}
else if(temp>WARNING&&set==0)//
{
flag=1;
}
Key();
gaopin();
}
}
void Key()
{
if(Key1==0)
{
while(Key1==0);
FENG=0;
set++;
flag=0;
TR0=0;
}
if(set==1)
{
write_com(0x38);
write_com(0x80+0x40+8);
write_com(0x0f);//
write_com(0x06);//
FENG=1;
}
else if(set>=2)
{
set=0;
write_com(0x38);
write_com(0x0c);
FENG=1;
flag=1;
TR0=1;
}
if(Key2==0&&set!=0) //
{
while(Key2==0); //
FENG=0; //
WARNING++; //
if(WARNING>=255) //
WARNING=0; //
write_com(0x80+0x40+6);
write_data('0'+WARNING/100);
write_data('0'+WARNING%100/10);//
write_data('0'+WARNING%100%10);//
write_com(0x80+0x40+8);//λÖÃ
FENG=1; //
}
else if(Key2==0&&set==0)
{
AlcoholCalibration(); //
}
if(Key3==0&&set!=0) //
{
while(Key3==0);
FENG=0;
WARNING--;
if(WARNING<=0)
WARNING=255;
write_com(0x80+0x40+6);
write_data('0'+WARNING/100);
write_data('0'+WARNING/10%10);
write_data('0'+WARNING%10);
write_com(0x80+0x40+8);//
FENG=1;
}
}
void gaopin()
{
unsigned char i;
if(temp>170)
{
for(i=0;i<10;i++)
{
FENG=!FENG;
delay(100);
}
}
}
void time1_int(void) interrupt 1
{
uchar count;
TL0=0xb0;
TH0=0x3c;
count++;
if(count==10)
{
if(flag==0) //
{
LED_G=0;
LED_R=1;
FENG=1; //
}
if(flag==1)
{
LED_G=1;
LED_R=0;
FENG=0;
}
}
if(count==20)
{
count=0;
if(flag==0)
{
LED_G=1;
LED_R=1;
FENG=1;
}
if(flag==1)
{
LED_G=1;
仿真Proteus
完整代码点开链接私信 免费 获取。
【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa