1.整體需求分析
利用KL25實現環境溫度的智能控制,使周圍環境能夠在設定溫度上下限之間實現控制溫度調節.溫度傳感器檢測實時溫度,CPU通過所設定的溫度與之比較,進而控制加熱器加熱或者停止加熱.并在LCD上顯示
2. 溫濕度檢測的實現
系統發出讀溫濕度傳感器請求->DHT11開始采集數據->采集來的數據進行A/D轉換->轉換來的數據回復給系統
3.溫度升降控制怎么實現
系統每隔一段時間向DHT11請求溫濕度數據->比較當前溫度值是否大于預設值->大于則把PORTB 1pin 設置成高電平,驅動電機實施降溫,不大于則設置PORTB 1 pin 為低電平,關閉電機->等待下一個請求點
4.硬件邏輯框圖
硬件邏輯框圖說明
引腳說明
1pin:VDD 用于供電3-5.5VDC
2pin: DATA 接 MKL25 ?UART0_D
4pin: GND 接地,電源負極
電機M正極 接 MKL25 PORTB 1 pin
電機M負極 接地
5.軟件流程圖
軟件流程圖說明:
程序開始運行->將所需硬件設備初始化->用戶設定溫度->系統每隔一段時間向DHT11請求溫濕度數據->比較當前溫度值是否大于預設值->大于則把PORTB 1pin 設置成高電平,驅動電機實施降溫,不大于則設置PORTB 1 pin 為低電平,關閉電機->等待下一個請求點
6.MKL25設計構件
(1) my.h
//==================================================
#ifndef MY_H_
#define MY_H_
#include "common.h"
#include "gpio.h"
#include "light.h"
#include "uart.h"
#include "sysinit.h"
#include "lcd.h"
#include "kb.h"
#include "tpm.h"
#include "led.h"
#define FAN_PORT PORTB //風扇使用的端口
#define FAN_PIN 1 //風扇使用的引腳
void Fan_Control(uint_8 port, uint_8 pin, uint_8 state);
void DHT11_delay_us(uchar n) ;
void DHT11_delay_ms(uint z) ;
void DHT11_start() ;
int DHT11_receive() ;
void My() ;
(2) my.c
#include “my.h” //包含總頭文件
void Fan_Control (uint_8 port, uint_8 pin, uint_8 state)
{
gpoi_init(port, pin, 1, state)
gpio_set(port, pin, state);
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(20); //延時18ms以上
Data=1;
DHT11_delay_us(30);
}
int DHT11_receive() //接收40位的數據
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延時80us
R_H=DHT11_rec_byte(); //接收濕度高八位
R_L=DHT11_rec_byte(); //接收濕度低八位
T_H=DHT11_rec_byte(); //接收溫度高八位
T_L=DHT11_rec_byte(); //接收溫度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //結束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數據處理,方便顯示*/
kbv[15]='0'+(TH/10);
kbv[16]='0'+(TH%10);
kbv[17]='C';
}
return revise ;
}
void My()
{
static uint_32 TPMCounter = 0; //計時器
uint_8 value; //鍵盤變量
uint_8 dht11_value ; //DHT11變量
static uint_8 LEDindex=0; //位選口聲明
uint_8 LEDDataBuffer[4]; //LED顯示緩沖區
uint_8 i;
//LED緩沖區賦值
LEDDataBuffer[0]='0';
LEDDataBuffer[1]='2';
LEDDataBuffer[2]='3';
LEDDataBuffer[3]='5';
//LCD顯示緩沖區,其中.表示按下的數字
uint_8 kbv[32]="Set is .";
if((TPM_SC_REG(TPM0_BASE_PTR) & TPM_SC_TOF_MASK) == TPM_SC_TOF_MASK)
{
TPMCounter++;
}
BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR)); //中斷置標志位寫1清0
//處理LED部分
LEDindex++; //位選位+1
if (LEDindex>=4) LEDindex=0; //大于4位選口置0
i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0'); //轉碼
LEDshow1(LEDindex,i); //顯示LED
if(TPMCounter>100)
{
TPMCounter = 0;
//鍵盤得到掃描值
value = KBScanN(2);
//掃描鍵值,存于value中
if(KBDef(value) != 0xff) //發送鍵值
{
//修改.成為按鍵值
kbv[8] = KBDef(value);
//通過LCD顯示出來
kbv[9] = ‘C’;
kbv[10] = ‘ ’;
kbv[11] = ‘N’;
kbv[12] = ‘O’;
kbv[13] = ‘W’;
kbv[14] = ‘:’;
dht11_value = DHT11_receive();
LCDShow(kbv);
while(DHT11_receive())
{
if(vale < DHT11_receive() )
{
LCDShow(kbv);
Fan_Control (FAN_PORT,FAN_PIN,1) ;
}
else
{
LCDShow(kbv);
Fan_Control (FAN_PORT,FAN_PIN,0) ;
}
}
}
}
}
7.編寫Main()
//================================
#include “my.h” //包含總頭文件
int main(void)
{
//聲明主函數使用的局部變量
uint_8 * lcd_DispalyInit ;
//緩沖區賦值
lcd_DispalyInit = (uint_8 *)”Welcome..”;
//初始化底層模塊
LCDInit();
KBInit() ;
DHT11Init();
//LCD顯示初始字符
LCDShow(lcd_DispalyInit) ;
//進入主程序
My();
return 0 ;
}
|