温湿度传感器实验报告(北理工)

《智能微系统设计/》课程

实 验 报 告

             班级:02131201     

             姓名         

             学号        

北京理工大学

实验一、环境参数测量实验

1. 实验项目

①测试环境温湿度;

②测量环境气压;

③测试人体表面温湿度(选做)。

2. 实验方法

1)实验准备

①连接PC机与智能系统实验平台;

②接通电源,电源指示灯亮,OLED屏显示开机界面;

2)单次测量

①拨开关S1和S2至断开,系统进入单次检测浮点输入状态;

②按键Key3,完成一次环境参数单次测量,记录OLED显示屏上的浮点数据;

③拨开关S2至连接状态,S1保持断开,系统进入单次检测码值输出状态;

④按Key3,完成一次环境参数单次测量,记录OLED显示屏上的码值数据;

⑤将码值数据根据关系进行换算,将计算结果与②中的浮点数据进行对比;

3)连续测量

①启动软件,  选com1,设置9600,软件显示正常;

②拨S1至连接,系统进入连续测量状态;

③按键Key3,启动连续检测;

④观察温湿度和压力曲线,截取数据曲线显示界面;

⑤拨开关S1至断开,停止检测。

4)体表温湿度测量

①启动软件,选com1,设置通讯速度为9600,;

②拨开关S1至连接;

③按键Key3,启动连续检测;

④放手指置于传感器表面,截取数据曲线显示界面;

⑤拨开关S1至断开,停止连续检测。

   3.1单次检测

3.1.1单次检测实验结果结果分析:

  由表格易看出,经过码值计算得到的温湿度数据与实际测量的温湿度数据结果虽有误差,但结果相近.

3.1.2实验结论:

  由上述实验结果可知该传感器较准确有效的测出实际环境温度湿度.

3.2连续检测曲线图

(粘贴实验截图)

1)        体表温湿图曲线图

(粘贴实验截图)

3.2.1连续检测实验结果分析

  由图像可知,随着时间的变化,环境温度和湿度呈缓慢下降趋势,但湿度有小幅度波动.体表温度和湿度呈缓慢上升趋势.

3.4 实验结论  

  由环境连续检测图像可得环境温度变化比湿度变化缓慢.   

  由体表连续检测图像可得该传感器对外界温度的感知较为缓慢,对外界湿度的突变较为敏感.

                                  

注:各标题用宋体四号字,内容用宋体小四号字,行距22磅。
实验二、运动参数测量实验

1.     实验项目

①基于重力加速度的姿态倾角检测;

②*挥臂检测/记步检测(选做)

2.     实验方法

1)        实验准备

①        将智能系统实验平台通过USB连接至PC机;

②        接通电源开关,电源指示灯亮,OLED显示屏显示开机界面;

2)        基于重力加速度的姿态倾角检测

①        转动智能系统实验平台,观察并记录实验平台处于6个稳态状态下的三轴加速度数据。

②        将智能系统实验平台一侧抬高并形成稳定角度,使用量角器测量该角度;

③        观察并记录实验平台处于该倾角状态下的三轴加速度数据。

④        通过三角函数计算实验平台的倾角,并将计算结果与测量值进行对比。

3)        挥臂检测/记步检测

①        启动环境参数测量软件,选择串口com1,将通讯速度设置为9600,软件显示“串口连接正常”。

②        将拨码开关4设置为连接状态,开启连续测量功能;

③        手持实验平台模拟行走摆臂动作,并记录摆臂次数;

④        观测三轴加速度测量曲线,并截取曲线界面;

⑤        统计曲线中产生的波动数量,并与摆臂次数进行对比,建立数学关系模型;

⑥        重复上述实验步骤,验证数学模型。

3. 实验结果记录

1)        基于重力加速度的姿态倾角检测;

2)        摆臂检测/计步检测

摆臂次数检测数学模型:        波峰=与摆动平面平行的坐标轴波峰数                      

4. 实验结果分析

   经过上述实验可以了解加速度传感器和角速度传感器的测量原理和测量特性,加速度传感器在重力作用下可以很明显的测出误差较小的数据,角速度传感器在一定角度下可以较准确地测量数据;运动传感器中验证了数学模型:摆臂次数=              ,实验数据较为精确。

5. 实验结论  

   在上述实验中,我们体会到了实验数据的来之不易,懂得了实验不是与数学模型100%吻合,我们应当稳扎稳打,按照步骤做实验,不可心急气躁,尽量得到准确的实验数据。

   6. 实验注意事项

      1)   进行测量时,应注意动作幅度,避免跌落和碰撞。

      2) 摆动传感器平台时,应注意防止传输数据线脱落。

      3) 为使得图像相邻两个周期便于分辨,摇动传感器的周期应较大些。

 

