仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
瓦斯传感器放大输出0~70MV,放大51倍后为0~3.57V
0~3.57V对应单片机采样码值为0~357,精度0.2MV
- /*烟雾检测系统程序,单片机通过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
- }
-
-
- /*--------------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------------*/
- if(V_temp1>=alarm_temp) //判断是否超过设定门限,设定瓦斯传感器输出2.5V为报警判断值,对应码值为250
- {
- ALARM=1; //烟雾报警灯亮 ,蜂鸣器响
- }
- else ALARM=0;
- }
- }
- void t1(void) interrupt 3 using 0
- {
- TH1=(65536-200)/256;
- TL1=(65536-200)%256;
- AD_CLK=~AD_CLK;
- }
复制代码
全部资料51hei下载地址:
1400基于单片机的便携式瓦斯检测仪结题各项资料.rar
(111.15 KB, 下载次数: 75)
|