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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

基于AT89C51单片机的测温系统Word格式文档下载.docx

1、3.无需外部器件4.可通过数据线供电,电压围:3.05.5V5.测温围55125,在-10+85时精度为0.56.零待机功耗7.温度以9或12位数字量读出8.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件9.负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作四:硬件电路原理框图由于本次实验是在学习板上做的,所以没有硬件接线图,原理主要讲解DS18B20的工作原理。1硬件设计1.单片机系统电路原理图图4.1 系统电路原理图2.DS18B20温度传感器电路设计电源供电方式如图,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。图4.2 DS18B20温度传感器

2、电路3.报警电路设计 报警电路是在测量温度大于上限或小于下限时提供报警功能的电路。该电路是由一个蜂鸣器组成,具体的电路如图所示图4.3 报警电路4.显示电路设计 显示电路是由四位一体的共阴数码管进行显示的2软件设计(1)DS18B20部结构 如图所示主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作 是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8X5X41)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总

3、线上挂接多个DS18B20的目的。 DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。 DS18B20温度传感器主要用于对温度进行测量,数据可用16位符号扩展的二进制补码读数形式提供,并以0.0625LSB形式表示。表2是部分温度值对应的二进制温度表示数据。(2)DS18B20的工作时序 DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输初始化时序 主机首先发出一个480960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都

4、是高电平说明总线上无器件应答。做为从器件的DS18B20在一上电后就一直在检测总线上是否有480960微秒的低电平出现,如果有,在总线转为高电平后等待1560微秒后将总线电平拉低60240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。 接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。 写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少6

5、0微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期总线为高电平则为1,若采样期总线为低电平则为0。 对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微

6、秒后释放总线,然后在包括前面的拉低总线电平1微秒在的15微秒时间完成对总线进行采样检测,采样期总线为低电平则确认为0。采样期总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成让DS18B20进行一次温度的转换,那具体的操作就是:(1).主机先作个复位操作,(2).主机再写跳过ROM的操作(CCH)命令,(3).然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总

7、线状态如下图。(3)初始化时序程序bit Init_DS18B20(void) bit flag; /储存DS18B20是否存在的标志,flag=0,存在;flag=1,不存在 DQ = 1; /先将数据线拉高 for(time=0;time2;time+) ; /略微延时约6微秒/再将数据线从高拉低,要求保持480960us DQ = 0;200; /略微延时约600微秒/以向DS18B20发出一持续480960us的低电平复位脉冲 /释放数据线(将数据线拉高) 10; /延时约30us(释放总线后需等待1560us让DS18B20输出存在脉冲) flag=DQ; /让单片机检测是否输出了存

8、在脉冲(DQ=0表示存在) /延时足够长时间,等待存在脉冲输出完毕 return (flag); /返回检测成功标志unsigned char ReadOneChar(void) unsigned char i=0; unsigned char dat; /储存读出的一个字节数据 for (i=0;i=1; if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入dat else dat|=0x00; /如果读到的数据是0,则将0存入dat time+); /延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); /返回读出的十六进制数据WriteOneC

9、har(unsigned char dat) i480usDQ拉高电平DQ为低电平?延时1560us N Y返回图5.3 DS18B20初始化子程序流程图DS18B20写字节和读字节子程序流程图:图5.4 DS18B20写字节子程序流程图 图5.5 DS18B20读字节子程序流程图六:调试(步骤,心得,结论) 优点:1线性好,精度适中,体积小,实用方便。2实时显示当前温度。缺点:温度传感器会有一定的时间延时,从而间接地影响了整个报警系统的灵敏性和准确性。(2)心得体会:在本次设计的过程中,我们发现了很多的问题,虽然以前也做过类似的课程设计,但是这次确实让我们学到了很多。我们不仅要选好元件,还要

