广西科技大学单片机DS18b20温度传感器课程设计Word文件下载.docx
《广西科技大学单片机DS18b20温度传感器课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《广西科技大学单片机DS18b20温度传感器课程设计Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
参考文献9
附1源程序代码10
附2原理图…..…………………………………………………………………19
1.概述
1.1课程设计的意义
本次课程设计是在我们学过单片机后的一次实习,可增加我们的动手能力。
特别是对单片机的系统设计有很大帮助。
本课程设计由六个人共同完成,在锻炼了自己的同时也增强了自己的团队意识和团队合作精神。
1.2设计的任务和要求
1、基本范围-55℃-125℃2、精度误差小于0.5℃3、LCD液晶显示4、可以任意设定温度的上下限报警功能
2.系统总体方案及硬件设计
2.1数字温度计设计方案论证
2.1.1方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。
而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。
2.2.2方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。
2.2系统总体设计
温度计电路设计总体设计方框图如图1所示,控制器采用单片机STC12C5A16S2,温度传感器采用DS18B20,用LCD液晶以串口传送数据实现温度显示。
2.3系统模块系统由单片机最小系统、时钟振荡、显示电路、按键、温度传感器等组成。
2.3.1主控制器
单片机STC12C5A16S2具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
晶振采用12MHZ。
复位电路采用上电加按钮复位。
2.3.2显示电路
显示电路采用LCD液晶显示,P0口由上拉电阻提高驱动能力,作为段码输出。
2.3.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
1、独特的单线接口仅需要一个端口引脚进行通信;
2、多个DS18B20可以并联在惟一的三线上,实现多点组网功能3、无须外部器件;
4、可通过数据线供电,电压范围为3.0~5.5V;
5、零待机功耗;
6、温度以9或12位数字;
7、用户可定义报警设置;
8、报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
9、负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
2.3.4报警温度调整按键
本系统设计只需三个按键,采用查询方式,一个用于选择切换设置报警温度,另外两个分别用于设置报警温度的加和减。
均采用软件消抖。
3.系统软件算法分析
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,按键扫描处理子程序等。
3.1主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见下图所示。
3.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如下图示。
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如下图。
3.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如下图所示。
3.5显示数据刷新子程序
显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。
程序流程图如下图。
3.6按键扫描处理子程序
按键采用扫描查询方式。
4.实验仿真
进入protuse后,连接好电路,并将程序下载进去。
将DS18B20的改为0.1,LCD显示温度与传感器的温度相同。
当按下选择键一次时,进入温度报警上线调节,此时显示软件设置的温度报警上线,按up或down分别对报警温度进行加一或减一。
当再次按下选择键时,进入温度报警下线调节,此时显示软件设置的温度报警下线,按up或down分别对报警温度进行加一或减一。
当第三次按下选择键时,退出温度报警线设置,显示当前温度。
5.总结与体会
通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。
但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。
在焊接过程中,我们粗心大意将电源开关焊反了,虽然不影响使用,可是还是给我们提了个醒,焊接任何元件之前必须得弄清它的正确焊接方法,不能自以为然、想当然,要实实在在,脚踏实地。
电路板可能由于在焊接过程没掌握好时间,使得板子持续高温,损坏某些元件,从而影响了板子的一些功能,焊接技术有待在以后的实践中提高。
由于本人的的编程能力有限,无法实现修改上下限温度。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
参考文献
1曹巧媛主编.单片机原理及应用(第二版).北京:
电子工业出版社,2002
2全国大学生电子设计竞赛组委会编.第五届全国大学生电子设计竞赛获奖作品选编(2001),北京:
北京理工大学出版社,2003
3何力民编.单片机高级教程.北京:
北京航空大学出版社,2000
4金发庆等编.传感器技术与应用.北京机械工业出版社,2002
5王锦标,方崇智.过程计算机控制.北京:
清华大学出版社,1997;
6邵惠鹤.工业过程高级控制.上海:
上海交通大学出版社,1997;
7胡寿松.自动控制原理.北京:
国防工业出版社,2000;
8刘伯春.智能PID调节器的设计及应用.电子自动化,1995;
9KatsuhikoOgata.ModenControlEngineering.Publishinghouseofelectronicsindustry,2000:
10周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真[M].北京:
航空航天
大学出版社,2006
11王忠飞,胥芳.MCS-51单片机原理及嵌入式系统应用[M].西安:
西安电子科技大学出
版社,2007.
12刘国钧,陈绍业,王凤翥.图书馆目录.第1版.北京:
高等教育出版社,1957
13Microchip24C01B/02B8位PIC®
单片机产品手册[ED/OL],
14赵娜,赵刚,于珍珠等.基于51单片机的温度测量系统[J].微计算机信息,2007
15BorkoH,BernierCL.Indexingconceptsandmethods.NewYork:
Academic
附1源程序代码
#include<
reg52.h>
#include<
intrins.h>
math.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitbeep=P1^0;
//位定义报警显示灯
sbitxuanze=P0^0;
//位定义选择按键
sbitup=P0^1;
//位定义极限加
sbitdown=P0^2;
//位定义极限减
intth=35,tl=20;
//初始上限值和下限值
uchari,num=0;
//定义变量
/*******************************************************
延时函数
*******************************************************/
voiddelay(uintt)
{
uintx,y;
for(x=t;
x>
0;
x--)
for(y=110;
y>
y--);
}
/*************************************************
LCD部分
***************************************************/
sbitrs=P2^1;
sbitrw=P2^2;
sbitE=P2^3;
uchartmp5[]="
temp:
"
;
uchartmp6[]="
^C"
ucharcodetab1[]="
TH:
ucharcodetab2[]="
TL:
write_com(ucharcom)//LCD写地址函数
{
P2=0X18;
//rs=0,rw=0,E=1
P0=com;
delay(5);
E=0;
write_data(uchardat)//LCD写数据函数
P2=0X1A;
//rs=1,rw=0,E=1
P0=dat;
init_lcd()//LCD初始化函数
write_com(0x38);
//16*2显示,5*7点阵,8位数据
write_com(0x0c);
//设置为显示开,关光标,不闪烁
write_com(0x06);
//写操作后,AC自动加1
write_com(0x01);
//LCD清屏
write_com(0x80+0x01);
//LCD第一行第二个位置起显示"
for(i=0;
i<
3;
i++)
{
write_data(tab1[i]);
}
write_com(0x80+0x09);
//LCD第一行第10个位置起显示"
{
write_data(tab2[i]);
write_com(0x80+0X40+0x00);
//LCD第二行开始出显示"
5;
write_data(tmp5[i]);
write_com(0x80+0X40+8);
//显示温度的单位
2;
write_data(tmp6[i]);
//以下是温度的上限和下限初始化显示部分
write_com(0x80+0x00+4);
write_data('
+'
);
write_data(th/10+0x30);
write_data(th%10+0x30);
write_com(0x80+0x00+12);
write_data(tl/10+0x30);
write_data(tl%10+0x30);
/*********************************************************
DS18B20部分
**********************************************************/
uchartimecount;
//定义中断次数
uchartest0,test1,test;
//温度值变量
uchara1,a2,a3;
//温度整数部分的十位,个位和小数部分的十分位
ucharreaddate[2];
//定义数组,用来暂存读取的温度值
sbitDQ=P1^7;
//DS18B20数据口
bitflag;
//定义温度的正负标志位
voiddelay1(uinti)//短延时函数
while(i--);
voidreset()//DS18B20的复位函数
ucharx=0;
DQ=1;
//使总线为高电平
delay1(8);
//延时
DQ=0;
//使总线为低电平
delay1(80);
//延时,大于480us
delay1(14);
//延时,等待DS18B20回应低电平
x=DQ;
//将DS18B20的回应读到变量x,用于判断复位是否成功
delay1(20);
//延时一段时间结束
voidwritecmd(ucharcmd)//DS18B20的写字节函数
uchari=0;
//定义位循环变量
for(i=8;
i>
i--)//循环8次
//总线拉低
DQ=cmd&
0x01;
//将发送字节的最低位送到总线
delay1(5);
//延时(30us),等待DS18B20取走总线数据
//总线拉高
cmd>
>
=1;
//将待发送的字节右移后,继续发送
ucharreaddat()//DS18B20的读字节函数
uchartemp=0;
//定义暂存变量
//总线为低电平
temp>
//暂存变量右移
//总线拉高,执行如下的读操作
if(DQ)//如果DS18B20输出高电平
temp|=0x80;
//将暂存变量的最高位置1
delay1(4);
//延时一段时间
returntemp;
//程序结束后,将暂存变量返回调用程序
/***************************************************
按键设置上线温度和下限温度值函数
****************************************************/
voidkey1()
P0=0X28;
P2=0X90;
P2=0X10;
P0=0xff;
P2=0X00;
//打开74hc245
delay(10);
if(P0==0xfe)//如果选择键按下
delay(10);
//延时消抖
if(P0==0xfe)//如果按键还处于按下状态
{
num++;
//次数加1
while(P0==0xfe);
//等待按键抬起
}
if(num==1)//如果按下选择键的次数为1
TR0=0;
//关闭中断
write_com(0x80+0x00+6);
//光标移到第一行第七个位置
write_com(0x0f);
//设置为显示开,开光标,闪烁
if(num==2)//如果按下选择键的次数为2
write_com(0x80+0x00+14);
//光标移到第一行第十五个位置
if(num==3)//如果按下选择键的次数为3
num=0;
//次数清零
write_com(0x0c);
TR0=1;
//开中断
voidkey2()
if(num==1)
if(P0==0xfd)
{
delay(10);
if(P0==0xfd)
{
th++;
while(P0==0xfd);
}
}
if(num==2)
if(P0==0xfb)
delay(10);
if(P0==0xfb)
tl++;
while(P0==0xfb);
}
if(num==1)
if(th>
=0)//如果上线值为正
write_data('
//显示正号
write_com(0x80+0x00+5);
write_data(th/10+0x30);
//显示上限温度值的十位
//显示上限温度值的个位
if(th<
0)
write_com(0x80+0x00+4);
write_data('
-'
//显示负号
write_com(0x80+0x00+5);
write_data(th/10+0x30);
write_data(th%10+0x30);
if(num==2)//如果选择键按了两次
if(tl>
=0)//如果下限温度值为正
//显示正号
//
write_com(0x80+0x00+13);
//显示下限温度值的十位
//显示下限温度值的个位
if(tl<
write_com(0x80+0x00+12);
write_data('
write_com(0x80+0x00+13);
write_data(tl/10+0x30);
write_data(tl%10+0x30);
/******************************************************
报警函数
********************************************************/
voidBEEP()
if((test>
=th)||(test<
=tl))//如果测得的温度值>
=上限温度值(TH)或<
=下限温度值(TL)
beep=~beep;
//蜂鸣器响
else
beep=0;
//否则发蜂鸣器不响
/********************************************************
主函数
voidmain()
init_lcd();
//初始化LCD
TMOD=0X01;
//定时器0,方式1
TH0=0X3C;
//50ms溢出一次
TL0=0XB0;
TR0=1;
//启动定时器0
ET0=1;
//开定时器0
EA=1;
//开总中断
while
(1)
key1();
//调用按键函数
key2();
BEEP();