简易数字式温度计的设计毕业设计论文.docx
- 文档编号:23614417
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:37
- 大小:355.36KB
简易数字式温度计的设计毕业设计论文.docx
《简易数字式温度计的设计毕业设计论文.docx》由会员分享,可在线阅读,更多相关《简易数字式温度计的设计毕业设计论文.docx(37页珍藏版)》请在冰豆网上搜索。
简易数字式温度计的设计毕业设计论文
单片机技能+电子初级工程师认证培训
设计报告
题目:
简易数字式温度计的设计
华南理工大学广州学院电子信息工程学院
目录
1引言
2方案设计
3系统的硬件设计
4proteus仿真图
5系统的软件设计
6心理体会
7参考文献
1引言
在当下,人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。
社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。
2方案设计
本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:
●利用温度传感器(DS18B20)测量某一环境温度
●测量范围为-55℃~+127℃,精度为±0.5℃
●如果测量范围超过+127℃或低于-55℃蜂鸣器就会自动进行报警
●用液晶显示器LCD进行实际温度值显示
采用AT89S52单片机P3.5口控制温度传感器DS18B20的温度测量,以液晶显示器LCD形式输出测量温度。
图2.1原理图
3系统的硬件设计
3.1主控制器
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
3.2温度传感器工作原理
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
•独特的单线接口仅需一个端口引脚进行通讯
•简单的多点分布应用
•无需外部器件
•可通过数据线供电
•零待机功耗
•测温范围-55~+125℃,以0.5℃递增。
华氏器件-67~+2570F,以0.90F递增
•温度以9位数字量读出
•温度数字量转换时间200ms(典型值)
•用户可定义的非易失性温度报警设置
•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
3.3温度传感器接口电路
4proteus仿真图
4.1仿真图
利用proteus按电路图排放元器件以及连接线路,用keilC51将写好的C语言进行仿真,获得的仿真图如下所示:
图4.1电路仿真图
4.2仿真程序
//DS18B20温度检测及其液晶显示
#include
#include
#include
#defineuintunsignedint//宏定义unsignedint为uint,为了使程序更简洁与出现少错误。
以下uchar同
#defineucharunsignedchar
ucharcodedigit[11]={"0123456789-"};//定义字符数组显示数字
unsignedcharcodeStr[]={"MAX:
"};//说明显示的是温度
unsignedcharcodeOstr[]={"MIN:
"};
ucharcodestr1[]={"WelcomeToUse"};//开机启动时的说明文字
ucharcodestr2[]={"MyWork2012"};//开机说明文字
ucharcodeError[]={"DS18B20ERROR"};//说明没有检测到DS18B20
ucharcodeError1[]={"PLEASECHECK"};//说明没有检测到DS18B20
ucharcodeTemp[]={"TEMP:
"};//说明显示的是温度
ucharcodeUser[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度单位
ucharflag,tltemp;//负温度标志和临时暂存变量
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
uchari,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelaynms(uintn)
{
uinti;
for(i=0;i delay1ms(); } /*********************************************************** 以下是对蜂鸣器的定义和操作 ************************************************************/ sbitbeep=P3^6; voiddelay500us() { uchari,j; for(i=0;i<2;i++) for(j=0;j<33;j++); } voidBEEP() { uinti; for(i=0;i<1000;i++) { beep=0; delay500us(); beep=1; delay500us(); } beep=1; delaynms(1000); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ bitBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(uchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据书上表7.7,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(ucharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(uchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据书上表7.7,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38);//连续三次,确保初始化成功 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5);//延时5ms ,给硬件一点反应时间 } /************************************************************************ 以下是DS18B20的操作程序 ************************************************************************/ sbitDQ=P3^2; uchartime;//设置全局变量,专门用于严格延时 /***************************************************** 函数功能: 将DS18B20传感器初始化,读取应答信号 出口参数: flag ***************************************************/ bitInit_DS18B20(void) { bitflag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ=1;//先将数据线拉高 for(time=0;time<2;time++)//略微延时约6微秒 ; DQ=0;//再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延时约600微秒 ;//以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ=1;//释放数据线(将数据线拉高) for(time=0;time<10;time++) ;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲) flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕 ; return(flag);//返回检测成功标志 } /***************************************************** 函数功能: 从DS18B20读取一个字节数据 出口参数: dat ***************************************************/ ucharReadOneChar(void) { uchari=0; uchardat;//储存读出的一个字节数据 for(i=0;i<8;i++) { DQ=1;//先将数据线拉高 _nop_();//等待一个机器周期 DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_();//等待一个机器周期 DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ;//延时约6us,使主机在15us内采样 dat>>=1; if(DQ==1) dat|=0x80;//如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++) ;//延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat);//返回读出的十六进制数据 } /***************************************************** 函数功能: 向DS18B20写入一个字节数据 入口参数: dat ***************************************************/ WriteOneChar(uchardat) { uchari=0; for(i=0;i<8;i++) { DQ=1;//先将数据线拉高 _nop_();//等待一个机器周期 DQ=0;//将数据线从高拉低时即启动写时序 DQ=dat&0x01;//利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1;//释放数据线 for(time=0;time<1;time++) ;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1;//将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++) ;//稍作延时,给硬件一点反应时间 } /***************************************************** 函数功能: 做好读温度的准备 ***************************************************/ voidReadyReadTemp(void) { Init_DS18B20();//将DS18B20初始化 WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 delaynms(200);//转换一次需要延时一段时间 Init_DS18B20();//将DS18B20初始化 WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0xBE);//读取温度寄存器,前两个分别是温度的低位和高位 } /****************************************************************************** 以下是与温度有关的显示设置 ******************************************************************************/ /***************************************************** 函数功能: 显示没有检测到DS18B20 ***************************************************/ voiddisplay_error(void) { uchari; WriteAddress(0x00);//写显示地址,将在第1行第1列开始显示 i=0;//从第一个字符开始显示 while(Error[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Error[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(100);//延时100ms较长时间,以看清关于显示的说明 } WriteAddress(0x40);//写显示地址,将在第1行第1列开始显示 i=0;//从第一个字符开始显示 while(Error1[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Error1[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(100);//延时100ms较长时间,以看清关于显示的说明 } while (1)//进入死循环,等待查明原因 ; } /***************************************************** 函数功能: 显示温度符号 ***************************************************/ voiddisplay_symbol(void) { uchari; WriteAddress(0x40);//写显示地址,将在第2行第1列开始显示 i=0;//从第一个字符开始显示 while(Temp[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Temp[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } } /***************************************************** 函数功能: 显示温度的小数点 ************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 数字式 温度计 设计 毕业设计 论文