第二篇:温湿度传感器程序

/*基于盛群单片机开发的 获得温湿传感器dht11和光敏电阻的数据 并且发送到1602显示屏的程序*/

#include <ht46r232.h>

#pragma vector isr_4 @ 0x4

#pragma vector isr_8 @ 0x8

#pragma vector isr_c @ 0xc

#pragma vector isr_ad @ 0x10 //ad中断服务程序(r232地址是10)

//ISR for safequard

void isr_4(){} // external ISR

void isr_8(){} // timer/event 0

void isr_c(){} // timer/event 1

//initialize registers for safeguard

void safeguard_init(){

_intc0=0;

_intc1=0;

_tmr0h=0;

_tmr0l=0;

_tmr0c=0;

_tmr1h=0;

_tmr1l=0;

_tmr1c=0;

_pac=0xff;

_pbc =0xff; //input mode

_pcc =0xff;

}

typedef unsigned char u8;

#define rs _pc2

#define ep _pc0

#define rw _pc1

#define dht _pb1

#define ko _pb2

#define ky _pb3

#define LED_DATA_CRL _pac

#define DHT_DATA_CRL _pbc

#define LED_DATA_DATA _pa

#define LED_CRL_CRL _pcc

#define ad_start _26_7

void busycheck(void);

void init(void); //屏幕的控制rs //屏幕的控制rs //屏幕的控制rs //外部按键定义 //屏幕数据管脚的I/O控制 //dht数据管脚的I/O控制 //屏幕数据管脚的数据传递 //屏幕控制管脚的I/O控制 //定义ad转换的start位(r232的adcr寄存器地址是0x26h)

void cmd(unsigned char);

void data(int);

signed char U8FLAG,U8temp,U8comdata;

int

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;/*中间数值,校对校验码后付给最终的结果*/

int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/*实际数值*/ int k; //外部按键常量

unsigned int light; //光强的数字值

int light_b; //百位

int light_s; //十位

int light_g; //个位

int count;

void ADtrans(){ //ad转换开始

ad_start=0;

ad_start=1;

ad_start=0;

}

//--------------------------------------屏幕部分------------------------------

//********************************屏幕初始************************************ void init()

{

LED_DATA_CRL=0;

LED_CRL_CRL=0;

LED_DATA_DATA=0;

_pc=0;

_delay(5000);

_delay(5000);

_delay(5000);

cmd(0x38);

_delay(5000);

cmd(0x38);

_delay(5000);

cmd(0x38);

_delay(5000);

cmd(0x38);

busycheck();

cmd(0x08);

busycheck();

cmd(0x01);

busycheck();

cmd(0x06);

busycheck();

cmd(0x0c);

busycheck();

}

//****************************

//***********送指令函数******** void cmd(u8 mingling)

{

//busycheck();

rs= 0;

rw = 0;

ep = 0;

LED_DATA_DATA=mingling; _delay(100);

ep=1;

_delay(100);

ep=0;

}

//***************************

//*********送数据************

void data(int zimu)

{//busycheck();

rw=0;

rs = 1;

rw = 0;

ep = 0;

LED_DATA_DATA= zimu;

_delay(100);

ep = 1;

_delay(100);

ep = 0;

}

//***************************

//**********busycheck***********

void busycheck(void){

u8 val;

do{

ep=0;

LED_DATA_CRL=0xff;

rs=0;

rw=1;

ep=1;

_delay(100);

val=LED_DATA_DATA;

_delay(100);

ep=0;

}while(val&(u8)0x80);

rw=0;

LED_DATA_CRL=0;

}

//*****************************************************

//******************写入地址***************************

void pos(u8 x)

{

cmd(x|0x80);

}

//***************************************************** //-------------------dht21 部分------------------------

//**************获取8位二进制数************************

/*COM获取一个8位二进制数*/

void COM(void)

{

u8 i;

for(i=0;i<8;i++)

{

U8FLAG=2;

while((!dht)&&U8FLAG++);

_delay(35);

U8temp=0;

if(dht)U8temp=1;

U8FLAG=2;

while((dht)&&U8FLAG++);

//超时则跳出for循环

if(U8FLAG==1)break;

//判断数据位是0还是1

// 如果高电平高过预定0高电平值则数据位为 1

U8comdata<<=1;

U8comdata|=U8temp;

}//rof

}

//*********************************************************** /*--------------------------------*/

/*-----温湿度读取子程序 ----------*/

/*--------------------------------*/

/*-----以下变量均为全局变量-------*/

/*----温度高8位== U8T_data_H------*/

