传感技术探究性实验总结报告
报告主题:姓 名:学 院:系:专 业:指导教师:
基于湿度传感器原理、参数、性能的探究
性实验报告
王明君、鲁婉洁、张紫莹 生仪学院
电子信息技术及仪器
电子信息技术及仪器
唐志峰老师、汤守健老师、杨臻垚学长
二O一四年十一月十四日
目录
项目简介:.................................................................................................................... 3 实验目的及内容:........................................................................................................ 3 实验仪器设备:............................................................................................................ 3 实验探究过程:............................................................................................................ 3
(一)理解电阻式湿度传感器的原理及结构和工作方式;............................. 3
敏感元件:湿敏电阻...................................................................................... 4 湿度传感器结构:.......................................................................................... 4 测量电路:...................................................................................................... 4 4、实验探究湿度传感器湿度与电阻的关系以及不同温度下是湿度传感器湿度-电阻特性: ............................................................................................ 8 (二)探究以DHT11数字温湿度传感器为代表的电阻式湿度传感器的参数及性能....................................................................................................................... 12
1.查阅资料获得的DHT11数字温湿度传感器的参数表............................ 12 2.验证过程: ................................................................................................ 12 (三)拓展学习基于51单片机的DHT11数字温湿度传感器的程序设计及调试........................................................................................................................... 22
1.实验原理 .................................................................................................... 22 2.实验过程: ................................................................................................ 23
项目成员及分工:...................................................................................................... 35 实验心得、体会:...................................................................................................... 36
王明君:............................................................................................................... 36 鲁婉洁:............................................................................................................... 36 张紫莹:............................................................................................................... 36
项目简介:
项目来源于“基于单片机和安卓系统的植物监控和分享平台”SRTP项目,本次的探究方向基于该SRTP项目的前端设计,主要探究湿度传感器的原理、参数、性能并对一些主要的参数及性能指标加以验证。希望以该研究内容为载体在实践操作中具体了解并掌握传感器的工作机理,能够做到学以致用,用实践强化理论知识。
实验目的及内容:
1.理解电阻式湿度传感器的原理及结构和工作方式;
2.探究以DHT11数字温湿度传感器为代表的电阻式湿度传感器的参数及性能; 3.拓展学习基于51单片机的DHT11数字温湿度传感器的程序设计及调试; 4通过此次探究性实验加强成员的实践及小组协作的能力,拓展自己的理论知识之外的学习方式。
实验仪器设备:
1.DHT11温湿度传感器 2.湿度计 3.加湿器
4.MSC-51单片机 5.实验台、万用表 6. Keil uVision4 7.普中烧录软件
8.笔记本电脑(还可用作电源)
实验探究过程:
(一)理解电阻式湿度传感器的原理及结构和工作方式;
背景知识:
湿度传感器按照使用材料分类,主要分为一下几种:
电解质型:以氯化锂为例,它在绝缘基板上制作一对电极,涂上涂上氯化锂盐胶膜。氯化 锂极易潮解,并产生离子导电,随湿度升高而电阻减小。
陶瓷型:一般以金属氧化物为原料,通过陶瓷工艺,制成一种多孔陶瓷。利用多孔陶瓷的阻值对空气中水蒸气的敏感特性而制成。
高分子型:先在玻璃等绝缘基板上蒸发梳状电极,通过浸渍或涂覆,使其在基板上附着一层有机高分子感湿膜。有机高分子的材料种类也很多,工作原理也各不相同。
单晶半导体型:所用材料主要是硅单晶,利用半导体工艺制成。制成二极管湿敏器件和MOSFET湿度敏感器件等。其特点是易于和半导体电路集成在一起。 湿敏元件是最简单的湿度传感器,主要有电阻式和电容式两大类。 我们实验过程中所用到的DHT11湿度传感器为电阻式传感器。
敏感元件:湿敏电阻
湿敏电阻是覆盖在基片上的一层感湿材料膜,当空气中的水蒸气吸附于感湿膜上时,将引起其电阻率和电阻值变化,利用这一特性可以对湿度进行测量。灵敏度高是湿敏电阻的主要优点,但存在较严重的非线性。
湿度传感器结构:
高分子电阻式湿敏元件主要使用高分子固体电解质材料作为感湿膜,由于膜中存在可动离干而产生导电性,随着湿度的增大,其电离作用增强,便可动离子的浓度增大,电极间的阻值减小。当湿度减小时,电离作用也相应减弱,可动离子的浓度也减小,电极间的电阻值增大。这样,湿敏元件对水分子的吸附和释放情况,可通过电极间电阻值的变化检测出来,从而得到相应的湿度值。下图为电阻变化型湿度传感器的构造及等效电路。
图1.湿度传感器的构造 图2.湿度传感器的等效电路
测量电路:
①电源的选择:
一切电阻式湿度传感器都必须使用交流电源,否则性能会劣化甚至失效。
电解质湿度传感器的电导是靠离子的移动实现的,在直流电源作用下,正、负离子必然向电源两极运动,产生电解作用,使感湿层变薄甚至被破坏;在交流电源作用下,正负离子往返运动,不会产生电解作用,感湿膜不会被破坏。
交流电源的频率选择是,在不产生正、负离子定向积累情况下尽可能低一些。在高频情况下,测试引线的容抗明显下降,会把湿敏电阻短路。另外,湿敏膜在高频下也会产生集肤效应,阻值发生变化,影响到测湿灵敏度和准确性。
②温度补偿:
湿度传感器具有正或负的温度系数,其温度系数大小不一,工作温区有宽有窄。所以
要考虑温度补偿问题。
对于半导体陶瓷传感器,其电阻与温度的的关系一般为指数函数关系,通常其温度关
系属于NTC型,即
H:相对湿度; T:绝对温度;
R0:在T=0℃相对湿度H=0时的阻值; A:湿度常数;B:温度常数。
温度系数= 湿度系数=
湿度温度系数=
若传感器的湿度温度系数为0.07%RH/℃,工作温度差为30℃,测量误差为0.21%RH/℃,则不必考虑温度补偿;若湿度温度系数为0.4%RH/℃,则引起12%RH/℃的误差,必须进行温度补偿。
③线性化
湿度传感器的感湿特征量与相对湿度之间的关系不是线性的,这给湿度的测量、控制和补偿带来了困难。需要通过一种变换使感湿特征量与相对湿度之间的关系线性化。下图为湿度传
感器测量电路原理框图。
④典型电路
电阻式湿度传感器,其测量电路主要有两种形式: 1.电桥电路
振荡器对电路提供交流电源。电桥的一臂为湿度传感器,由于湿度变化使湿度传感器的阻值发生变化,于是电桥失去平衡,产生信号输出,放大器可把不平衡信号加以放大,整流器将交流信号变成直流信号,由直流毫安表显示。振荡器和放大器都由9V直流电源供给。电桥法适合于氯化锂湿度传感器。
2.欧姆定律电路
此电路适用于可以流经较大电流的陶瓷湿度传感器。由于测湿电路可以获得较强信号,故可以省去电桥和放大器,可以用市电作为电源,只要用降压变压器即可。其电路图如下图。
3.带温度补偿的湿度测量电路 在实际应用中,需要同时考虑对湿度传感器进行线性处理和温度补偿,常常采用运算放大器构成湿度测量电路。下图为湿度测量电路中Rt是热敏电阻器(20kΩ,B=4100K);RH为H204C湿度传感器,运算放大器型号为LM2904。该电路的湿度电压特性及温度特性表明:在(30%~90%)RH、15℃~35℃范围内,输出电压表示的湿度误差不超过3%RH。
4、实验探究湿度传感器湿度与电阻的关系以及不同温度下是湿度传感器湿度-电阻特性:
(二)探究以DHT11数字温湿度传感器为代表的电阻式湿度传感器的参数及性能
1.查阅资料获得的DHT11数字温湿度传感器的参数表
2.验证过程:
(1)分辨率:1%RH,1℃
证明方法:单片机的输出小数点后三位始终为0,所以在编程时通过语句“temp=rand() % 1000;”将小数点后三位的输出设为随机数。
(2)线性度:
①验证方法:通过加湿器改变环境中的湿度,读出同一湿度环境下湿度计测得的湿度及湿度传感器测得的湿度并求得其差值,选取其中最大的差值湿度传感器所得的测量量程作比,得到湿度传感器的线性度; 从下面的“测湿计与湿度传感器比对图”中可以看出,最大的差值在点三处取得,即“69.759—68.61=1.149(%RH)”,测量量程为:“20%RH~90%RH”,JI==即70%RH,所以线性度即为:1.149/70=1.641%。 ②测量电路 典型应用电路:
③实验结果: (a)实验数据:
(b
由图像和数据可求得湿度传感器的线性度,具体在验证方法中已详细介绍,在此不再赘述。
(三)拓展学习基于51单片机的DHT11数字温湿度传感器的程序设计及调试
1.实验原理
根据DHT11湿度传感器的“串行接口(单线双向)”来编写主函数
DATA 用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。 通讯过程如图1所示
图1
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
图2
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。格式见下面图示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如图4所示:
图4
数字1信号表示方法.如图5所示
图5
2.实验过程:
(1)根据DHT11湿度传感器的“串行接口(单线双向)”来编写的主函数
void main()
{
U16 temp;
srand(0);
Lcd12864_Init();
Lcd12864_ClearScreen();
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 0, "空空空:度湿前当");
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 4, "空空空:度温前当");
Delay_10ms(50);
while (1)
{
RH();
Lcd12864_Write16CnCHAR(0, 2, "空空位单");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8RH_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 2,str_temp);
Lcd12864_Write16CnCHAR(0, 6, "空空空℃");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8T_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 6,str_temp);
Delay_10ms(100);
}
}
(2)所有代码:
#include
#include"st7565.h"
#include"stdio.h"
#include"stdlib.h"
//----------------------------------------------//
//----------------类型定义区--------------------//
//----------------------------------------------//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度
浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit P2_0 = P2^0 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
uchar str_temp[]="";
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay_10ms(unsigned int c) //误差 0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay_10ms();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主机拉低20ms
P2_0=0;
Delay_10ms(2);
P2_0=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P2_0) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P2_0)&&U8FLAG++);
//数据接收状态
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;
P2_0=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
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;
}//fi
}//fi
}
void main()
{
U16 temp;
srand(0);
Lcd12864_Init();
Lcd12864_ClearScreen();
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 0, "空空空:度湿前当");
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 4, "空空空:度温前当");
Delay_10ms(50);
while (1)
{
RH();
Lcd12864_Write16CnCHAR(0, 2, "空空位单");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8RH_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 2,str_temp);
Lcd12864_Write16CnCHAR(0, 6, "空空空℃");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8T_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 6,str_temp);
Delay_10ms(100);
}
}
St7565.c:
#include"st7565.h"
/*******************************************************************************
* 函 数 名 : LCD12864_WriteCmd
* 函数功能 : 写入一个命令到12864
* 输 入 : cmd
* 输 出 : 无
*******************************************************************************/
void LcdSt7565_WriteCmd(cmd)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 0; //select command,选择命令
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = cmd; //put command,放置命令
_nop_();
_nop_();
LCD12864_RW = 1; //command writing ,写入命令
}
/*******************************************************************************
* 函 数 名 : LcdSt7565_WriteData
* 函数功能 : 写入一个数据到12864
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdSt7565_WriteData(dat)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 1; //select data,选择数据
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = dat; //put data,放置数据
_nop_();
_nop_();
LCD12864_RW = 1; //data writing,写数据
}
/*******************************************************************************
* 函 数 名 : LCD12864_Init
* 函数功能 : 初始化12864
* 输 入 : 无
* 输 出 : 无
* 说 明 : LCD12864的命令指令可以查看例程文件夹下的《ST7565p数据手册》 * * 的第51页的位置。
*******************************************************************************/
void Lcd12864_Init()
{
uchar i;
LCD12864_RSET = 0;
for (i=0; i
LCD12864_CS = 0;
LCD12864_RSET = 1;
//----------------Star Initial Sequence-------//
//------程序初始化设置,具体命令可以看文件夹下---//
//--软件初始化--// LcdSt7565_WriteCmd(0xE2); //reset for (i=0; i
//--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--// //--0xF801,选择增压为5X,其实效果差不多--// LcdSt7565_WriteCmd(0xF8); //Boost ratio set LcdSt7565_WriteCmd(0x01); //x4 //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--// //--选择从0x00到0X3F。用来设置背景光对比度。---/ LcdSt7565_WriteCmd(0x81); //V0 a set LcdSt7565_WriteCmd(0x23); //--表格第17个命令,选择调节电阻率--// LcdSt7565_WriteCmd(0x25); //Ra/Rb set //--表格第16个命令,电源设置。--// LcdSt7565_WriteCmd(0x2F); for (i=0; i
//--表格第1个命令,开启显示--//
LcdSt7565_WriteCmd(0xAF); // display on
for (i=0; i
}
/*******************************************************************************
* 函 数 名 : LCD12864_ClearScreen
* 函数功能 : 清屏12864
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Lcd12864_ClearScreen(void)
{
uchar i, j;
for(i=0; i
{
//--表格第3个命令,设置Y的坐标--//
//--Y轴有64个,一个坐标8位,也就是有8个坐标--//
//所以一般我们使用的也就是从0xB0到0x07,就够了--//
LcdSt7565_WriteCmd(0xB0+i); //--表格第4个命令,设置X坐标--// //--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--// //--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--// //--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--// //--我们的X坐标从0x10,0x00开始---// LcdSt7565_WriteCmd(0x10); LcdSt7565_WriteCmd(0x04);
//--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//
for(j=0; j
{
LcdSt7565_WriteData(0x00); //如果设置背景为白色时,清屏选择0XFF }
}
}
/*******************************************************************************
* 函 数 名 : LCD12864_Write16CnCHAR
* 函数功能 : 在12864上面书写16X16的汉字
* 输 入 : x, y, cn
* 输 出 : 无
* 说 明 : 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时 * * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的 * * 使用说明》
*******************************************************************************/
#ifdef CHAR_CODE
#include"charcode.h"
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
{
uchar j, x1, x2, wordNum;
//--Y的坐标只能从0到7,大于则直接返回--//
if(y > 7)
{
return 0;
}
//--X的坐标只能从0到128,大于则直接返回--// if(x > 128) { return 0; } y += 0xB0; //求取Y坐标的值 //--设置Y坐标--// LcdSt7565_WriteCmd(y); while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾 {
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出x2 = x & 0x0F; //去低四位
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (wordNum=0; wordNum
{
//--查询要写的字在字库中的位置--//
if ((CN16CHAR[wordNum].Index[0] == *cn)
&&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
{
for (j=0; j
{
if (j == 16) //由于16X16用到两个Y坐标,当大于等于16时,切 {
//--设置Y坐标--//
LcdSt7565_WriteCmd(y + 1);
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
}
wordNum=50;
}//if查到字结束
} //for查字结束
x += 16;
高4位 换坐标
cn += 2;
} //while结束
return 1;
}
uchar Lcd12864_Write8EnCHAR(uchar x, uchar y, uchar *en)
{
uchar j, x1, x2, wordNum;
//--Y的坐标只能从0到7,大于则直接返回--//
if(y > 7)
{
return 0;
}
//--X换向--//
x=128-x;
y += 0xB0; //求取Y坐标的值
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
while ( *en != '\0') //在C语言中字符串结束以‘\0’结尾
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
x2 = x & 0x0F; //去低四位
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (wordNum=0; wordNum
{
//--查询要写的字在字库中的位置--//
if ((EN8CHAR[wordNum].Index[0] == *en))
{
for (j=0; j
{
if (j == 8) //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y + 1);
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(EN8CHAR[wordNum].Msk[j]);
}
wordNum=50;
}//if查到字结束
} //for查字结束
x -= 8;
if (x
en ++;
} //while结束
return 1;
}
#endif
项目成员及分工:
实验心得、体会:
王明君:
传感技术作为一门传感类的课程,对于我来说是第一次接触,之前的SRTP因为偏向于软件方向,所以也并没有用到相应的知识,所以对于我,这片天地是一个空白。 我觉得了解一门课程最好的办法就是理论联系实际,将实验和理论知识结合起来。所以通过这次试验,让我对传感器和传感技术有了一个很具体、很清晰的概念,对传感器的研究过程和研究方法也有了一定的了解,老师上课所讲的理论知识,包括电阻式传感器、电容式传感器以及它们的测量电路都在这次的实验中得到了运用,也让我能更好的掌握相应知识。 同时,在实验中,我们也遇到了一些问题,比如:因为实验室缺少器材不能进行相应的实验;实验器材的规格不能满足我们实验的需要;实验现象和理论知识不一致等等,我们在遇到这些问题的时候会通过上网查资料、讨论或者向老师、学长请教等渠道解决,我觉得解决问题的能力得到了提高,并且对于资料的搜集和重点资料的把握也有了很大进步。 感谢老师给了我们这次宝贵的实验机会!
鲁婉洁:
我们本次探究实验的灵感来源于我所在的SRTP小组所做的“基于单片机和安卓系统的植物监控和分享平台”项目,而我在SRTP中负责的就是通过湿度传感器采集土壤中的温湿度信息并在单片机上显示的部分,但是因为在SRTP中的传感器是直接在在网上购买的而且基于进度的要求并没有对传感器的参数、性能等做过多的研究,所以也想借这次探究实验的机会加深对湿度传感器一些方面的了解,对于接下来的SRTP进程也有很大的帮助。 而且就像老师上课说的那样,对于一门课的学习更好的方法实际上是应该是通过对一个载体循序渐进、逐渐深入地结合理论和实践的了解和探究,所以这次的实验实际上也是给了我这样一个机会,让我能通过实践和理论结合的方法去学习,也让我感受到这才是大学学习的魅力所在。同时,在实验过程中和队友们的协作探究以及相互帮助、解决困难也让我感受到了小组合作的快乐。
当然,在这个过程中也遇到了很多的问题,无论是一开始时候的迷茫还是一段时间后的瓶颈期都让我印象深刻,但幸运的是在队友之间的合作以及在老师、助教的帮助下我们最后顺利地完成了实验并且我也因此也收获了许多。
张紫莹:
传感技术探究性实验总结报告
报告主题:姓 名:学 院:系:专 业:指导教师:
基于湿度传感器原理、参数、性能的探究
性实验报告
王明君、鲁婉洁、张紫莹 生仪学院
电子信息技术及仪器
电子信息技术及仪器
唐志峰老师、汤守健老师、杨臻垚学长
二O一四年十一月十四日
目录
项目简介:.................................................................................................................... 3 实验目的及内容:........................................................................................................ 3 实验仪器设备:............................................................................................................ 3 实验探究过程:............................................................................................................ 3
(一)理解电阻式湿度传感器的原理及结构和工作方式;............................. 3
敏感元件:湿敏电阻...................................................................................... 4 湿度传感器结构:.......................................................................................... 4 测量电路:...................................................................................................... 4 4、实验探究湿度传感器湿度与电阻的关系以及不同温度下是湿度传感器湿度-电阻特性: ............................................................................................ 8 (二)探究以DHT11数字温湿度传感器为代表的电阻式湿度传感器的参数及性能....................................................................................................................... 12
1.查阅资料获得的DHT11数字温湿度传感器的参数表............................ 12 2.验证过程: ................................................................................................ 12 (三)拓展学习基于51单片机的DHT11数字温湿度传感器的程序设计及调试........................................................................................................................... 22
1.实验原理 .................................................................................................... 22 2.实验过程: ................................................................................................ 23
项目成员及分工:...................................................................................................... 35 实验心得、体会:...................................................................................................... 36
王明君:............................................................................................................... 36 鲁婉洁:............................................................................................................... 36 张紫莹:............................................................................................................... 36
项目简介:
项目来源于“基于单片机和安卓系统的植物监控和分享平台”SRTP项目,本次的探究方向基于该SRTP项目的前端设计,主要探究湿度传感器的原理、参数、性能并对一些主要的参数及性能指标加以验证。希望以该研究内容为载体在实践操作中具体了解并掌握传感器的工作机理,能够做到学以致用,用实践强化理论知识。
实验目的及内容:
1.理解电阻式湿度传感器的原理及结构和工作方式;
2.探究以DHT11数字温湿度传感器为代表的电阻式湿度传感器的参数及性能; 3.拓展学习基于51单片机的DHT11数字温湿度传感器的程序设计及调试; 4通过此次探究性实验加强成员的实践及小组协作的能力,拓展自己的理论知识之外的学习方式。
实验仪器设备:
1.DHT11温湿度传感器 2.湿度计 3.加湿器
4.MSC-51单片机 5.实验台、万用表 6. Keil uVision4 7.普中烧录软件
8.笔记本电脑(还可用作电源)
实验探究过程:
(一)理解电阻式湿度传感器的原理及结构和工作方式;
背景知识:
湿度传感器按照使用材料分类,主要分为一下几种:
电解质型:以氯化锂为例,它在绝缘基板上制作一对电极,涂上涂上氯化锂盐胶膜。氯化 锂极易潮解,并产生离子导电,随湿度升高而电阻减小。
陶瓷型:一般以金属氧化物为原料,通过陶瓷工艺,制成一种多孔陶瓷。利用多孔陶瓷的阻值对空气中水蒸气的敏感特性而制成。
高分子型:先在玻璃等绝缘基板上蒸发梳状电极,通过浸渍或涂覆,使其在基板上附着一层有机高分子感湿膜。有机高分子的材料种类也很多,工作原理也各不相同。
单晶半导体型:所用材料主要是硅单晶,利用半导体工艺制成。制成二极管湿敏器件和MOSFET湿度敏感器件等。其特点是易于和半导体电路集成在一起。 湿敏元件是最简单的湿度传感器,主要有电阻式和电容式两大类。 我们实验过程中所用到的DHT11湿度传感器为电阻式传感器。
敏感元件:湿敏电阻
湿敏电阻是覆盖在基片上的一层感湿材料膜,当空气中的水蒸气吸附于感湿膜上时,将引起其电阻率和电阻值变化,利用这一特性可以对湿度进行测量。灵敏度高是湿敏电阻的主要优点,但存在较严重的非线性。
湿度传感器结构:
高分子电阻式湿敏元件主要使用高分子固体电解质材料作为感湿膜,由于膜中存在可动离干而产生导电性,随着湿度的增大,其电离作用增强,便可动离子的浓度增大,电极间的阻值减小。当湿度减小时,电离作用也相应减弱,可动离子的浓度也减小,电极间的电阻值增大。这样,湿敏元件对水分子的吸附和释放情况,可通过电极间电阻值的变化检测出来,从而得到相应的湿度值。下图为电阻变化型湿度传感器的构造及等效电路。
图1.湿度传感器的构造 图2.湿度传感器的等效电路
测量电路:
①电源的选择:
一切电阻式湿度传感器都必须使用交流电源,否则性能会劣化甚至失效。
电解质湿度传感器的电导是靠离子的移动实现的,在直流电源作用下,正、负离子必然向电源两极运动,产生电解作用,使感湿层变薄甚至被破坏;在交流电源作用下,正负离子往返运动,不会产生电解作用,感湿膜不会被破坏。
交流电源的频率选择是,在不产生正、负离子定向积累情况下尽可能低一些。在高频情况下,测试引线的容抗明显下降,会把湿敏电阻短路。另外,湿敏膜在高频下也会产生集肤效应,阻值发生变化,影响到测湿灵敏度和准确性。
②温度补偿:
湿度传感器具有正或负的温度系数,其温度系数大小不一,工作温区有宽有窄。所以
要考虑温度补偿问题。
对于半导体陶瓷传感器,其电阻与温度的的关系一般为指数函数关系,通常其温度关
系属于NTC型,即
H:相对湿度; T:绝对温度;
R0:在T=0℃相对湿度H=0时的阻值; A:湿度常数;B:温度常数。
温度系数= 湿度系数=
湿度温度系数=
若传感器的湿度温度系数为0.07%RH/℃,工作温度差为30℃,测量误差为0.21%RH/℃,则不必考虑温度补偿;若湿度温度系数为0.4%RH/℃,则引起12%RH/℃的误差,必须进行温度补偿。
③线性化
湿度传感器的感湿特征量与相对湿度之间的关系不是线性的,这给湿度的测量、控制和补偿带来了困难。需要通过一种变换使感湿特征量与相对湿度之间的关系线性化。下图为湿度传
感器测量电路原理框图。
④典型电路
电阻式湿度传感器,其测量电路主要有两种形式: 1.电桥电路
振荡器对电路提供交流电源。电桥的一臂为湿度传感器,由于湿度变化使湿度传感器的阻值发生变化,于是电桥失去平衡,产生信号输出,放大器可把不平衡信号加以放大,整流器将交流信号变成直流信号,由直流毫安表显示。振荡器和放大器都由9V直流电源供给。电桥法适合于氯化锂湿度传感器。
2.欧姆定律电路
此电路适用于可以流经较大电流的陶瓷湿度传感器。由于测湿电路可以获得较强信号,故可以省去电桥和放大器,可以用市电作为电源,只要用降压变压器即可。其电路图如下图。
3.带温度补偿的湿度测量电路 在实际应用中,需要同时考虑对湿度传感器进行线性处理和温度补偿,常常采用运算放大器构成湿度测量电路。下图为湿度测量电路中Rt是热敏电阻器(20kΩ,B=4100K);RH为H204C湿度传感器,运算放大器型号为LM2904。该电路的湿度电压特性及温度特性表明:在(30%~90%)RH、15℃~35℃范围内,输出电压表示的湿度误差不超过3%RH。
4、实验探究湿度传感器湿度与电阻的关系以及不同温度下是湿度传感器湿度-电阻特性:
(二)探究以DHT11数字温湿度传感器为代表的电阻式湿度传感器的参数及性能
1.查阅资料获得的DHT11数字温湿度传感器的参数表
2.验证过程:
(1)分辨率:1%RH,1℃
证明方法:单片机的输出小数点后三位始终为0,所以在编程时通过语句“temp=rand() % 1000;”将小数点后三位的输出设为随机数。
(2)线性度:
①验证方法:通过加湿器改变环境中的湿度,读出同一湿度环境下湿度计测得的湿度及湿度传感器测得的湿度并求得其差值,选取其中最大的差值湿度传感器所得的测量量程作比,得到湿度传感器的线性度; 从下面的“测湿计与湿度传感器比对图”中可以看出,最大的差值在点三处取得,即“69.759—68.61=1.149(%RH)”,测量量程为:“20%RH~90%RH”,JI==即70%RH,所以线性度即为:1.149/70=1.641%。 ②测量电路 典型应用电路:
③实验结果: (a)实验数据:
(b
由图像和数据可求得湿度传感器的线性度,具体在验证方法中已详细介绍,在此不再赘述。
(三)拓展学习基于51单片机的DHT11数字温湿度传感器的程序设计及调试
1.实验原理
根据DHT11湿度传感器的“串行接口(单线双向)”来编写主函数
DATA 用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。 通讯过程如图1所示
图1
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
图2
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。格式见下面图示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如图4所示:
图4
数字1信号表示方法.如图5所示
图5
2.实验过程:
(1)根据DHT11湿度传感器的“串行接口(单线双向)”来编写的主函数
void main()
{
U16 temp;
srand(0);
Lcd12864_Init();
Lcd12864_ClearScreen();
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 0, "空空空:度湿前当");
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 4, "空空空:度温前当");
Delay_10ms(50);
while (1)
{
RH();
Lcd12864_Write16CnCHAR(0, 2, "空空位单");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8RH_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 2,str_temp);
Lcd12864_Write16CnCHAR(0, 6, "空空空℃");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8T_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 6,str_temp);
Delay_10ms(100);
}
}
(2)所有代码:
#include
#include"st7565.h"
#include"stdio.h"
#include"stdlib.h"
//----------------------------------------------//
//----------------类型定义区--------------------//
//----------------------------------------------//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度
浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit P2_0 = P2^0 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
uchar str_temp[]="";
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay_10ms(unsigned int c) //误差 0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay_10ms();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主机拉低20ms
P2_0=0;
Delay_10ms(2);
P2_0=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P2_0) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P2_0)&&U8FLAG++);
//数据接收状态
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;
P2_0=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
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;
}//fi
}//fi
}
void main()
{
U16 temp;
srand(0);
Lcd12864_Init();
Lcd12864_ClearScreen();
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 0, "空空空:度湿前当");
Delay_10ms(50);
Lcd12864_Write16CnCHAR(0, 4, "空空空:度温前当");
Delay_10ms(50);
while (1)
{
RH();
Lcd12864_Write16CnCHAR(0, 2, "空空位单");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8RH_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 2,str_temp);
Lcd12864_Write16CnCHAR(0, 6, "空空空℃");
temp=rand() % 1000;
sprintf(str_temp,"0%3d.%03d ",(int)U8T_data_H,(int)temp);
Lcd12864_Write8EnCHAR(0, 6,str_temp);
Delay_10ms(100);
}
}
St7565.c:
#include"st7565.h"
/*******************************************************************************
* 函 数 名 : LCD12864_WriteCmd
* 函数功能 : 写入一个命令到12864
* 输 入 : cmd
* 输 出 : 无
*******************************************************************************/
void LcdSt7565_WriteCmd(cmd)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 0; //select command,选择命令
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = cmd; //put command,放置命令
_nop_();
_nop_();
LCD12864_RW = 1; //command writing ,写入命令
}
/*******************************************************************************
* 函 数 名 : LcdSt7565_WriteData
* 函数功能 : 写入一个数据到12864
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdSt7565_WriteData(dat)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 1; //select data,选择数据
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = dat; //put data,放置数据
_nop_();
_nop_();
LCD12864_RW = 1; //data writing,写数据
}
/*******************************************************************************
* 函 数 名 : LCD12864_Init
* 函数功能 : 初始化12864
* 输 入 : 无
* 输 出 : 无
* 说 明 : LCD12864的命令指令可以查看例程文件夹下的《ST7565p数据手册》 * * 的第51页的位置。
*******************************************************************************/
void Lcd12864_Init()
{
uchar i;
LCD12864_RSET = 0;
for (i=0; i
LCD12864_CS = 0;
LCD12864_RSET = 1;
//----------------Star Initial Sequence-------//
//------程序初始化设置,具体命令可以看文件夹下---//
//--软件初始化--// LcdSt7565_WriteCmd(0xE2); //reset for (i=0; i
//--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--// //--0xF801,选择增压为5X,其实效果差不多--// LcdSt7565_WriteCmd(0xF8); //Boost ratio set LcdSt7565_WriteCmd(0x01); //x4 //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--// //--选择从0x00到0X3F。用来设置背景光对比度。---/ LcdSt7565_WriteCmd(0x81); //V0 a set LcdSt7565_WriteCmd(0x23); //--表格第17个命令,选择调节电阻率--// LcdSt7565_WriteCmd(0x25); //Ra/Rb set //--表格第16个命令,电源设置。--// LcdSt7565_WriteCmd(0x2F); for (i=0; i
//--表格第1个命令,开启显示--//
LcdSt7565_WriteCmd(0xAF); // display on
for (i=0; i
}
/*******************************************************************************
* 函 数 名 : LCD12864_ClearScreen
* 函数功能 : 清屏12864
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Lcd12864_ClearScreen(void)
{
uchar i, j;
for(i=0; i
{
//--表格第3个命令,设置Y的坐标--//
//--Y轴有64个,一个坐标8位,也就是有8个坐标--//
//所以一般我们使用的也就是从0xB0到0x07,就够了--//
LcdSt7565_WriteCmd(0xB0+i); //--表格第4个命令,设置X坐标--// //--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--// //--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--// //--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--// //--我们的X坐标从0x10,0x00开始---// LcdSt7565_WriteCmd(0x10); LcdSt7565_WriteCmd(0x04);
//--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//
for(j=0; j
{
LcdSt7565_WriteData(0x00); //如果设置背景为白色时,清屏选择0XFF }
}
}
/*******************************************************************************
* 函 数 名 : LCD12864_Write16CnCHAR
* 函数功能 : 在12864上面书写16X16的汉字
* 输 入 : x, y, cn
* 输 出 : 无
* 说 明 : 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时 * * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的 * * 使用说明》
*******************************************************************************/
#ifdef CHAR_CODE
#include"charcode.h"
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
{
uchar j, x1, x2, wordNum;
//--Y的坐标只能从0到7,大于则直接返回--//
if(y > 7)
{
return 0;
}
//--X的坐标只能从0到128,大于则直接返回--// if(x > 128) { return 0; } y += 0xB0; //求取Y坐标的值 //--设置Y坐标--// LcdSt7565_WriteCmd(y); while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾 {
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出x2 = x & 0x0F; //去低四位
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (wordNum=0; wordNum
{
//--查询要写的字在字库中的位置--//
if ((CN16CHAR[wordNum].Index[0] == *cn)
&&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
{
for (j=0; j
{
if (j == 16) //由于16X16用到两个Y坐标,当大于等于16时,切 {
//--设置Y坐标--//
LcdSt7565_WriteCmd(y + 1);
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
}
wordNum=50;
}//if查到字结束
} //for查字结束
x += 16;
高4位 换坐标
cn += 2;
} //while结束
return 1;
}
uchar Lcd12864_Write8EnCHAR(uchar x, uchar y, uchar *en)
{
uchar j, x1, x2, wordNum;
//--Y的坐标只能从0到7,大于则直接返回--//
if(y > 7)
{
return 0;
}
//--X换向--//
x=128-x;
y += 0xB0; //求取Y坐标的值
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
while ( *en != '\0') //在C语言中字符串结束以‘\0’结尾
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
x2 = x & 0x0F; //去低四位
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (wordNum=0; wordNum
{
//--查询要写的字在字库中的位置--//
if ((EN8CHAR[wordNum].Index[0] == *en))
{
for (j=0; j
{
if (j == 8) //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y + 1);
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(EN8CHAR[wordNum].Msk[j]);
}
wordNum=50;
}//if查到字结束
} //for查字结束
x -= 8;
if (x
en ++;
} //while结束
return 1;
}
#endif
项目成员及分工:
实验心得、体会:
王明君:
传感技术作为一门传感类的课程,对于我来说是第一次接触,之前的SRTP因为偏向于软件方向,所以也并没有用到相应的知识,所以对于我,这片天地是一个空白。 我觉得了解一门课程最好的办法就是理论联系实际,将实验和理论知识结合起来。所以通过这次试验,让我对传感器和传感技术有了一个很具体、很清晰的概念,对传感器的研究过程和研究方法也有了一定的了解,老师上课所讲的理论知识,包括电阻式传感器、电容式传感器以及它们的测量电路都在这次的实验中得到了运用,也让我能更好的掌握相应知识。 同时,在实验中,我们也遇到了一些问题,比如:因为实验室缺少器材不能进行相应的实验;实验器材的规格不能满足我们实验的需要;实验现象和理论知识不一致等等,我们在遇到这些问题的时候会通过上网查资料、讨论或者向老师、学长请教等渠道解决,我觉得解决问题的能力得到了提高,并且对于资料的搜集和重点资料的把握也有了很大进步。 感谢老师给了我们这次宝贵的实验机会!
鲁婉洁:
我们本次探究实验的灵感来源于我所在的SRTP小组所做的“基于单片机和安卓系统的植物监控和分享平台”项目,而我在SRTP中负责的就是通过湿度传感器采集土壤中的温湿度信息并在单片机上显示的部分,但是因为在SRTP中的传感器是直接在在网上购买的而且基于进度的要求并没有对传感器的参数、性能等做过多的研究,所以也想借这次探究实验的机会加深对湿度传感器一些方面的了解,对于接下来的SRTP进程也有很大的帮助。 而且就像老师上课说的那样,对于一门课的学习更好的方法实际上是应该是通过对一个载体循序渐进、逐渐深入地结合理论和实践的了解和探究,所以这次的实验实际上也是给了我这样一个机会,让我能通过实践和理论结合的方法去学习,也让我感受到这才是大学学习的魅力所在。同时,在实验过程中和队友们的协作探究以及相互帮助、解决困难也让我感受到了小组合作的快乐。
当然,在这个过程中也遇到了很多的问题,无论是一开始时候的迷茫还是一段时间后的瓶颈期都让我印象深刻,但幸运的是在队友之间的合作以及在老师、助教的帮助下我们最后顺利地完成了实验并且我也因此也收获了许多。
张紫莹: