基于51单片机便携式瓦斯监测仪protues仿真

硬件设计

链接: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
		}
		
		
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值