ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:241.67KB ,
资源ID:3279060      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3279060.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数字温度表设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数字温度表设计.docx

1、数字温度表设计电子综合设计报告 设计题目: 数字温度表设计 学生姓名: 班级学号: 1 指导教师: 设计时间: 一 方案设计1二 系统的硬件设计21、主控制器22、显示电路43、温度传感器工作原理44、温度传感器接口电路8三 系统的软件设计81、主程序82、温度测量92.1 DS18B20复位函数92.2 从DS18B20中读取一个字节92.3 向DS18B20写一个字节92.4 从DS18B20读取数据103、数码管显示10四 系统的测试11五 总结11附录 源程序清单12一、方案设计本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主

2、要功能和指标如下:利用温度传感器(DS18B20)测量某一点环境温度测量范围为0100,精度为0.5用数码管进行实际温度值显示采用AT89C52单片机P2 .4口控制温度传感器DS18B20的温度测量,以四位数码感形式输出测量温度,总体设计方框图以及原理图分别如下图所示:图1.1 总体设计方框图图1.2 温度系统原理图二 系统的硬件设计1、主程序 AT89C52 是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程

3、器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得AT89C52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。AT89C52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89C52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断

4、或硬件复位为止。 图2.1 时钟电路与复位电路2、显示电路 显示采用6位数码管,图2.2为温度显示电路 图2.2温度显示电路3、温度传感器工作原理DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20的性能特点如下: 独特的单线接口仅需一个端口引脚进行通讯 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55+125,以0.5递增。华氏器件-67+2570F,以0.90F 递增 温度以9 位数字量读出 温度数字量

5、转换时间200ms(典型值) 用户可定义的非易失性温度报警设置 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图 2.3所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图 2.4所示.。 图 2.3外部封装形式 图 2.4传感器电路图DS18B20的测温原理如图2.5所示,图中低温度系数晶振的

6、振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新

7、开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。图2.5 DS18B20测温原理图在正常测温情况下,DS

8、1820的测温分辨力为0.5,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25、0.75为进位界限的关系,实际温度Ts可用下式计算: 4、温度传感器接口电路 图2.6温度传感器接口电路三 系统的软件设计1、主程序void main() uchar temp, temp1; while(1) scandisp(); readtemp(); t

9、emp1 = temper0; temp = temper1; dispbuf4 = ditabtemp1; dispbuf1 = temp/100; dispbuf3 = temp%10; temp = temp/10; dispbuf2 = temp%10; dispbuf0 = flag; dispbuf5 = 11; 2、温度测量2.1 DS18B20复位函数void reset(void) uchar x = 0; DQ = 1; delay(8); DQ = 0; delay(80); DQ = 1; delay(14); x = DQ; delay(20);2.2 从DS18B2

10、0中读一个字节uchar readbyte(void) uchar i = 0; uchar dat = 0; for(i = 8; i 0;i-) DQ = 0; dat = 1; DQ = 1; if(DQ) dat |= 0x80; delay(4); return dat;2.3 向DS18B20写一个字节void writebyte(unsigned char dat) uchar i = 0; for(i = 8; i 0; i-) DQ = 0; DQ = dat & 0x01; delay(5); DQ = 1; dat = 1; delay(4);2.4从DS18B20读取数

11、据void readtemp(void) uchar a = 0, b = 0; reset(); writebyte(0xCC);/跳过序列号 writebyte(0x44);/启动温度转换 reset(); writebyte(0xCC); writebyte(0xBE);/读9个寄存器,前两个位温度 a = readbyte();/低位 b = readbyte();/高位 if(b 0x0f) /判断是否为负值 a = a + 1; if(a = 0) b = b + 1; else b= b; flag = 10; else flag = 12; temper0 = a & 0x0f

12、; a = a 4; temper1 = b 4; temper1 = temper1|a;3、数码管显示void scandisp() unsigned char i ,value; for(i = 0; i 8; i+) P3 = 0xff; value = tabledispbufi; if(i = 3) value |= 0x80; P0 = value; P3 = scani; delay(50); 四 系统的测试4.1 测试时的图片 图4.1测量温度结果五 总结 通过近两个星期的单片机课程设计,我终于完成了“数字温度表设计”,心中不免有些高兴,但高兴之余也有我值得深思的。 虽然以前

13、做过类似的实验,但这次的课程设计还是让我学到了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法。有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。通过这次的单片机课程设计我认识到了,学习要理论联系实际,把学到的理论知识同实际运用相结合,才能是我们的知识融汇贯通,才能真正的学到知识,真正的做到学以致用。附录 源程序清单/*/包含文件,程序开始/*#include#define uchar unsigned char#define uint unsigned intsbit DQ = P24;/DS18B20数据线引脚unsig

14、ned char flag;/负数标志/行扫描数组uchar code scan8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/row0-row7/数码管显示的段码表uchar code table13 = 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x40,0x39,0x00;/小数部分显示查询表uchar code ditab16 = 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06, 0x07,0x08,0x08,0x09,0x

15、09;uchar dispbuf8;/显示缓冲区uchar temper2;/存放温度的数组/*/延时函数/*void delay(unsigned int us) while(us-);/*/DS18B20复位函数/*void reset(void) uchar x = 0; DQ = 1; delay(8); DQ = 0; delay(80); DQ = 1; delay(14); x = DQ; delay(20);/*/从DS18B20中读一个字节/*uchar readbyte(void) uchar i = 0; uchar dat = 0; for(i = 8; i 0;i-)

16、 DQ = 0; dat = 1; DQ = 1; if(DQ) dat |= 0x80; delay(4); return dat;/*/向DS18B20写一个字节/*void writebyte(unsigned char dat) uchar i = 0; for(i = 8; i 0; i-) DQ = 0; DQ = dat & 0x01; delay(5); DQ = 1; dat = 1; delay(4);/*/从DS18B20读取数据/*void readtemp(void) uchar a = 0, b = 0; reset(); writebyte(0xCC);/跳过序列

17、号 writebyte(0x44);/启动温度转换 reset(); writebyte(0xCC); writebyte(0xBE);/读9个寄存器,前两个位温度 a = readbyte();/低位 b = readbyte();/高位 if(b 0x0f) /判断是否为负值 a = a + 1; if(a = 0) b = b + 1; else b= b; flag = 10; else flag = 12; temper0 = a & 0x0f; a = a 4; temper1 = b 4; temper1 = temper1|a;/*/动态扫描显示函数/*void scandis

18、p() unsigned char i ,value; for(i = 0; i 8; i+) P3 = 0xff; value = tabledispbufi; if(i = 3) value |= 0x80; P0 = value; P3 = scani; delay(50); /*/主函数/*void main() uchar temp, temp1; while(1) scandisp(); readtemp(); temp1 = temper0; temp = temper1; dispbuf4 = ditabtemp1; dispbuf1 = temp/100; dispbuf3 = temp%10; temp = temp/10; dispbuf2 = temp%10; dispbuf0 = flag; dispbuf5 = 11;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1