硬件设计
链接:https://pan.baidu.com/s/1ic90ETnjQcvKt2xm1ihWQA
提取码:txvn
代码设计
/*烟雾检测系统程序,单片机通过ADC0808检测3路烟雾传感器信号,并通过液晶显示,超过设定门限就声光报警*/
#include<reg52.h>
#include "LCD1602.h"
#include "da1302.h"
unsigned int i;
unsigned int j;
unsigned char V_getdata1; //传感器电压采集变量
unsigned long V_temp1,alarm_temp;//传感器电压采集变量和设定报警值
unsigned int alarm,speak;
unsigned char V_temp1Buffer[10],alarm_tempBuffer[10];
SYSTEMTIME CurrentTime ; //建立时间结构体
unsigned char count;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit AD_CLK=P3^3; //ADC0809时钟
sbit ADDA=P3^4; //ADC0809选择通道口
sbit ADDB=P3^5;
sbit ADDC=P3^6;
sbit ALARM=P3^7;
sbit key1=P2^3; //加1按钮
sbit key2=P2^4; //减1按钮
void TimeInitial();
void Delay(unsigned int i);
void TimeInitial() //系统时钟初始化
{ TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
}
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
/******************************************/
/* LCD 显示转换字符程序 */
/******************************************/
void IntToStr(unsigned int t, unsigned char *str, unsigned char n) //将整型数据转换成字符指针,在液晶上显示
{
unsigned char a[3]; char i, j;
a[0]=(t/100)%10;
a[1]=(t/10)%10;
a[2]=(t/1)%10;
for(i=0; i<3; i++) //转成ASCII码
a[i]=a[i]+'0';
for(i=0; a[i]=='0' && i<=3; i++);
for(j=3-n; j<i; j++) //填充空格
{ *str=' '; str++; }
for(; i<3; i++)
{ *str=a[i]; str++; } //加入有效的数字
*str='\0';
}
/******************************************/
/* 延时子程序 */
/******************************************/
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
/******************************************/
/* AD转换程序 */
/******************************************/
void Voltaget_AD1() //第一路电压AD采样 IN0
{
ST=0;
OE=0;
ST=1;
ST=0;
ADDA=0; //000设置A采样端口IN0
ADDB=0;
ADDC=0;
while(EOC==0); //等待转换结束
OE=1; //允许转换输出
V_getdata1=P0; //读取转换结果8位二进制数
OE=0;
V_temp1=V_getdata1*1.0/255*500; //对采样结果进行常规变换
V_getdata1=0;
Delay(10);
}
void main()
{
V_getdata1=0;
V_temp1=0; //传感器采集变量
ALARM=0; //报警信号
alarm_temp=250; //初始化报警门限值250,对应电压为2.5V
TimeInitial();
LCD_Initial(); //液晶屏初始化
GotoXY(0,0); //定位液晶显示位置第一行第一列
Print("The 1602 COUNTER"); //系统开机显示logo
GotoXY(0,1);
Print(" BY BF-SHNU ");
Delay1ms(1000);
GotoXY(0,0);
Print(" "); //清空液晶屏
GotoXY(0,1);
Print(" ");
while(1)
{
Voltaget_AD1(); //电压采样一通道
Delay(10);
IntToStr(V_temp1,&V_temp1Buffer[0],3); //将采集到的电压数转换为液晶显示字符
IntToStr(alarm_temp,&alarm_tempBuffer[0],3); //将采集到的电压数转换为液晶显示字符alarm_tempBuffer[10]
GotoXY(0,0); //设定液晶显示的位置,第1列第1行
Print("WSND:"); //第一路采集瓦斯浓度:
Print(&V_temp1Buffer[0]); //显示采集码值
Print("/10000");
GotoXY(0,1); //设定液晶显示的位置,第1列第2行
Print("ALARM:"); //第一路采集瓦斯浓度:
Print(&alarm_tempBuffer[0]); //显示采集码值
Print("/10000");
Delay1ms(7);
if(key1==0) //报警值加1按钮
{
Delay1ms(10); //按钮消抖动
while(key1==0); //等待按键松开
alarm_temp=alarm_temp+10; //报警值加1
}
if(key2==0) //报警值减1按钮
{
Delay1ms(10); //按钮消抖动
while(key2==0); //等待按键松开
alarm_temp=alarm_temp-10; //报警值加1
}