DS18B20数字温度计的设计.docx
- 文档编号:12064248
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:37
- 大小:141.17KB
DS18B20数字温度计的设计.docx
《DS18B20数字温度计的设计.docx》由会员分享,可在线阅读,更多相关《DS18B20数字温度计的设计.docx(37页珍藏版)》请在冰豆网上搜索。
DS18B20数字温度计的设计
摘要
日常生活中人们需要测量各种各样的温度。
环境温度对工业、农业、商业都有很大的影响。
传统的测温仪测量费时,准确度也较低,数字温度计与传统的温度计相比,具有读数速度快,测温范围广,其输出温度采用数字显示,便于用户使用。
随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,本设计所介绍的数字温度计使用单片机89C51,测温传感器使用DS18B20,用1602实现温度显示,利用DS18B20和一片89C51单片机即可构成一个简洁但功能强大的低电压温度测量控制系统。
关键词:
单片机、89C51、数字温度计。
Thedesignofdigitaldisplaythermometer
Abstract
Ondailylife,peopleneedmeasurevarietyoftemperature.Environmentaltemperaturehaveagreatimpactonindustry,agriculture,commerce.Traditionalmethodsneedalotoftime.andtheaccuracyislow.Comparedwiththetraditionalthermometer,thedigitalthermometerhaveanadvantageonreadingthedata,andhaveanwiderangeofmeasure,besides,astheoutputdisplayasthedigitalway,itisveryeasyforusers.
WiththecontinuousdevelopmentofSCMtechnology,MCUisusedmoreandmorewidely.WhatisusedinthisDescribedigitalthermometeris89C51,andTemperatureSensorisDS18B20.With1602temperaturedisplayinawaytoachieve.UsingDS18B20andan89C51microcontrollertoformasimplebutpowerfullow-voltagecontrolsystemfortemperaturemeasurement.
KeywordsMCU89C51DiditalThermometer
一、设计前言
1.1设计目的
1.理论联系实际,单片机应用,尝试设计案例程序
2.对主要元件功能有所了解
3.学会用C语言编写程序
4.培养设计项目程序流程图的思想
5.掌握项目中所使用到的元器件的硬件原理,并用protel99se软件画出它们的原理图
6.发扬团队合作力量
1.2设计内容
1.所设计实验装置以MCS-51系列单片机为核心器件,组成一个数字式温度计。
2.所设计实验装置能够利用LED直接显示出外界温度及温度变化。
3.所设计实验装置测试外界温度误差范围在±0.5℃之间。
4.具有对温度测量不在温度测量的范围内将会报警。
5.LM7805构成的5V稳压电源。
6.通过按键增减上下限温度值。
1.3设计要求
1.独立设计原理图及相应的硬件电路。
2.独立焊接电路板并对电路板调试。
3.针对选择的设计题目,设计系统软件。
软件要做到:
操作方便,实用性强,稳定可靠。
4.设计说明书格式规范,层次合理,重点突出。
并附上设计原理图、电路板图及相应的源程序。
二、设计方案
2.1方案论证
鉴于此设计题目,以下想到两种可能方案:
方案一热敏电阻
由于此设计是测温电路,所以想到使用热敏电阻,利用它的感温效应,在实验过程中记录在其温度变化时的电压或电流,进行A/D转换后,就可以用单片机进行数据处理,在显示电路上,就可以将被测温度显示出来。
方案二温度传感器
此设计利用温度传感器,采用一只温度传感器DS18B20,控制器单片机AT89S51,用液晶显示器显示温度。
此传感器可以直接读取被测温度的数值,进行转换,就可以满足设计的要求。
总结以上两种方案,方案一中的A/D转换电路,感温电路比较复杂。
而方案二比较简单,温度变化的数值可以很容易的读出,因此我们将采用方案二。
方案二的温度计电路设计总体方框图如图2-1所示。
图2-1方案设计
2.2设计原则
一般系统的设计原则包含安全性,操作性的便利性,实时性,通用性和经济性
1.安全可靠
首先要选用高性能的AT89C51单片机,保证在恶劣的工业环境下能正常运行。
其次是设计可靠的控制方案,并具备各种安全保护措施,如报警,事故预测,事故处理和不间断电源等。
2.操纵维护方便
操作方便表现在操作简单,直观形象和使于掌握且不强求操作要掌握计算机知识才能操作。
3.实时性强
选用高性能的AT89C51单片机实时性,表现在内部和外部事件能及时的响应,并作出相应处理。
4.通用性好
系统设计时应考虑能适应不同的设备和各种不同设备控制对象。
5.经济性
三、软件
3.1分析论证
看到此设计题目,首先想到两种可能的设计方案,几度思考之后我们选择了第二种,即利用传感器DS18B20来显示温度并通过按键来控制温度的上下限报警。
本设计以检测温度并显示温度提供上下限报警为目的,按照系统设计功能的要求,确定系统由6个模块组成:
主控器、测温电路,报警电路,按键电路,稳压电路及显示电路。
主控器:
系统以DS18B20为传感器用以将温度模拟量转化为数字量以总线传入单片机,以AT89S52为主芯片,在主芯片对DS18B20传入的温度值进行处理,由单片机程序控制,将经处理后的温度由LCD1602显示屏显示出来。
端口定义:
以单片机AT89C51为核心,充分利用其功能,来实现控制电路各个部件和谐有效的完成。
首先正确定义各个端口是首先实验程序进行最重要的事。
只有正确定义了端口,才能在单片机的各个引脚功能下有效的完成。
例如,蜂鸣器的端口定义为P0.5,其原理根据将蜂鸣器的一端接地,另一端接至P0某一脚,编写的简单程序使那一脚为高电平即可使其发出声音,当然也能延迟以及关闭等。
定义引脚之后便要申明变量,正确的申明变量也非常重要,特别是变量的类别,关系到数据的正确的显示问题,例如此项目中温度的申明类型,就应该选择浮点型。
延时程序:
前奏准备好后便开始编写程序,延时程序在项目中是必须存在的,其效果可达到让实验现象更加形象,清楚的显示出来,对实验的检测起到至关重要的作用,不可忽略。
而且延时的适当性对实验而言也是一个关键因素,太快或太慢会影响现象的效果,达不到预测的效果。
测温电路:
主要利用DS18B20传感器来感触温度的变化,并在1602LCD显示屏上显示出来。
查阅资料得知DS18B20传感器的温度范围在-55℃~+125℃之间变化,因此我们设定一个三位数的显示,首先设定百、十、个的显示及其位置,据temperature=((tempH*256)+tempL)*0.0625计算温度。
其DS18B20程序根据学习得知其主要程序流程如下:
延时函数、DS18B20初始化函数、读一个字节、写一个字节、读取温度、温度显示函数等。
显示电路:
主要利用LCD1602显示屏显示温度,根据我们学习的知识,编写了LED1602显示程序,其程序设计思路如下:
延时程序、检测LED1602忙碌状态、写指令、定义位置、写数据、初始化等。
报警电路:
当温度达到设定值时,系统会发出语音报警,同时有液晶显示,可看到被测物体温度或环境温度。
该设计能通过外部按键进行报警温度设置,在设定完毕后,液晶显示部分显示被测物体时温度,在被测物体达到预先设定的报警温度时,报警电路发出语音报警,物体温度上升至设定温度时,不进行报警,待温度重新下降到设定温度时进行报警,该温度计接收到外部温度后,将信号输入到中央处理器,由处理器进行识别,转化成相应的温度值,并通过显示电路进行显示。
按键电路:
主要利用四个按键来调节温度的上下限。
当温度超过最低最高限定值而且蜂鸣器发出报警信号,此时,我们可以通过按键来进行设置温度,一个按键控制温度加,即按键按下一次,温度上升一度,另一个按键控制温度减,即按键按下一次,温度下降一度。
稳压电源:
电源利用LM7805芯片组成稳压电源供电,其原理即利用变压器将220V高压经过整流桥转换为5V供电电压
通过以上几个模块的结合,利用Keil软件编写程序,调试成功后烧进已经做好的硬件设备即可。
3.2程序流程图
图3-1为主程序流程图,图3-2为显示LCD602子程序图
图3-1主程序流程图
图3-2显示LCD602子程序
3.3源程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P0^3;//定义DS18B20端口DQ
sbitBEEP=P0^5;//蜂鸣器驱动线
sbitKey1=P0^2;//确认健
sbitKey2=P0^0;//取消键
sbitKey3=P3^2;//加键
sbitKey4=P3^3;//减键
//sbitkk1=P3^2;
//sbitkk2=P3^3;
bitpresence;
intk=29;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharcodecdis1[]={"DS18B20OK"};
ucharcodecdis2[]={"TEMP:
.C"};
ucharcodecdis3[]={"DS18B20ERR0R"};
ucharcodecdis4[]={"PLEASECHECK"};
unsignedchardatatemp_data[2]={0x00,0x00};
unsignedchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};
unsignedcharcodetab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
voidbeep();
unsignedcharcodemytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
/*******************************************************************/
voiddelay1(intms)
{
unsignedchary;
while(ms--)
{
for(y=0;y<250;y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/******************************************************************/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待lcd-busy为0时,闲,可写指令与数据*/
/******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P1&0x80);
LCD_EN=0;
return(result);
}
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码*/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P1=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P1=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*LCD初始化设定*/
/*******************************************************************/
voidlcd_init()
{
delay1(15);
lcd_wcmd(0x01);//清除LCD的显示内容
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c);//显示开,关光标
delay1(5);
lcd_wcmd(0x06);//移动光标
delay1(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay1(5);
}
/*设定显示位置*/
/*******************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/*自定义字符写入CGRAM*/
/*******************************************************************/
voidwritetab()
{
unsignedchari;
lcd_wcmd(0x40);//写CGRAM
for(i=0;i<8;i++)
lcd_wdat(mytab[i]);
}
/*us级延时函数*/
/*******************************************************************/
voidDelay(unsignedintnum)
{
while(num--);
}
/*初始化ds1820*/
/*******************************************************************/
Init_DS18B20(void)
{
DQ=1;//DQ复位
Delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
Delay(90);//精确延时大于480us
DQ=1;//单片机拉高总线
Delay(8);
presence=DQ;//如果=0则初始化成功;=1则初始化失败
Delay(100);
DQ=1;
return(presence);//返回信号,0=presence,1=nopresence
}
/*读一个字节*/
/*******************************************************************/
ReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/*写一个字节*/
/*******************************************************************/
WriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
/*读取温度*/
/*******************************************************************/
Read_Temperature(void)
{
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
temp_data[0]=ReadOneChar();//温度低8位
temp_data[1]=ReadOneChar();//温度高8位
}
/*数据转换与温度显示*/
/*******************************************************************/
Disp_Temperature(intt)
{
floati;
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]+0x30;//查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
i=display[4];
if(i { BEEP=0; delay1(500); } else if(i>t) { BEEP=1; delay1(500); } display[3]=display[4]/100+0x30; display[1]=display[4]%100; display[2]=display[1]/10+0x30; display[1]=display[1]%10+0x30; if(display[3]==0x30)//高位为0,不显示 { display[3]=0x20; if(display[2]==0x30)//次高位为0,不显示 display[2]=0x20; } lcd_pos(0x48); lcd_wdat(display[3]);//百位数显示 lcd_pos(0x49); lcd_wdat(display[2]);//十位数显示 lcd_pos(0x4a); lcd_wdat(display[1]);//个位数显示 lcd_pos(0x4c); lcd_wdat(display[0]);//小数位数显示 } /*******************************************************************/ /*蜂鸣器响一声*/ /*******************************************************************/ voidbeep() { unsignedchary; for(y=0;y<100;y++) { Delay(60); BEEP=! BEEP;//BEEP取反 } BEEP=1;//关闭蜂鸣器 Delay(40000); } /*DS18B20OK显示菜单*/ /*******************************************************************/ voidOk_Menu() { ucharm; lcd_init();//初始化LCD lcd_pos(0);//设置显示位置为第一行的第1个字符 m=0; while(cdis1[m]! ='\0') {//显示字符 lcd_wdat(cdis1[m]); m++; } lcd_pos(0x40);//设置显示位置为第二行第1个字符 m=0; while(cdis2[m]! ='\0') { lcd_wdat(cdis2[m]);//显示字符 m++; } writetab();//自定义字符写入CGRAM delay1(5); lcd_pos(0x4d); lcd_wdat(0x00);//显示自定义字符 } /*DS18B20ERROR显示菜单*/ /******************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 数字 温度计 设计