DS18B20课程设计报告.docx
《DS18B20课程设计报告.docx》由会员分享,可在线阅读,更多相关《DS18B20课程设计报告.docx(17页珍藏版)》请在冰点文库上搜索。
DS18B20课程设计报告
课程设计
题目
DS18B20温度传感器的设计与制作
学院
计算机科学与信息工程学院
专业
测控技术与仪器
班级
一班
学生姓名
指导教师
王子康李昔华
2013
年
12
月
25
日
DS18B20温度传感器的设计与制作
一、选题背景
温度是一种在生产、科研、生活中需要测量和控制的重要物理量,是国际单位制七个基本量之一。
其测量控制一般采用各式各样形态的温度传感器。
根据它们在讯号输出方式上的不同可以分为模拟温度传感器和数字温度传感器。
单片机技术的出现则是为现代工业测控领域带来了一次新的技术革命。
目前温度报警器的发展已经比较成熟了,它能帮助我们实现想要的温度控制,解决身边的很多问题。
二.设计任务和要求
(1)设计一个采用DS18B20数字温度传感器的巡回检测报警仪,量程为0℃~60℃(也可以选择其它
(2)具有连接10个以上检测通道的能力,采用至少4位LED显示,其中1位显示通道号,3位显示实时温度(保留1位小数)。
(3)能设定10个通道的报警温度(精确到±1℃),具备超温声光报警功能。
(4)设计必要的操作按键。
(5)拓展部分:
具有RS232或RS485总线接口,能和PC机通信传送温度数据。
(6)安装、调试电路,采用水银温度计进行校对,记录测试数据,并对漂移、重复性、线性度等参数进行测试、分析。
(6)写出总结报告。
报告中应包括原理框图、参数曲线分析、操作方法、测控流程、实物照片等,调试过程中遇到的问题,改进方法和总结体会。
三.设计与分析
本设计是一个基于单片机的温度测量电路,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻虽然成本低,但是需要后续信号处理、A/D转换处理等才能将温度转换成数字信号,不但电路复杂,可靠性和精度也相对较低,在应用中还需要解决引线误差补偿、干扰等问题,故传统方案不可取。
进而非常容易考虑到使用温度传感器,在单片机电路设计中,单片机除了可以测量电信号外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛的应用于很多领域。
单片机的接口信号是数字信号,要用单片机作为控制器测量温度这类非电信号,就要使用温度传感器将温度信息转换为电流或者电压信号输出,如果转化的信号是模拟信号,还需要进行A/D转化,以满足单片机接口的需要。
进一步联想到可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,成功地进行温度采集以后,就可以利用单片机进行数据处理,然后通过数码管将温度显示出来,就可以满足设计要求。
本设计中,温度传感器采用DS18B20,控制器采用STC89C52RC,显示电路采用4位共阴数码管显示器实现,总体方框图如下:
总体方框图
在研究出总体设计方案后,在这一阶段主要的主要工作是查阅各芯片资料,熟悉其功能特性和技术参数,同时学习proteus软件,用其绘制出硬件原理图,然后继续分析各结构,查阅国内外相关技术资料,查缺补漏,反复修改设计方案,完成硬件方面的设计。
四.系统器件的选择
1.单片机的选择
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
图3.6STC89C52RC单片机
STC89C52RC的特点:
1、系统可编程特性:
创造了单片机学习开发系统的先例,可方便地在系统中实现程序下载,弥补了实时修改程序的不足之处,并可以立即从目标系统中反映出修改的结果,大大缩短单片机学习开发的周期,提高了工作效率。
2、代码全速仿真:
弥补传统学习系统不能全速仿真的缺陷,使系统运行的结果完全反映代码的执行情况,更切实地吻合人们工作、学习所需要的特点。
其次,在软件开发前的仿真调试后,完全可烧写入目标芯片,并能获得完全一致的代码执行结果。
是集学习、开发于一身的优良的目标系统。
3、资源的可重复利用性:
目标系统上的所有资源都能重复利用并能通过软件调配或通过扩展槽增加其它的功能,进而提高系统的实用性。
图3.8晶体接线图和外接时钟线图
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
主要特性如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
4.用户应用程序空间为8K字节
5.片上集成512字节RAM
6.通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
2.显示模块的选择
3.传感器模块DS18B20
温度传感器是该系统的关键器件,本设计采用的DS18B20温度传感器是美国DALLAS半导体公司最新推出的一款改进型智能温度传感器,它集温度测量、A/D转换为一体,其温度测量范围从-55OC到+125OC,精度为±0.5°C,可在1秒钟内把温度变换成数字。
它支持3V~5.5V的电压范围,使系统设计更灵活、方便;其工作电源既可在远端引入,也可采用寄生电源方式产生;此外,与传统的热敏电阻等测温元件相比,DS18B20能直接读出被测量的温度,并且可以根据实际要求通过简单的编程实现9~12位的数字值读数方式,它可在1秒钟内把温度变换成数字;由DS18B20组建的温度测量单元体积小,便于携带和安装。
同时,DS18B20可以直接与单片机连接,无需后接A/D转换,控制简单。
整体来说DS18B20的性能是新一代产品中最好的,性能价格比也非常出色。
DS18B20外观图DS18B20引脚分布图
DS18B20的主要技术指标如下:
测量范围:
-55OC—+125OC;测量精度:
0.5OC;反应时间<=500ms。
4.按键控制
4个独立按键,K1一端与10u电容项链,另一端接地,当按键K1按下时,单片机和系统处于摸个确定的初试状态。
K1,K2,K3分别是设定键,增加键,减少键,系统上电后,进入键盘扫描子程序,以查询的方式确定各按键,完成温度初值的设定,系统进入主程序后按键功能无效。
5.驱动电路
驱动电路采用9012三极管(PNP)驱动方式。
驱动级应为射极输出或源极输出。
6.报警电路
本设计采用蜂鸣器报警电路,它由晶体管和蜂鸣器组成。
由单片机I/O口输出信号控制晶体管的导通或截止,晶体管导通,则蜂鸣器报警。
通过单片机来控制蜂鸣器产生报警声音。
7.温度控制的实现
系统工作时先由使用者设定预期达到的两位温度值,温度值输入后,打开电源,单片机自动复位,进行初始化,这时数码管显示器显示设定温度,以便操作人员核对设定温度,然后温度检测电路将测点的温度输入单片机,若实测温度高于设定温度时,则通过驱动电路报警;若实测温度低于设定温度是,则通过驱动电路报警;若在设定温度范围内,则状态不变。
图3.13温度测量报警系统原理图
将分开的各功能模块部分的设计工作完成以后,最后整体连接到一起,就得到这个设计的完整电路,在proteus中绘制好原理图以后仿真。
五.实物展示
六.软件程序
#include"reg52.h"
#defineucharunsignedchar//定义无符号字符的函数
#defineuintunsignedint//定义无符号整型
#definejump_ROM0xCC//写跳过读ROM指令。
因为只对一个DB18B20操作。
#definestart0x44//写温度转换指令,十进制为68
#defineread_EEROM0xBE//读暂存器,读内部RAM中9字节的温度
sbitDQ=P2^2;//DS18B02唯一与单片机连接的数据端
ucharTMPH,TMPL;//用于读取高低8位数据。
ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//代表0-9不带小数点
ucharcodetable1[11]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF,0x39};//代表0-9带小数点
ucharcodeLED_W[8]={0,1,2,3,4,5,6,7};
/****************************************************************************************
以下为延时函数,晶振为12MHz的时候,机器周期为1us,延时一次大约为:
16us。
*******************************************************************************************/
voiddelay(uintus)
{
uints;
for(s=0;s}
/**********************************************************************************
以下为复位函数resert()并且读取它的信号。
注意:
一个delay
(1)=16us
********************************************************************************************/
ucharresert(void)
{
ucharreceive_ready;
DQ=0;//DQ为数据输入端DS18B20
delay(32);//最好延时时间为480us。
本次为32*16=512us。
DQ=1;
delay(3);//延时等待。
receive_ready=DQ;//获取信号。
delay(25);//等待时间隙完。
不超过480us,本次为400us。
returnreceive_ready;//返回信号
}
/********************************************************************
*名称:
read_bit()
*功能:
从DS18B20读一个位值
*输入:
无
*输出:
从DS18B20读出的一个位值
***********************************************************************/
ucharread_bit()
{
uchari;
DQ=0;//数据输入端DS18B20
DQ=1;
for(i=0;i<3;i++);//从时间隙开始延时15us。
returnDQ;//读出的一个位值返回
}
/********************************************************************
*名称:
write_bit()
*功能:
向DS18B20写一位
*输入:
bitval(要对DS18B20写入的位值)
*输出:
无
***********************************************************************/
voidwrite_bit(bitval)
{
DQ=0;//先把数据位置0,开始时间隙。
delay
(1);//延时16us。
if(bitval==1)
DQ=1;
delay(5);//在其余的时间隙保持值。
DQ=1;
}
/********************************************************************
*名称:
read_byte()
*功能:
从DS18B20读一个字节
*输入:
无
*输出:
从DS18B20读到的值
***********************************************************************/
ucharread_byte()
{
uchari;
ucharvalue=0;
for(i=0;i<8;i++)
{
if(read_bit())//当read_bit()=0时,value=0;当read_bit()=1时,执行value|=0x01<
{
value|=0x01<
有一个为1则为1
}
delay(6);//等待剩下时间隙。
}
returnvalue;
}
/********************************************************************
*名称:
write_byte()
*功能:
向DS18B20写一个字节
*输入:
val(要对DS18B20写入的命令值)
*输出:
无
***********************************************************************/
voidwrite_byte(ucharval)
{
uchari,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&&0x01;
write_bit(temp);
}
delay(5);
}
//**************获取温度的数值************************************************
uintget_temp()
{
floatf_temp;
uinttemp;
P0=0x00;
resert();//通过单总线的所有执行(处理)都从一个初始化程序开始。
write_byte(jump_ROM);
jump_ROM=0xCC,//写跳过读ROM指令。
因为只对一个DB18B20操作。
write_byte(start);
start0x44写温度转换指令。
resert();
write_byte(jump_ROM);//写跳过读ROM指令。
因为只对一个DB18B20操作。
write_byte(read_EEROM);
read_EEROM=0xBE//读暂存器,读内部RAM中9字节的温度
TMPL=read_byte();//读取低字节的8位数据
TMPH=read_byte();//读取低字节的8位数据
temp=TMPH;//把高位的8字节数据付给temp。
temp<<=8;//两个字节为一个字
temp=temp|TMPL;
f_temp=temp*0.0625;//温度在寄存器里面是12位,分辨率为:
0.0625。
temp=f_temp*10+0.5;//扩大10倍为了保存以为小数点。
加0.5是为了四舍五入。
f_temp=f_temp+0.05;
returntemp;
}
voiddisplay(uinttem)
{
ucharj;
tem=get_temp();
for(j=500;j>0;j--)
{
P2=LED_W[4];
P0=tab[tem/100];
delay(200);
P2=LED_W[5];
P0=table1[tem/10%10];
delay(200);
P2=LED_W[6];
P0=tab[tem%10];
delay(200);
P2=LED_W[7];
P0=table1[10];
delay(200);
}
}
//*****************温度转换函数****************************
voidtempchange()
{
reset();//复位
delay(50);//延时50*16=800us
write_byte(jump_ROM);//写跳过读ROM指令。
因为只对一个DB18B20操作。
write_byte(start);//写温度转换指令。
}
/********************************************************************
*名称:
Main()*功能:
主函数*输入:
无*输出:
无
********************************************************************/
voidmain()
{
while
(1)
{
tempchange();//温度转换函数。
display(0);
}
}
六.心得体会
经过两个星期的实习,在此期间我们也失落过,也曾一度热情高涨。
从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。
生活就是这样,汗水预示着结果也见证着收获,整个设计通过了软件和硬件上的调试。
我想这对于自己以后的学习和工作都会有很大的帮助。
在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。
一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。
同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。
某个人的离群都可能导致导致整项工作的失败。
课程设计中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。
团结协作是我们实习成功的一项非常重要的保证。
而这次实习也正好锻炼我们这一点,这也是非常宝贵的。
对我们而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!