DHT11在ARM7上的实现.docx
- 文档编号:7520215
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:21
- 大小:796.90KB
DHT11在ARM7上的实现.docx
《DHT11在ARM7上的实现.docx》由会员分享,可在线阅读,更多相关《DHT11在ARM7上的实现.docx(21页珍藏版)》请在冰点文库上搜索。
DHT11在ARM7上的实现
温湿度检测与控制项目报告总结
一、主要内容:
1、项目研究内容(根据你们做的情况对下面六点进行修改即可)
(1)对温室机房控制系统进行整体结构设计,设计系统的硬件电路,实现对温
室参数进行采集,显示,报警,通信及对执行机构进行模拟控制的功能。
(2)外围设备的智能切换控制,实时温度、湿度监测,处理环节均由系统智能控制,减少人工干预。
(3)分析fs2410芯片和外围设备传输、处理数据的效率和方式,为将来更复杂的任务打下基础。
(4)对温室知道控制系统进行软件设计
(5)分析机房设备稳定运行的温度和湿度范围
(6)为嵌入式方向教学探索新的方法
2、项目研究成果
实现了对温度、湿度的显示、控制以及警报。
当温度达到某一限定值时,就会产生警报,同时继电器开关就会激发,从而相关外设调节设备响应,来达到温湿度的控制效果。
3、项目解决方案(简要介绍采用何种软硬件平台,可行性及项目设计整体思路)
硬件设备:
EasyARM2100开发试验板,继电器开关(6VDCOMRONLY2NJ),电位器(BAOSHI32960908C),传感器(DHT11),三极管(S8050D.331),5V干电池2节,直流电源(6V),发光二极管(1个),J-link仿真器,杜邦线(若干)。
软件设备:
ARMDeveloperSuiteV1.2,串口调试助手V2.2
室内温湿度的控制主要是为了保持室内温湿度的稳定,适合于一些对温湿度要求较高的场合使用。
本项目是基于ARM72410系列开发板设计的,传感器把温湿度相关数据发送到主控板上,然后通过串口调试助手显示在电脑上。
当温湿度的值达到某一设定的临界值时就会触发开发板产生一个信号(输出.3.3V电压),使三极管处于导通状态,继电器开关响应,连接外设电源开始工作。
当传感器发送的数据在设定的合适的范围内,开发板上的信号中断,电压消失,继电器开关释放,外设停止工作。
从而达到对温湿度的控制效果。
4、项目技术报告(项目总体结构、所用技术、软硬件各个模块实现)
总体方案结构图:
设计电路图:
二、
(1)项目实现结果
硬件连接图:
软件配置:
ARMDeveloperSuiteV1.2,串口调试助手V2.2
调试器:
AXDDebugger
编译环境:
ADS1.2
开发环境:
codewarriorforARMDevelopersuite
(2)使用流程(即简明用户手册)
1.首先把传感器连接到2410开发板上,传感器1PIN连接开发板的5V供电端,2PIN数据端连接P0.2,3PIN悬空,4PIN连接GND(即接地);继电器的信号输入的端口接P0.8另一端接地。
2.用户要在电脑上安装ARMDeveloperSuiteV1.2软件然后创建一个项目文件,打开项目程序程序(见附录)。
3.给2410主控板供电、连接J-link仿真器并连接控制板到电脑的串口
4.编译并调试程序,然后打开串口调试小助手,把波特率调为115200
(3)项目运行结果(软件抓图、硬件整个相片)
三、结论(结论、不足、进一步完善建议)
本次项目实现了对温湿度的检测、报警和控制的功能,并能通过程序修改相关的参数来对不同的场合进行检测,从而扩大了该项目成果的使用范围。
在做这个项目前期,由于没有把显示器显示数据的原理搞明白,所以没有用显示器来显示数据。
后期温湿度的显示是靠另外的软件来解决的,没有显示器也就给读取数据带来了麻烦。
另外这个项目是在2410控制板上实现的,所以如果要成为产品的话,就必须要用更便宜控制板替换2410,这样就可以减少成本。
软件的操作也是一个不足之处,由于ARMDeveloperSuiteV1.2软件本省的原因,编译和运行该项目的程序的过程有点复杂,这也是要改进的一点。
在项目选择硬件时,由于没有考虑的周到,造成三极管的导通电压需求较高。
2410控制板上可提供的信号电压是3.3V,所以外加了一个直流电源(两节干电池)供电,这一点需要改进---更换一个导通电压低于3.3V的三极管。
从图片上可以看到硬件的连线很乱,可以把这些硬件固定在一块电路板上,从而可以使整体看起来比较的简单。
以上是对本项目中出现的困难、不足和需要改进之处做的一个总结,我也从这个项目制作的过程中加深了对嵌入式的了解和认识。
2010/12/21秦嵩峰
附:
#include"config.h"
#include
#defineUART_BPS115200/*定义通讯波特率*/
#defineLEDCON1(1<<22)//湿度过高报警
#defineLEDCON2(1<<23)//湿度过低报警
#defineLEDCON3(1<<24)//温度过高报警
#defineLEDCON4(1<<25)//温度过低报警
#defineBUZZE(1<<7)
#defineDATA_BUS(1<<2)
#defineCONTROL(1<<8)
#definewarning_temp_max25
#definewarning_temp_min20
#definewarning_rh_max50
#definewarning_rh_min43
uint8RH_H_temp;//湿度数据
uint8RH_L_temp;
uint8RH_H;
uint8RH_L;
uint8T_H_temp;//温度数据
uint8T_L_temp;
uint8T_H;
uint8T_L;
uint8check_temp;
uint8comdata;
uint32flag_0_time=0;
uint32flag_1_time=0;
uint32measure;
/*****************************************************
*延迟10us
*****************************************************/
voidDelay_10us()
{
T0TCR=0x03;
T0TCR=0x01;//启动并复位T0TC;
T0IR=0x01;
while((T0IR&0x01)==0);
//T0IR=0x01;
//T0TCR=0;//计数器停止
}
/***************************************************
*延迟1us
****************************************************/
voidDelay_1us()//用汇编实现1us定时
{
__asm
{
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
}
/**********************************************
*延迟1ms
**********************************************/
voidDelay_1ms()
{
T1TCR=0x03;
T1TCR=0x01;
T1IR=0x01;
while((T1IR&0x01)==0);
//T1TCR=0;//计数器停止
}
/***********************************************************************
*判别0函数,26-28us表示0
************************************************************************/
voidMeasureForZero()
{
uint8count;
for(count=0;count<4;count++)
{
T0TCR=0x03;
T0TCR=0x01;//启动并复位T0TC;
T0IR=0x01;
while((T0IR&0x01)==0)
{
flag_0_time++;
}
}///测量30us,flag_0_time的值;注意while语句也会占用时间
}
/**********************************************************************
*判别1函数
***********************************************************************/
voidMeasureForOne()
{
uint8count;
for(count=0;count<8;count++)
{
T0TCR=0x03;
T0TCR=0x01;//启动并复位T0TC;
T0IR=0x01;
while((T0IR&0x01)==0)
{
flag_1_time++;
}
}
}
/*******************************************************************
*定时器0,1初始化函数
*******************************************************************/
voidTime0Init(void)
{
/*初始化定时器0,实现0.5S定时;定时器1实现0.1秒定时。
Fcclk=Fosc*4=11.0592MHz*4=44.2368MHz
Fpclk=Fcclk/4=44.2368MHz/4=11.0592MHz
*/
T0TC=0;
T0PR=0;//设置定时器1分频
T0MCR=0x03;//匹配通道0匹配中断并复位T0TC
T0MR0=120;//实现10us定时,(实际要大于10us,真实值约为10.85us)
T0TCR=0x03;
T0TCR=0x01;
}
voidTime1Init(void)
{
T1TC=0;
T1PR=0;
T1MCR=0x03;
T1MR0=11059;//实现1ms定时
T1TCR=0x03;
T1TCR=0x01;
}
/**************************************************************************
*数据接收函数
**************************************************************************/
voidCOM(void)
{
uint8i;
uint32detect;
for(i=0;i<8;i++)
{
measure=0;
detect=0;
while(!
(IO0PIN&DATA_BUS))//等待50us结束
{
detect++;
}
while((IO0PIN&DATA_BUS)==4)
{
measure++;
}
if(measure { comdata<<=1; comdata|=0; } elseif((measure>flag_0_time)&&(measure { comdata<<=1; comdata|=1; } else { comdata<<=1; comdata|=1; } }//for } //-------------------------------- //-----湿度读取子程序------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位==U8T_data_H------ //----温度低8位==U8T_data_L------ //----湿度高8位==U8RH_data_H----- //----湿度低8位==U8RH_data_L----- //----校验8位==U8checkdata----- //----调用相关子程序如下---------- //----Delay_1ms();,Delay_10us();,COM(); //-------------------------------- voidRH(void) { uint8counter; IO0CLR=DATA_BUS; //将总线拉低18ms,发出开始信号 for(counter=0;counter<18;counter++) { Delay_1ms(); } //将总线拉高40us,等待传感器响应 IO0SET=DATA_BUS; //主机设为输入判断从机响应信号 IO0DIR&=(~DATA_BUS); Delay_10us(); Delay_10us(); Delay_10us(); //Delay_10us(); //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行 if((IO0PIN&DATA_BUS)==0)//有响应 { //等待IO0PIN的响应信号 //while((IO0PIN&DATA_BUS)==1); while(! (IO0PIN&DATA_BUS));//等待80us的响应结束 while((IO0PIN&DATA_BUS));//等待80us的响应结束 COM(); RH_H_temp=comdata; COM(); RH_L_temp=comdata; COM(); T_H_temp=comdata; COM(); T_L_temp=comdata; COM(); check_temp=comdata; if(check_temp==(RH_H_temp+RH_L_temp+T_H_temp+T_L_temp)) { RH_H=RH_H_temp; RH_L=RH_L_temp; T_H=T_H_temp; T_L=T_L_temp; } } } /**************************************************************************** *名称: UART0_Ini() *功能: 初始化串口0。 设置为8位数据位,1位停止位,无奇偶校验,波特率为115200 *入口参数: 无 *出口参数: 无 ****************************************************************************/ voidUART0_Ini(void) {uint16Fdiv; U0LCR=0x83;//DLAB=1,可设置波特率 Fdiv=(Fpclk/16)/UART_BPS;//设置波特率 U0DLM=Fdiv/256; U0DLL=Fdiv%256; U0LCR=0x03; } /**************************************************************************** *名称: UART0_SendByte() *功能: 向串口发送字节数据,并等待发送完毕。 *入口参数: data要发送的数据 *出口参数: 无 ****************************************************************************/ voidUART0_SendByte(uint8data) {U0THR=data;//发送数据 while((U0LSR&0x40)==0);//等待数据发送完毕 } /**************************************************************************** *名称: UART0_SendStr() *功能: 向串口发送一字符串 *入口参数: srt要发送的字符串的指针 *出口参数: 无 ****************************************************************************/ voidUART0_SendStr(charconst*str) {while (1) {if(*str=='\0')break; UART0_SendByte(*str++);//发送数据 } } uint8constSEND_STRING[]="HelloWorld! \n"; /******************************************************* *主函数 ********************************************************/ intmain() { uint32i; //uint8data[4];//用来存放接收到的数据 charstr[30]; PINSEL0=0x00000005;//UART PINSEL1=0x00000000; IO0DIR=DATA_BUS; UART0_Ini(); Time0Init(); Time1Init(); MeasureForOne(); MeasureForZero(); while (1) { /*FlashLEDCON_23();//10ms为单位的2s闪烁 FlashLEDCON_24();//10us为单位的2s闪烁 FlashLEDCON_25();//1us为单位的0.2s闪烁 */ IO0DIR=LEDCON1|LEDCON2|LEDCON3|DATA_BUS|CONTROL|BUZZE; RH(); //每隔2s采样 for(i=0;i<2000;i++) { Delay_1ms(); } //检查温度是否到报警值 if(RH_H>warning_rh_max) { IO0CLR=LEDCON1; } else { IO0SET=LEDCON1; } if(RH_H { IO0CLR=LEDCON2; } else { IO0SET=LEDCON2; } if(T_H>warning_temp_max) { IO0CLR=LEDCON3; } else { IO0SET=LEDCON3; } if(T_H { IO0CLR=LEDCON4; IO0SET=CONTROL; } else { IO0SET=LEDCON4; IO0CLR=CONTROL; } //蜂鸣器报警功能 if((T_H>warning_temp_max)||(T_H) { IO0CLR=BUZZE; } else { IO0SET=BUZZE; } //data[0]=RH_H; //data[1]=RH_L; //data[2]=T_H; //data[3]=T_L; sprintf(str,"Humidity: %2d.%3drh,Temp: %2d.%3d°C\n",RH_H,RH_L,T_H,T_L); UART0_SendStr(str); //UART0_SendStr(SEND_STRING); UART0_SendByte('\n'); }//while (1) return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DHT11 ARM7 实现