收藏 分销(赏)

数字温度计(18B20与1602).doc

上传人:精*** 文档编号:2622218 上传时间:2024-06-03 格式:DOC 页数:24 大小:905.54KB 下载积分:10 金币
下载 相关 举报
数字温度计(18B20与1602).doc_第1页
第1页 / 共24页
数字温度计(18B20与1602).doc_第2页
第2页 / 共24页


点击查看更多>>
资源描述
数字温度计(18B20与1602) ———————————————————————————————— 作者: ———————————————————————————————— 日期: 2 个人收集整理 勿做商业用途 学校logo 专业: [请 输 入 专 业] 班级: [请 输 入 班 级] 学生姓名: [请 输 入 姓 名] 指导教师: [请输入指导教师] 完成时间: 2024年5月16日 [请输入论文标题] 1.课程设计的目的和要求………………………………………………………1 1.1设计目的……………………………………………………………………1 1。2课程设计题目描述和要求…………………………………………………1 2. 总体方案设计 ………………………………………………………………1 2。1总体设计框图………………………………………………………………1 2.2单片机AT89C51 …………………………………………………………2 2.3主要硬件介绍 ……………………………………………………………3 2。3。1 DS18B20简介……………………………………………………………3 2.3.2 DS18B20的测温原理……………………………………………………4 2。3。3温度转换计算方法举例…………………………………………………5 2.3。4 DS18B20温度传感器与单片机的接口电路……………………………5 2。3。5 1602液晶说明 …………………………………………………………6 3.系统硬件电路设计……………………………………………………………8 3.1主板电路……………………………………………………………………8 3。2显示电路……………………………………………………………………9 3.3温度连接电路………………………………………………………………9 4。系统软件的设计………………………………………………………………10 4。1主程序流程图 ………………………………………………………………10 4.2读程序流程图 ………………………………………………………………10 4.3温度转换命令子程序流程图 ………………………………………………11 4.4计算温度子程序流程图 ……………………………………………………11 4.5主程序源代码 ……………………………………………………………12 4.6 1602显示源代码 …………………………………………………………13 4.7 18B20源代码 ……………………………………………………………15 5。总结 …………………………………………………………………………18 参考文献 ………………………………………………………………………19 1.课程设计的目的和要求 1。1设计目的 熟练掌握51小系统开发应用;加强单片机的综合运用能力、提高单片机的件编程和调试能力,为以后的学习和开发工作打下强劲基础;掌握DS18B20温度传感器模块的工作原理及应用设计;掌握1602液晶显示模块的工作原理及应用设计;掌握小系统开发设计的流程及设计思路;提高分析问题,解决问题能力,提高实践动手能力。 1.2课程设计题目描述和要求 题目:基于DS18B20的温度测试LED显示。 实现的基本功能: (1) 测量基本范围-55~125℃。 (2) 精度误差小于0。5℃。 (3) 1602液晶显示。 2.总体方案的设计 2。1总体设计框图 温度计电路设计总体设计方框图如图2-1所示,控制器采用单片机AT89C51,温度传感器采用DS18B20,用LED1602液晶以串口传送数据实现温度显示。 图2-1 总体设计方框图 2。2单片机AT89C51 AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS—51指令系统及89C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案. AT89C51具有如下特点:40个引脚如图2-2,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。 图2—2 AT89C51管脚图 2。3主要硬件介绍 2。3。1 DS18B20简介 DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器,如图2—3。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式.可以分别在93。75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果,其引脚功能如图2-4. DS18B20具有如下特点: (1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 (2)在使用中不需要任何外围元件。 (3)可用数据线供电,电压范围:+3.0~ +5.5 V。 (4)测温范围:-55 ~+125 ℃.固有测温分辨率为0.5 ℃。 (5)通过编程可实现9~12位的数字读数方式。 (6)用户可自设定非易失性的报警上下限值。 (7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。 (8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 图2-3 DS18B20的引脚排列 图2-4 引脚功能描述 2.3。2 DS18B20的测温原理 低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。 2。3.3温度转换计算方法举例 例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则: 实际温度=07D0H╳0。0625=2000╳0。0625=125°C。 例如当DS18B20采集到—55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则: 实际温度=370H╳0.0625=880╳0。0625=55°C DS18B20工作过程一般遵循以下协议:初始化——ROM操作命令-—存储器操作命令—-处理数据 2。3.4 DS18B20温度传感器与单片机的接口电路 DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的一脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图2-5所示单片机端口接单线总线,为保证有效的DS18B20始终周期内提供足够的电流,可以用一个MOSFET管来完成对总线的上拉。 当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us.采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。 图2-5 DS18B20与单片机接口 2.3.5 1602液晶说明 3.系统硬件电路设计 3。1主板电路 系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等,如图3—1所示。 图3-1 单片机主板电路 3.2 显示电路 显示电路是使用的1602液晶显示,这种显示最大的优点就是使用方便,接线简单,显示比较清楚,并能结合所需的字母显示。如图3—2. 1602与单片机连接图3-2。 3。3温度连接电路 温度传感器使用18B20只有三个引脚,连接比较简单,如图3—3。 图3—3 4。系统软件的设计 4。1主程序 主要功能是负责温度的实时显示,读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次,这样可以在一秒之内测量一次温度,其程序流程如图4-1所示。 4.2读程序 主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图4-2. 图4-1 主程序流程图 图4—2 读温度流程图 4。3温度转换命令子程序 主要是发温度转换开始命令,本程序采用1s显示程序延时法等待转换的完成。其程序流程图如图4—3。 图4—3温度转换命令流程图 4。4计算温度子程序 将RAM中读取进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4-4。 图4-4 计算温度流程图 图4—5 显示数据刷新流程图 4.5主程序源代码 为了方便使用,将18B20温度模块和1602显示模块的程序的函数声明做成函数库,分别为”18b20.h",“lcd.h”。则在主程序中可以直接调入,主程序如下所示: #include”lcd.h” #include”18b20。h" char data wendu[]=” Temp 000.0C ”; char data Test1[]=” chen yang "; char data shuzi[]={'0’,'1',’2’,’3’,'4’,’5',’6’,’7','8’,'9’}; uint temp; main() { unsigned char TempH,TempL; InitLcd(); //初始化LCD DelayMs(15); //延时保证信号稳定 while(1) { ShowString(0,Test1); ShowString(1,wendu); wendu[8]=shuzi[TempH/100]; //百位温度 wendu[9]=shuzi[(TempH%100)/10]; //十位温度 wendu[10]=shuzi[(TempH%100)%10] ;//个位 wendu[12]=shuzi[TempL]; temp=ReadTemperature(); if(temp&0x8000) // 数据处理 { temp=~temp; // 取反加1 temp +=1; } else TempH=temp〉>4; TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 } 4.6 1602显示源代码 参照1602显示的原理图和时序,进行编写程序初始化,读指令,读数据等操作,编写的时候注意结合时序图来进行。源程序如下: “lcd。h”库: #ifndef __LCD_H__ #define __LCD_H__ #include<reg52。h〉 /*包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义*/ #include〈stdio。h> //标准输入输出 #include〈intrins。h〉 void DelayUs(unsigned char us); // 微秒延时函数 void DelayMs(unsigned char ms); // 毫秒函数声明 void WriteCommand(unsigned char c);//写入命令函数 void WriteData(unsigned char c); //写入数据函数 void ShowChar(unsigned char pos,unsigned char c);// 写入字节函数 void ShowString (unsigned char line,char *ptr); //写入字符串函数 void InitLcd();//初始化函数 #endif 显示程序: 名称:LCD1602 */ #include<reg52。h〉 /*包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义*/ #include〈stdio。h〉 //标准输入输出 #include<intrins.h〉 #include"lcd。h” sbit RS = P2^4; //Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6; //Pin6 #define Data P0//数据端口 /******************************************************************/ /* 微秒延时函数 */ /******************************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us〉〉1; /*12MHz频率*/ while(--uscnt); } /******************************************************************/ /* 毫秒函数声明 */ /******************************************************************/ void DelayMs(unsigned char ms) { while(——ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } /******************************************************************/ /* 写入命令函数 */ /******************************************************************/ void WriteCommand(unsigned char c) { DelayMs(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; } /******************************************************************/ /* 写入数据函数 */ /******************************************************************/ void WriteData(unsigned char c) { DelayMs(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; } /******************************************************************/ /* 写入字节函数 */ /******************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos〉=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第一行则命令代码高4位为0x8 WriteCommand (p);//写命令 WriteData (c); //写数据 } /******************************************************************/ /* 写入字符串函数 */ /******************************************************************/ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<<4; for (i=0;i<16;i++) ShowChar (l++,*(ptr+i));//循环显示16个字符 } /******************************************************************/ /* 初始化函数 */ /******************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 } 4。7 18B20温度源代码 "18b20.h"库 #ifndef __18B20_H__ #define __18B20_H__ #include<reg52.h〉 /*包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义*/ #include<math。h〉 #include<INTRINS。H> #define uchar unsigned char #define uint unsigned int void delay1(uchar MS); //延时函数 unsigned int ReadTemperature(void); //度温度 void Init_DS18B20(void); //18B20初始化 unsigned char ReadOneChar(void);// 读一个字节 void WriteOneChar(unsigned char dat); //写一个字节 void delay2(unsigned int i); //延时函数 #endif 18B20温度传感器源代码: /*———-———————-----——-—--—-————-—--—--—----—-————- 名称:18B20温度传感器 该程序的关键,从readtemperature中获得温度值,进而将数值分离显示 -——---———---————------————---—--——-—————--——————*/ #include〈reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include<math。h〉 #include〈INTRINS.H> #include"18b20.h” #define uchar unsigned char #define uint unsigned int /******************************************************************/ /* 定义端口 */ /******************************************************************/ sbit seg1=P2^0; sbit seg2=P2^1; sbit seg3=P2^2; sbit DQ=P1^3;//ds18b20 端口 sfr dataled=0x80;//显示数据端口 /* 延时函数 */ /******************************************************************/ void delay2(unsigned int i)//延时函数 { while(i—-); } /******************************************************************/ /* 初始化 */ /******************************************************************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay2(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay2(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay2(10); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay2(5); } /******************************************************************/ /* 读一个字节 */ /******************************************************************/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i—-) { DQ = 0; // 给脉冲信号 dat〉>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay2(5); } return(dat); } /******************************************************************/ /* 写一个字节 */ /******************************************************************/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i〉0; i-—) { DQ = 0; DQ = dat&0x01; delay2(5); DQ = 1; dat>〉=1; } delay2(5); } /******************************************************************/ /* 读取温度 */ /******************************************************************/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay2(200); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b〈<=8; t=a+b; return(t); } 5.总结 经过这段时间的努力,我终于完成了数字温度计的设计,虽然没有完全达到设计要求,但从中学到了不少课堂上所学不到的实际知识。      我们认为,在这次的课程设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,为了完成课程设计,我学会了通过多种渠道去获得课程设计所需用的各种资料,在通过查找大量资料,请教老师,以及不懈的努力的过程中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高.更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。 之所以使用单片机作为我们的执行核心,不仅是因为老师说单片机现在是社会上应用最广泛的工具,也因为想通过使用单片机锻炼自己的c 语言编程能力,养成良好的c语言编程风格。不管怎样,这些都是一种锻炼,一种知识的积累,能力的提高。完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。很少有人会一步登天吧。永不言弃才是最重要的。 在程序设计方面我也增长了不少,1、写程序注释写得越详细越好、不要怕麻烦.比如我以前写了使用方法、结果起始地址是存高字节还是低字节等问题没有记录。还得测试,简直是浪费时间。 2、画流程图绝对有助于写程序以及日后核对。3、随时备份,建议版本形式备份,并写清楚该版本实现了什么,改进了什么,还没有实现什么.4、建立库,把程序做成模块化以便于将来编写其他程序的时候直接调用。 参考文献    [1] 李广弟.单片机基础.北京:北京航空航天大学出版社,2011 [2] 周荷琴 吴秀清。微型计算机原理与接口技术(第4版)。中国科学技术大学出版社。2010 [3] 蒋辉平。基于Proteus的单片机系统设计与仿真实例。机械工业出版社.2009 [4] 马忠梅。单片机的C语言应用程序设计。北京航空航天大学出版社,2007 24
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服