|
本系統(tǒng)主要實(shí)現(xiàn)的功能為:溫度采集電路實(shí)時(shí)采集環(huán)境中的溫度,氣體監(jiān)測(cè)電路實(shí)時(shí)監(jiān)測(cè)環(huán)境中的可燃?xì)怏w(如甲烷、丙烷等),監(jiān)測(cè)到的溫度數(shù)據(jù)和可燃?xì)怏w數(shù)據(jù)通過相應(yīng)的傳感器轉(zhuǎn)換為模擬電信號(hào)送到AD轉(zhuǎn)換器中,AD轉(zhuǎn)換器將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)送到MCU中進(jìn)行處理,MCU根據(jù)AD轉(zhuǎn)換器送來的數(shù)字信號(hào)計(jì)算出溫度值和有害氣體濃度等級(jí)并送到顯示模塊進(jìn)行顯示,當(dāng)溫度值超過設(shè)定值時(shí),風(fēng)扇電路啟動(dòng)風(fēng)扇工作,當(dāng)可燃?xì)怏w濃度超過設(shè)定等級(jí)時(shí),報(bào)警電路啟動(dòng)蜂鳴器報(bào)警。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (22.39 KB, 下載次數(shù): 34)
下載附件
2018-10-23 04:52 上傳
0.png (5.71 KB, 下載次數(shù): 27)
下載附件
2018-10-23 04:52 上傳
單片機(jī)源程序如下:
- #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); //設(shè)置數(shù)據(jù)指針起點(diǎn)為第二行
- 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; //開風(fēng)扇
- }
- else
- {
- MOTOR_CS=1; //關(guān)風(fēng)扇
- }
-
- 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位數(shù)據(jù)端口、兩行顯示、5x7點(diǎn)陣字符
- LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06); //寫一個(gè)指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)為第一行第一個(gè)字符
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteCom
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的命令
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- void LcdWriteCom(uchar com) //寫入命令
- {
- LCD1602_E = 0; //使能
- LCD1602_RS = 0; //選擇發(fā)送命令
- LCD1602_RW = 0; //選擇寫入
-
- LCD1602_IO = com; //放入命令
- Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
- LCD1602_E = 1; //寫入時(shí)序
- Delay1ms(5); //保持時(shí)間
- LCD1602_E = 0;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteData
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
- * 輸 入 : dat
- * 輸 出 : 無
- *******************************************************************************/
- void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
- LCD1602_RW = 0; //選擇寫入
- LCD1602_IO = dat; //寫入數(shù)據(jù)
- Delay1ms(1);
- LCD1602_E = 1; //寫入時(shí)序
- Delay1ms(5); //保持時(shí)間
- 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個(gè)脈沖下沉之前DI端應(yīng)輸入2位數(shù)據(jù)用于選擇通道功能
- 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;
- }
復(fù)制代碼
所有資料51hei提供下載:
信息采集與處理-溫度和可燃?xì)怏w濃度采集模型.rar
(102.83 KB, 下載次數(shù): 189)
2018-10-22 21:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|