本系統主要實現的功能為:溫度采集電路實時采集環境中的溫度,氣體監測電路實時監測環境中的可燃氣體(如甲烷、丙烷等),監測到的溫度數據和可燃氣體數據通過相應的傳感器轉換為模擬電信號送到AD轉換器中,AD轉換器將模擬信號轉換為數字信號送到MCU中進行處理,MCU根據AD轉換器送來的數字信號計算出溫度值和有害氣體濃度等級并送到顯示模塊進行顯示,當溫度值超過設定值時,風扇電路啟動風扇工作,當可燃氣體濃度超過設定等級時,報警電路啟動蜂鳴器報警。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD1602_IO P0
- #define GPIO_MOTOR P1
- sbit LCD1602_RS=P2^0;
- sbit LCD1602_RW=P2^1;
- sbit LCD1602_E=P2^2;
- sbit ADC0832_CS=P1^5;
- sbit ADC0832_CLK=P1^6;
- sbit ADC0832_DO=P1^7; //將CS置高電平禁用芯片
- sbit MOTOR_CS=P2^3;
- sbit BUZZER_CS=P3^2;
- void Delay1ms(uint c);
- void LcdInit();
- void LcdWriteCom(uchar com);
- void LcdWriteData(uchar dat);
- uchar Get_AD_Result(bit channel);
- void Motor_stepper();
- uchar line1[]={'C','H','0',' ','T','E','P',':',' ','0','0','.','0',' ',0xdf,'C'};
- uchar line2[]={'C','H','1',' ','L','E','V','E','L',':',' ','0',' ',' ',' ',' '};
-
- void main(void)
- {
- uint i;
- double ADCdata,NTCr,t;
- int t_temp;
- bit channel;
- LcdInit();
- for(i=0;i<16;i++)
- {
- LcdWriteData(line1[i]);
- }
- LcdWriteCom(0x80|0x40); //設置數據指針起點為第二行
- for(i=0;i<16;i++)
- {
- LcdWriteData(line2[i]);
- }
- MOTOR_CS=1;
- BUZZER_CS=0;
- while(1)
- {
- channel = 0;
- ADCdata = Get_AD_Result(channel)*5.0/256;
- NTCr= 10*ADCdata/(5-ADCdata);
- t=1/(log(NTCr/10)/3900+1/(25+273.15))-273.15; //B=3435
-
- if(t>=25)
- {
- MOTOR_CS=0; //開風扇
- }
- else
- {
- MOTOR_CS=1; //關風扇
- }
-
- if(t<0)
- {
- line1[8]='-';
- t=-t;
- }
- else
- {
- line1[8]=' ';
- }
-
- t_temp=t*10;
- line1[9]=t_temp/100+'0';
- line1[10]=t_temp/10%10+'0';
- line1[12]=t_temp%10+'0';
- LcdWriteCom(0x80);
- for(i=0;i<16;i++)
- {
- LcdWriteData(line1[i]);
- }
- channel = 1;
- ADCdata = Get_AD_Result(channel)*5.0/256;
- if(ADCdata<=0.5)
- line2[11]='0';
- else if(ADCdata>0.5&&ADCdata<=1)
- line2[11]='1';
- else if(ADCdata>1&&ADCdata<=2)
- line2[11]='2';
- else if(ADCdata>2&&ADCdata<=3)
- line2[11]='3';
- else if(ADCdata>3&&ADCdata<=4)
- line2[11]='4';
- else
- line2[11]='5';
- if(ADCdata>1)
- BUZZER_CS=1;
- else
- BUZZER_CS=0;
- LcdWriteCom(0x80|0x40);
- for(i=0;i<16;i++)
- {
- LcdWriteData(line2[i]);
- }
- }
-
- }
- void Delay1ms(uint c) //誤差 0us
- {
- uint a,b;
- for (; c>0; c--)
- {
- for (b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
-
- }
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x38); //開顯示,8位數據端口、兩行顯示、5x7點陣字符
- LcdWriteCom(0x0c); //開顯示不顯示光標
- LcdWriteCom(0x06); //寫一個指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設置數據指針起點為第一行第一個字符
- }
- /*******************************************************************************
- * 函 數 名 : LcdWriteCom
- * 函數功能 : 向LCD寫入一個字節的命令
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- void LcdWriteCom(uchar com) //寫入命令
- {
- LCD1602_E = 0; //使能
- LCD1602_RS = 0; //選擇發送命令
- LCD1602_RW = 0; //選擇寫入
-
- LCD1602_IO = com; //放入命令
- Delay1ms(1); //等待數據穩定
- LCD1602_E = 1; //寫入時序
- Delay1ms(5); //保持時間
- LCD1602_E = 0;
- }
- /*******************************************************************************
- * 函 數 名 : LcdWriteData
- * 函數功能 : 向LCD寫入一個字節的數據
- * 輸 入 : dat
- * 輸 出 : 無
- *******************************************************************************/
- void LcdWriteData(uchar dat) //寫入數據
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //選擇輸入數據
- LCD1602_RW = 0; //選擇寫入
- LCD1602_IO = dat; //寫入數據
- Delay1ms(1);
- LCD1602_E = 1; //寫入時序
- Delay1ms(5); //保持時間
- LCD1602_E = 0;
- }
- uchar Get_AD_Result(bit channel)
- {
- uchar i;
- int data1=0x00,data2=0x00;
- ADC0832_CLK=0; //初始化
- ADC0832_DO=1;
- _nop_();
- ADC0832_CS=0;
- _nop_();
- ADC0832_CLK=1;
- _nop_();
- //在第2、3個脈沖下沉之前DI端應輸入2位數據用于選擇通道功能
- ADC0832_CLK=0; //通道第一位
- ADC0832_DO=1;
- _nop_();
- ADC0832_CLK=1;
- _nop_();
- ADC0832_CLK=0; //通道0的第二位
- ADC0832_DO=channel;
- _nop_();
- ADC0832_CLK=1;
- _nop_();
-
- ADC0832_CLK=0;
- ADC0832_DO=1;
- for(i=0;i<8;i++) //讀取前8位的值 先高位后低位
- {
- _nop_();
- data1<<=1;
- ADC0832_CLK=1;
- _nop_();
- ADC0832_CLK=0;
- if(ADC0832_DO)
- data1|=0x01;
- else
- data1|=0x00;
- }
- for(i=0;i<8;i++) //讀取后8位的值 先低位后高位
- {
- data2>>=1;
- if(ADC0832_DO)
- data2|=0x80;
- else
- data2|=0x00;
- _nop_();
- ADC0832_CLK=1;
- _nop_();
- ADC0832_CLK=0;
- }
- _nop_();
- ADC0832_CS=1; //將CS置高電平禁用芯片
- ADC0832_DO=1;
- ADC0832_CLK=1;
- return (data1 == data2) ? data1:0;
- }
復制代碼
所有資料51hei提供下載:
信息采集與處理-溫度和可燃氣體濃度采集模型.rar
(102.83 KB, 下載次數: 189)
2018-10-22 21:57 上傳
點擊文件名下載附件
|