/*----温度低8位== U8T_data_L------*/

/*----湿度高8位== U8RH_data_H-----*/

/*----湿度低8位== U8RH_data_L-----*/

/*----校验 8位 == U8checkdata-----*/

void RH(void)

{ int c=0;

DHT_DATA_CRL=0;

dht=0;

_delay(20000); //主机拉低500us

DHT_DATA_CRL=0xff; //主机设为输入(电平由上拉电阻拉高) 在20~40us后判断从机响应信号

while((dht==1)&&(c++<100)); //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行

if(!dht)

{

U8FLAG=2;

while((!dht)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束

U8FLAG=2;

while((dht)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

COM(); //数据接收状态

U8RH_data_H_temp=U8comdata;

COM();

U8RH_data_L_temp=U8comdata;

COM();

U8T_data_H_temp=U8comdata;

COM();

U8T_data_L_temp=U8comdata;

COM();

U8checkdata_temp=U8comdata;

//数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp)

if(1)

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp; }

}

}

//******************************************************************

//---------------------华丽的main函数分割线-------------------------

void main()

{

//*********变量定义***********

u8 r='r';

u8 h='h';

u8 t='t';

u8 c='c';

u8 l='l';

u8 z=':';

u8 si='4';

u8 wu='5';

u8 liu='6';

u8 ling='0';

int rhdatas; //湿度数据十位

int rhdatag; // 湿度数据个位

int tdatas;

int tdatag;

int i=0;

//*****************************

//*********初始化**************

safeguard_init();

init();

DHT_DATA_CRL=0xff;

_acsr=0x01; //ad转换8分频

_adcr=0x08; //设置通道 pb0 an0作为ad输入

ad_start=1; //设置分频和通道

ad_start=0;

_emi=0; //关总中断

_adf=0; //清除ad中断标志位

_eadi=1; // 开ad中断使能

_emi=1; //开总中断

//*******************************

while(1){

RH();

ADtrans(); //ad转换开始

if(ko==0)k=1; //查询键盘

else if(ky==0)k=0;

//**把获得的数据转换成屏幕可以显示的数字(根据屏幕的编码表)**********

rhdatas=U8RH_data_H/10;

rhdatag=U8RH_data_H%10;

rhdatas=(rhdatas|0x30)&0x3f;

rhdatag=(rhdatag|0x30)&0x3f;

if(ko==0)k=1; //查询键盘

else if(ky==0)k=0;

tdatas=U8T_data_H/10;

tdatag=U8T_data_H%10;

tdatas=(tdatas|0x30)&0x3f;

tdatag=(tdatag|0x30)&0x3f;

if(ko==0)k=1; //查询键盘

else if(ky==0)k=0;

light_b=light/100;

light_s=(light-light_b*100)/10;

light_g=light%10;

light_b=(light_b|0x30)&0x3f;

light_s=(light_s|0x30)&0x3f;

light_g=(light_g|0x30)&0x3f;

//***********************************

cmd(0x08); //先关显示屏!!!!!! _delay(60000);

cmd(0x01); // 清屏!!!!!!!!!! _delay(60000);

_delay(60000);

if(ko==0)k=1; //查询键盘

else if(ky==0)k=0;

pos(0); //显示温度

data(h);

data(z);

data(rhdatas);

data(rhdatag);

if(ko==0)k=1; //查询键盘

else if(ky==0)k=0;

pos(43); //显示湿度

data(t);

data(z);

data(tdatas);

data(tdatag);

if(ko==0)k=1; //查询键盘

else if(ky==0)k=0;

pos(8);

data(r); //显示推荐数据

data(c);

data(z);

if(tdatas=='3') {if (k==1) {data(si);data(ling);}

else {data(si);data(wu);}}

if(U8T_data_H<30&&U8T_data_H>=25) {if (k==1) {data(si);data(wu);} else {data(wu);data(ling);}}

if (U8T_data_H<25) {if (k==1) {data(wu);data(wu);} else {data(liu);data(ling);}}

pos(0x4a); //显示当前光强 data(l);

data(z);

data(light_b);

data(light_s);

data(light_g);

pos(0x48);

data(count);

if(ko==0)k=1;

else if(ky==0)k=0;

cmd(0xc);

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1;

else if(ky==0)k=0;

_delay(250000);

if(ko==0)k=1; //查询键盘 //开显示屏@!!!!!!!!!!!!!! //查询+延时

else if(ky==0)k=0;

}

}

//________________________________________________

//***********中断服务程序******************** void isr_ad(){

_adf=0;

light=_adrh;

count++;

} //清除ad中断标志位 //读取ad数据寄存器高八位;

相关推荐