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 ;
}
|