10、把这些元件合理地组织起来,所以我们要学会如何寻找和搜索自己需要的资料。这一次,我们用了老师给的参考电路图,然后修改了一些地方,比如去掉了一个LED,再加入了几个电阻。虽然有些困难,但是经过努力,我们还是完成了电路的设计。经过本次的设计,我们学到了很多的知识,了解到了传感器能够把自然界的各种非电量转换为电信号的能量物理理念。从本次的实习设计中,我们意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识运用到实际当中,实践是检验真理的唯一标准。培养了一定的独立思考能力、解决问题的能力。同时也学到了和他人愉快合作的技巧。每当我们遇到问题时,我们学会了理性的分析,最终解决问题。同时在讨论问题时认

11、真聆听别人的思想和意见也很重要,在聆听的同时也会学到很多东西。所以这次实习让我们学到了很多的东西。七:附录(电路图,程序)#include reg51.hintrins.h /_nop_();延时函数用#define Disdata P0 /段码输出口#define discan P2 /扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P33; /温度输入口sbit DIN=P07; /LED小数点控制sbit buzzer=P36;uchar temp_buzzer;uchar up_alarm=20;uint h

12、;uint i;uchar flag;/*温度小数部分用查表法*/uchar code ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;/uchar code dis_712=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf;/共阳LED段码表 0 123456789不亮-uchar code scan_con=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe; /列扫

13、描控制字uchar data temp_data2=0x00,0x00; /读出温度暂放uchar data display8; /显示单元数据,共4个数据和一个运算暂用/*11微秒延时函数*/void ser_init() TMOD=0X20; SCON=0X50; TH1=0XFD; TL1=0XFD; TR1=1;void delay(uint t)for(;t0;t-);/*显示扫描函数*/scan()char k; for(k=0;k7;k+) /四位LED扫描控制/ Disdata=0xff; Disdata=dis_7displayk; if(k=4)DIN=0; discan=

14、scan_conk;delay(200); discan=0xff; void delayms(unsigned int xms) /延时函数 ,延时xms unsigned int i , j; for(i = 0; i xms; for(j = 0; j = 34) /温度报警限设置 for(i=0;20;buzzer=0; delayms(1);buzzer=1; /*18B20复位函数*/ow_reset(void)char presence=1;while(presence)DQ=1;_nop_();DQ=0; /delay(50); / 550usdelay(6); / 66usp

15、resence=DQ; / presence=0继续下一步delay(45); /延时500uspresence = DQ;/*18B20写命令函数*/向 1-WIRE 总线上写一个字节void write_byte(uchar val)uchar i;for (i=8; i i-) /DQ = 0;/5usDQ = val& /最低位移出 /66usval=val/2; /右移一位DQ = 1;delay(1);/*18B20读1个字节函数*/从总线上读取一个字节uchar read_byte(void)uchar value = 0;ii-)value /4usif(DQ)value|=0

16、x80;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位write_byte(0xCC); / 发Skip ROM命令write_byte(0xBE); / 发读命令temp_data0=read_byte(); /温度低8位temp_data1=read_byte(); /温度高8位 / Skip ROMwrite_byte(0x44); / 发转换命令/*温度数据处理函数*/void work_temp()uchar n=0,th=0,tl=0;int temp=0;uchar flag3=1,flag2=1; /数字显示修正标记if

17、(temp_data0255)temp_data1+;tl=temp_data0&0x0f;display7=tl;if(display7&0x08)temp+=5000;0x04)temp+=2500;0x02)temp+=1250;0x01)temp+=625;display0=temp%10;display1=(temp%100)/10;display2=(temp%1000)/100;display3=temp/1000;display7=(temp_data0&0xf0)4)|(temp_data1&0x07)4);display6=display7/100;display5=display7/10%10;display4=display7%10;if(!display6) display6=0x0a; flag3=0; if(!display5) display5=0x0a; flag2=0; /最高位为0时都不显示/*主函数*/main() double templ ; ser_init();Disdata=0xff; /初始化端口discan=0xff;for(h=0;hh+)displayh=0;/开机显示8888 / 开机先转换一次write_byte(0x4e

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

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