传感器课程设计1.docx
《传感器课程设计1.docx》由会员分享,可在线阅读,更多相关《传感器课程设计1.docx(9页珍藏版)》请在冰豆网上搜索。
传感器课程设计1
课程设计(大作业)报告
课程名称:
传感器原理及应用
设计题目:
利用DS18B20采集温度
摘要
利用DS18B20采集温度,本次传感器原理及应用课程设计,就是用KL25芯片实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。
本次采用DS18B20数字温度传感器来实现温度计的设计。
显示传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是温度传感DS18B20的数据采集过程。
本文主要是运用DS18B20来完成实验,KL25微秒级延时,编写程序代码并进行修改,程序代码主要0是低电平,1是高电平,每次读要复位,读设置为输
入,写设置为输出。
关键词:
DS18B20传感器、KL25微妙延时、数据采集。
课程设计(大作业)报告1
一、题目分析1
二、基本理论1
三、总体设计及分析1
1、总体内容1
2、仿真图及原理图2
3、工作原理3
4、串口测试结果4
四、实验器材5
1、器件5
2、DS18B20的特点5
五、程序代码及分析5
六、总结9
七、参考文献10
课程设计(大作业)报告
一、题目分析
利用DS18B20采集温度,本次传感器原理及应用课程设计,就是用KL25芯片实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。
本次采用DS18B20数字温度传感器来实现温度计的设计。
利用DS18B20采集温度,显示传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是温度传感器DS18B20的数据采集过程。
温度传感器DS18B20的数据采集,把程序代码烧到KL25芯片,连接面包板上的电路,与芯片相连接,通过串口采集,显示十进制,把环境温度采集到串口上显示出来。
KL25芯片自身就有温度传感器,可以通过引脚配置,采集传感器监测到的温度,但是此时监测到的温度并不能用摄氏度进行显示,得到的数据只是原始数据,无法与真实的温度联系在一起,因此我们需要采用回归的方法,将采集到的数据转换为我们所广泛认知的摄氏温度,从而显示在PC界面中。
二、基本理论
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成,每完成一次都需要复位。
DS18B20的写时序,对于DS18B20的写时序仍然分为写0时序和写1时序两个过程,对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单线。
初始化端口A的1号引脚,定义为输出一个高电平,设置A端口的1号引脚状态为低,进行复位,发送读数据。
三、总体设计及分析
1、总体内容
DS18B20有三只引脚:
DQ数字信号输入/输出端,和VDD电源输入端,GND接地。
提及到温度的检测,我们首先会考虑传统的测温元件有热电偶和热电阻,而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试也复杂,制作成本高。
因此,本数字温度计设计采用智能温度传感器DS18B20作为检测元件,测温范围为-55°C至+125°C,最大分辨率可达0.0625°C。
DS18B20可以直接读出被测量的温度值,而采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
通过KL25芯片,面包板,温度传感器DS18B20,导线等将电路连接起来,温度传感器DS18B20采集到的温度通过PC机界面显示出来。
2、仿真图及原理图
图1DS18B20仿真图
DS18B20有三只引脚:
DQ数字信号输入/输出端,和VDD电源输入端,GND接地。
图2DS18B20的读写时序图
(1)DS18B20写逻辑的步骤:
写逻辑0,单片机拉低电平大约10-15us,单片机持续拉低电平大约20-45us的时间,释放总线;写逻辑1,单片机拉低电平大约10-15us,单片机拉高电平大约20-45us的时间,释放总线。
(2)DS18B20读逻辑的步骤:
读逻辑0,在读取的时候单片机拉低电平大约1us,单片机释放总线,然后读取总线电平,这时候DS18B20会拉低电平,读取电平过后,延迟大约40-45微妙;读逻辑1,在读取的时候单片机拉低电平大约1us,单片机释放总线,然后读取总线电平,这时候DS18B20会拉高电平,读取电平过后,延迟大约40-45微妙。
DS18B20的写时序,对于DS18B20的写时序仍然分为写0时序和写1时序两个过程,对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单线。
3、工作原理
我们使用单点,单线总线上仅有一个DS18B20存在,不需要刻意读取ROM里面的序列号来,然后在匹配DS18B20而是更直接的跳过ROM指令,然后直接执行DS18B20功能指令。
DS18B20复位,在,某种意义上就是一次访问DS18B20的开始,也就是开始信号。
ROM指令,就是访问,搜索匹配,DS18B20的64位序列号的动作。
使能Systick定时器(即向控制及状态寄存器的第0位写1),开始延时。
监控控制及状态寄存器的16位,如该位为1,失能Systick定时器(即向控制及状态寄存器的第0位写0),完成延时。
DS18B20的写时序,对于DS18B20的写时序仍然分为写0时序和写1时序两个过程,对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单线。
初始化端口A的1号引脚,定义为输出一个高电平,设置A端口的1号引脚状态为低,进行复位,发送读数据。
4、串口测试结果
图3串口测试图
PC机界面显示:
步骤一、将芯片串口引脚与电脑连接,给芯片通电,然后选择串口,波特率后按打开串口按钮。
步骤二、按下采集温度按钮之后开始采集芯片温度。
步骤三、显示十进制温度
4、实验器材
1、器件:
传感器DS18B20、电阻、面包板、KL25芯片、若干导线。
2、DS18B20的特点:
DS18B20是单线数字温度传感器,它的体积更小,适用电压更宽,更经济。
DS18B20的性能特点如下:
(1)独特的单线接口仅需要一个端口引脚进行通信;
(2)多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
(3)无须外部器件;
(4)可通过数据线供电,电压范围为3.0-5.5V;
(5)零待机功耗;
(6)温度以9或12位数字;
(7)用户可定义报警设置。
5、程序代码及分析
main.c
#include"includes.h"//包含总头文件
intmain(void)
{
unsignedinti=0;
unsignedintt=0;
unsignedinte=0;
DISABLE_INTERRUPTS;
uart_init(UART_1,BUSCLK,9600);
Uart_enable_re_i(UART_1);
//enable_pit_int();
ENABLE_INTERRUPTS;
//主循环开始
for(;;)//一个死循环
{
i=getTmpValue();//获取温度函数调用
t=i/10;//表示整数
e=i%10;//表示小数
//i=(float)t+0.1*e;
uart_send1(UART_1,t);
uart_send1(UART_1,e);
//sprintf(UART_1,"%d.%d\t",t,e);
}//主循环end_for
//主循环结束==============================================================
return0;
}
ds18b20.c
#include"ds18b20.h"
#include"delay.h"
voidDS18B20_Rset()//复位
{
gpio_init(PORTA|
(1),OUT,High);//初始化端口A的1号引脚,定义为输出一个高电平
gpio_set(PORTA|
(1),Low);//设置A端口的1号引脚的状态为低
Delay_750us();//延时750us
gpio_set(PORTA|
(1),High);//设置A端口的1号引脚的状态为高
Delay_15us();////延时15us
}
unsignedcharreadBit()//读取一个位
{
unsignedcharb;
gpio_init(PORTA|
(1),OUT,High);//初始化端口A的1号引脚定义为输出一个高电平
gpio_set(PORTA|
(1),Low);//设置A端口的1号引脚的状态为低
Delay_2us();//延时2us
gpio_set(PORTA|
(1),High);//设置A端口的1号引脚的状态为高
gpio_init(PORTA|
(1),IN,High);//初始化端口A的1号引脚,定义为输出一个高电平
Delay_12us();//延时12s
b=gpio_get(PORTA|
(1));//获取A端口的1号引脚的状态赋值给b
Delay_50us();//延时50us
returnb;//返回获取的状态b
}
unsignedcharreadByte()//读取一个字节
{
unsignedinti;
unsignedcharj,dat;
dat=0;
for(i=0;i<8;i++)
{
j=readBit();
dat=(j<<7)|(dat>>1);
}
returndat;
}
voidwriteByte(unsignedchardat)//写一个字节dat
{
unsignedcharj;
unsignedcharb;
gpio_init(PORTA|
(1),OUT,High);//初始化端口A的1号引脚,定义为输出一个高电平
for(j=0;j<8;j++)
{
b=dat&0x01;
dat>>=1;//dat右移1位后赋给dat
if(b)//如果b=1写入1,否则写0
{
gpio_set(PORTA|
(1),Low);//设置A端口的1号引脚的状态为低
Delay_2us();//延时2us
gpio_set(PORTA|
(1),High);//设置A端口的1号引脚的状态为高
Delay_60us();//延时60us
}
else
{
gpio_set(PORTA|
(1),Low);//设置A端口的1号引脚的状态为低
Delay_60us();//延时60us
gpio_set(PORTA|
(1),High);//设置A端口的1号引脚的状态为高
Delay_2us();//延时2us
}
}
}
voidsendChangeCmd()//开始温度转换
{
DS18B20_Rset();//复位
Delay_ms
(1);//延时1ms
writeByte(0xcc);//跳过ROM,直接向DS18B20发温度转换命令
writeByte(0x44);//启动DS18B20进行温度转换
}
voidsendReadCmd()
{
DS18B20_Rset();
Delay_ms
(1);
writeByte(0xcc);//跳过ROM,直接向DS18B20发温度转换命令
writeByte(0xbe);//读内部数据
}
shortgetTmpValue()
{
unsignedinttmpvalue;
intvalue=0;
unsignedcharlow,high;
sendChangeCmd();//开始转换指令
Delay_ms(1000);//温度转换时间需要750ms以上
sendReadCmd();//发送读数据
low=readByte();
high=readByte();
tmpvalue=high;
tmpvalue<<=8;//左移八位
tmpvalue|=low;
value=(float)tmpvalue*0.625;
returnvalue;
}
ds18b20.h
#ifndefSOURCE_DS18B20_H_
#defineSOURCE_DS18B20_H_
#include"includes.h"//包含总头文件
#include"gpio.h"
#defineHigh1
#defineLow0
#defineOUT1
#defineIN0
voidDS18B20_Rset();//复位
unsignedcharreadBit();//读取一个位
unsignedcharreadByte();//读取一个字节
voidwriteByte(unsignedchardat);//写一个字节dat
voidsendChangeCmd();//开始温度转换
voidsendReadCmd();
shortgetTmpValue();
voidDelay_50us();
#endif/*08_SOURCE_DS18B20_H_*/
初始化端口A的1号引脚,定义为输出一个高电平,设置A端口的1号引脚状态为低,初始化端口A的1号引脚,定义状态为低,赋值后进行复位,跳过ROM直接向DS18B20发送转换命令,读内部数据,再次复位,开始温度转换。
6、总结
通过此次传感器原理及应用课程设计,我根据传感器原理这门科目很好的应用起来完成,在课程设计期间,主要是运用DS18B20来完成实验,KL25微秒级延时,编写程序代码并进行修改,程序代码主要0是低电平,1是高电平,每次读要复位,读设置为输入,写设置为输出。
编写完成程序代码运行中出现了好多个错误和警告,与同学讨论之后改正了几个错误但是还存在错误没有修改完,后面又问了其他同学加上自己查阅资料,找出了错误的出处是由于引脚在程序中填写错误,有的引脚是不可以用的。
在这次课程设计中让我更加的掌握了这门课程中平时所没有掌握的知识,并且能够把传感器原理应用在实验中是很好的,把这门课程所学的知识点相运用起来,也提高了我的知识领域。
结束了一周的课程设计,也让我从课程设计中学到了一些在平时学习中所没有掌握住的知识点,而且在课程设计期间也去图书馆查阅了大量的资料,去了解更多关于温度传感器DS18B20的知识。
课程设计也教会我们做事情一定要坚持,就比如在课程设计的时候,我刚开始的程序代码是运行不出来的,经过几天的修改总算可以运行了,和同学讨论也是避免不了的。
7、参考文献
[1]李广弟.单片机基础.北京:
北京航空航天大学出版社,199.
[2]韩颖;Proteus在单片机技术实训教学中的应用[J];中国科教创新导刊;2008年31期.
[3]谭浩强.C程序设计教程[M].清华大学出版社,2007.
[4]余孟尝.数字电子技术基础[M].高等教育出版社.