仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (16.3 KB, 下載次數: 39)
下載附件
2020-5-9 16:30 上傳
瓦斯傳感器放大輸出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)
2020-5-9 16:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|