传感器终期报告第三版Word格式文档下载.docx
《传感器终期报告第三版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《传感器终期报告第三版Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
在常温下,LM35不需要额外的校准处理即可达到±
1/4℃的准确率。
其电源供应模式有单电源与正负双电源两种,其引脚如图一所示。
图4.1LM35封装
规格参数
1、工作电压:
直流4~30V;
2、工作电流:
小于133μA
3、输出电压:
+6V~-1.0V
4、输出阻抗:
1mA负载时0.1Ω;
5、精度:
0.5℃精度(在+25℃时);
6、漏泄电流:
小于60μA;
7、比例因数:
线性+10.0mV/℃;
8、非线性值:
±
1/4℃;
9、校准方式:
直接用摄氏温度校准;
10、额定使用温度范围:
-55~+150℃。
11、引脚说明:
①电源负GND;
②电源正VCC;
③信号输出S;
传感器参数
供电电压35V到-0.2V
输出电压6V至-1.0V
输出电流10mA
指定工作温度范围
LM35D0℃to+100℃
计算公式:
2.41602LCD液晶屏
1602LCD尺寸图
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
引脚接口说明表
1602液晶模块内部的控制器共有11条控制指令,如下表所示:
序号
指令
清显示
光标返回
*
置输入模式
I/D
S
显示开/关控制
D
C
B
光标或字符移位
S/C
R/L
置功能
DL
N
F
置字符发生存贮器地址
字符发生存贮器地址
置数据存贮器地址
显示数据存贮器地址
读忙标志或地址
BF
计数器地址
写数到CGRAM或DDRAM)
要写的数据内容
从CGRAM或DDRAM读数
读出的数据内容
控制命令表
仿真截图:
2.4蓝牙模块
蓝牙模块应用领域:
该模块主要用于短距离的数据无线传输领域。
可以方便的和PC机(PDA手机)的蓝牙设备相连,也可以两个模块之间的数据互通。
避免繁琐的线缆连接,能直接替代现有的串口线。
蓝牙模块封装信息:
<
BF10模块引脚图>
系统框图及应用电路图:
系统框图
应用电路图
注:
蓝牙模块供电推荐使用AMS1117等纹波小的稳压芯片
2.5触摸按键模块
TTP223是触摸键检测IC,提供1个触摸键。
触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的。
低功耗和宽工作电压是触摸键的DC和AC特点。
1.工作电压2.0V~5.5V
2.工作电流@VDD=3V,无负载,SLRFTB=1
低功耗模式下典型值1.5uA,最大值3.0uA
快速模式下典型值3.5uA,最大值7.0uA@VDD=3V,无负载,SLRFTB=0
低功耗模式下典型值2.0uA,最大值4.0uA
快速模式下典型值6.5uA,最大值13.0uA
3.最长响应时间大约为快速模式下60mS,低功耗模式下220mS@VDD=3V
4.灵敏度可由外部电容(0~50pF)调节
5.由选择管脚(SLRFTB管脚)提供两个采样长度的选择
6.人体触摸检测稳定,可取代传统的直接的开关键
7.由选择管脚(LPMB管脚)提供快速模式和低功耗模式的选择
8.由选择管脚(TOG管脚)提供直接模式、触发模式的选择
同时还保留漏极开路(OpenDrain)输出模式,OPDO管脚为漏极开路(OpenDrain)输出,Q管脚为CMOS输出
9.各输出模式都可通过选择管脚(AHLB管脚)选择高电平或者低电平有效
10.由选择管脚(MOTB管脚)提供100sec最长输出时间选择
11.有外部上电复位管脚(RST管脚)
12.上电之后需要约0.5sec的稳定时间,此时间段内不要对键进行触摸,
此时所有功能都被禁止
13.始终进行自校准
三、硬件电路设计
整体框图:
仿真图;
3.1粉尘传感器电路设计
3.2LM35D温度传感器电路设计
3.3DS1302电路
3.41602LCD模块电路设计
3.5按键电路
3.6报警电路
四、程序设计及软件应用
五、实验数据
从串口助手读数据:
用示波器观察烟尘传感器的输出
实际侧视图片:
附件:
程序清单
/**************************
**函数名称:
pm2.5检测传输
**函数功能:
接收pm2.5传感器数值串口发送出去
**王明祥张春婷2015.11.18
**************************/
#include<
stc12c5a60s2.h>
LCD1602.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitSCLK=P1^0;
//DS1302始终控制总线
sbitDATA=P1^1;
//DS1302数据传输总线
sbitRESET=P1^2;
//DS1302复位总线
uchartable2[8];
ucharsecond,minute,hour,day,month,year;
//定义秒分时日月年变量
voiddelay1ms(void)//误差-0.018084490741us
{
unsignedchara,b;
for(b=18;
b>
0;
b--)
for(a=152;
a>
a--);
_nop_();
//ifKeil,requireuseintrins.h
}
voiddelaynms(ucharm)
while(m--)
{
delay1ms();
}
/***********************
延时函数
***********************/
voiddelay()
/*******************************
单片机小精灵生成的延时1us代码
*******************************/
voiddelay1us(void)//误差-0.005353009259us
unsignedchara;
for(a=1;
/***********************************
延时nus
***********************************/
voiddelaynus(uinti)
while(i--)
delay1us();
/************************************
函数功能:
串口初始化
波特率:
2400
工作方式:
工作方式1
************************************/
voidUART_Init()
TMOD=0x20;
//定时器1工作方式2八位自动重装模式
TL1=0xF4;
//波特率2400
TH1=0xF4;
//
TR1=1;
//开启定时器1
SM0=0;
SM1=1;
//串行口通信方式1八位uart波特率可变
REN=1;
//允许串行口接收
ES=0;
//关闭串行口中断
ADC初始化
voidADC_Init()
P1M0=0x08;
//P1.3开漏模式00001000P1.3因为按键用到了P1.4-P1.7而时钟用到了P10-P12
P1M1=0x08;
//P1.0开漏
ADC_CONTR&
=0xF8;
//设置转换速度最快
ADC_CONTR|=0x03;
//设置P1.3引脚为输入模拟量
delaynms(5);
//等待输入稳定
ucharAD_Change()
ucharresult;
ADC_CONTR|=0x88;
//启动转换
while((ADC_CONTR&
0x10)==0);
//等待转换结束
=0xE7;
//清标志位,停止AD转换
result=ADC_RES;
result<
=2;
result=result+(ADC_RESL&
0x03);
//结果只取高八位
return(result);
/*****************************
向DS1302中写入一个字节的函数
*****************************/
voidDS1302_WriteByte(uchardat)
uchari;
for(i=0;
i<
8;
i++)//8位计数器
SCLK=0;
//时钟线拉低
delay();
//延时等待
dat>
>
=1;
//移出数据
DATA=CY;
//送出到端口
SCLK=1;
//时钟线拉高
/**************************************
从DS1302读1字节数据
**************************************/
ucharDS1302_ReadByte()
uchardat=0;
SCLK=0;
delay();
//数据右移一位
if(DATA)dat|=0x80;
//读取数据
SCLK=1;
returndat;
/**********************************
向DS1302某个地址写入一个数据
**********************************/
voidWriteDat(ucharAddr,ucharData)
RESET=0;
SCLK=0;
RESET=1;
delaynus
(2);
//延时2us使硬件做好准备
DS1302_WriteByte(Addr);
//写入命令字
DS1302_WriteByte(Data);
//写入数据
SCLK=1;
//禁止数据传输
从1302某个地址读取一个字节的数据
***************************C*********/
ucharReadDat(ucharAddr)
unsignedchardat;
//拉低RST
//确保写数居前SCLK被拉低
//启动数据传输
//写入命令字
dat=DS1302_ReadByte();
//读出数据
//将时钟电平置于已知状态
//禁止数据传递
//将读出的数据返回
/*************************************
1302初始化
初始化时间:
15年11月3日
voidInit_DS1302(void)
WriteDat(0x8E,0x00);
//根据写状态寄存器命令字,写入不保护指令
WriteDat(0x80,((0/10)<
4|(0%10)));
//根据写秒寄存器命令字,写入秒的初始值
WriteDat(0x82,((5/10)<
4|(5%10)));
//根据写分寄存器命令字,写入分的初始值
WriteDat(0x84,((19/10)<
4|(19%10)));
//根据写小时寄存器命令字,写入小时的初始值
WriteDat(0x86,((3/10)<
4|(3%10)));
//根据写日寄存器命令字,写入日的初始值
WriteDat(0x88,((11/10)<
4|(11%10)));
//根据写月寄存器命令字,写入月的初始值
WriteDat(0x8c,((15/10)<
4|(15%10)));
//根据写年寄存器命令字,写入小时的初始值
读数据
voidRead_Data(void)
ucharReadValue;
ReadValue=ReadDat(0x81);
//读取1302的秒数据
second=((ReadValue&
0x70)>
4)*10+(ReadValue&
0x0F);
//将读出的BCD码转化成10进制数据
ReadValue=ReadDat(0x83);
//从分寄存器读
minute=((ReadValue&
4)*10+(ReadValue&
//将读出数据转化
ReadValue=ReadDat(0x85);
hour=((ReadValue&
ReadValue=ReadDat(0x87);
day=((ReadValue&
ReadValue=ReadDat(0x89);
month=((ReadValue&
ReadValue=ReadDat(0x8d);
year=((ReadValue&
//有争议,不确定是否是&
0x70也许是0xf0
table2[0]=0x30+hour/10;
table2[1]=0x30+hour%10;
table2[2]='
:
'
;
table2[3]=0x30+minute/10;
table2[4]=0x30+minute%10;
table2[5]='
table2[6]=0x30+second/10;
table2[7]=0x30+second%10;
时钟显示函数
**
voidShow_Data()
uinti;
Write_1602_Com(0x48|0x80);
for(i=0;
i<
i++)
Write_1602_Data(table2[i]);
/************************
**蜂鸣器
************************/
voidbeep()//产生1KHZ频率声音的函数
P36=0;
delaynus(500);
P36=1;
voidmain()
{uinti,j;
uchardat,AD_result;
floatpm25_result,tempurature;
ucharup2=80;
ucharcal[7]={0};
UART_Init();
LCD_1602_Init();
ADC_Init();
Init_DS1302();
while
(1)
AD_result=AD_Change();
tempurature=(AD_result*5.0)/1024*100;
Write_1602_Com(0x40|0x80);
Write_1602_Data('
T'
);
Write_1602_Data(0x30+tempurature/100);
Write_1602_Data(0x30+tempurature/10);
Write_1602_Data(0x30+(uchar)tempurature%10);
.'
Write_1602_Data(0x30+(uchar)(tempurature*10)%10);
C'
dat=SBUF;
while(!
RI);
RI=0;
if(dat==170)
i=0;
cal[i]=dat;
else
i=i+1;
if(i==6)
for(j=0;
j<
7;
j++)
SBUF=cal[j];
TI);
TI=0;
pm25_result=(float)(cal[1]*256+cal[2])/1024*5.0*250;
Write_1602_Com(0x00|0x80);
P'
M'
2'
5'
Write_1602_Data(0x30+pm25_result/100);
Write_1602_Data(0x30+(uchar)pm25_result%100/10);
Write_1602_Data(0x30+(uchar)pm25_result%10);
Write_1602_Data(0x30+(uchar)(pm25_result*10)%10);
u'
g'
/'
m'
3'
//
////delaynms(1000);
if((p