《《单片机课程设计报告基于ds18b20的数字温度计设计》.doc》由会员分享,可在线阅读,更多相关《《单片机课程设计报告基于ds18b20的数字温度计设计》.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机课设报告设计题目: 数字温度计设计 电子工程与自动化 学院 智能科学与技术 专业 8003902 班姓名: 学号: 成绩:指导老师:赵龙阳目录:关键字及摘要:*第一页第一节:设计要求* 第一页第二节:设计内容 1、Ds18B20传感器原理及程序*第二页至第九页 2、LCD1602液晶显示原理及程序*第十页至第十四页3、上下限设置及程序*第十五页 4、报警子程序*第十六页 5、蜂鸣器发声程序*第十七页 6、主程序main*第十七页 7、仿真图*第十七页8、protel原理图*第十八页至十九页9、PCB图*第二十页第三节:总结*第二十页第四节:引文*第二十页关键字:DS18B20 温度计 数
2、字 单片机 液晶 LCD1602摘要:本次课程设计是基于Ds18B20的数字温度计设计,他实现的温度的读取与直接显示,能够设置上下限,并能实现报警功能,显示用液晶显示(LCD1602)。一、设计要求1、基本范围-10110;3、直读显示数字温度值;4、可以任意设定温度的上下限报警功能。二、设计内容1、DS18B20传感器原理、DS18B20概述DS18B20是一个可以通过单线接口进行双向信温度传感器。它可以通过数据线供电,电源电压范围为35.5V,零待机功耗,测温范围为-55+125,精确度为912位(可通过设定数据位选择相应位数)。9位的分辨率为,12位的温度分辨率为,默认位数为12位。由此
3、可以看出用DS18B20进行温度计设计能够实现以上温度读取要求。、DS18B20引脚排列 如图DS18B20有两种封装,本次设计中选用3引脚封装(DS18B20 PR35 PACKAGE)、传感器温度读取DS1820 有三个主要数字部件:1)64 位激光 ROM;2)温度传感器;3)非易失性温度报警触发器 TH 和 TL。DS1820 依靠一个单线端口通讯。在单线端口条件下,必须先建立 ROM 操作协议,才能进行存储器和控制操作。因此,控制器必须首先提供下面5个ROM操作命令之一:1)读 ROM;2)匹配 ROM;3)搜索ROM;4)跳过 ROM;5)报警搜索。这些命令对每个器件的激光 ROM
4、 部分进行操作,在单线总线上挂有多个器件时,可以区分出单个器件,同时可以向总线控制器指明有多少器件或是什么型号的器件。成功执行完一条 ROM 操作序列后,即可进行存储器和控制操作,控制器可以提供 6 条存储器和控制操作指令中的任一条。 一条控制操作命令指示 DS1820 完成一次温度测量。测量结果放在 DS1820 的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。温度报警触发器 TH 和 TL 各由一个 EEPROM 字节构成。如果没有对DS1820 使用报警搜索命令,这些寄存器可以做为一般用途的用户存储器使用。可以用一条存储器操作命令对 TH 和 TL 进行写入,对这些
5、寄存器的读出需要通过暂存器。所有数据都是以最低有效位在前的方式进行读写。温度数据关系DS1820 是这样测温的:用一个高温度系数的振荡器确定一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。计数器被预置到对应于-55的一个值。如果计数器在门周期结束前到达0,则温度寄存器(同样被预置到-55)的值增加,表明所测温度大于-55。 同时,计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。然后计数器又开始计数直到 0,如果门周期仍未结束,将重复这一过程。 斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较
6、高的分辨力。这是通过改变计数器对温度每增加一度所需计数的的值来实现的。因此,要想获得所需的分辨力,必须同时知道在给定温度下计数器的值和每一度的计数值。 的分辨力。温度以 16bit 带符号位扩展的二进制补码形式读出,表 1 给出了温度值和输出数据的关系。数据通过单线接口以串行方式传输。DS1820 测温范围-55+125递增。如用于华氏温度,必须要用一个转换因子查找表。、通过单线总线端口访问 DS1820 的协议如下: 初始化 ROM 操作命令 存储器操作命令 执行/数据 初始化 通过单线总线的所有执行(处理)都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和跟有其后由从机
7、发出的存在脉冲。 存在脉冲让总线控制器知道 DS1820 在总线上且已准备好操作。详见“单线信号”节。 ROM 操作命令 一旦总线控制器探测到一个存在脉冲,它就可以发出 5 个 ROM 命令中的任一个。所有 ROM 操作命令都 8位长度。下面是这些命令:Read ROM 33h 这个命令允许总线控制器读到 DS1820 的 8 位系列编码、唯一的序列号和 8 位 CRC码。只有在总线上存在单只 DS1820 的时候才能使用这个命令。如果总上有不止一个从机,当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起开成相与的效果)。 Match ROM 55h 匹配 ROM 命令,后跟64
8、位 ROM 序列,让总线控制器在多点总线上定位一只特定的DS1820。只有和 64 位ROM序列完全匹配的 DS1820 才能响应随后的存储器操作命令。所有和64位ROM序列不匹配的从机都将等待复位脉冲。这条命令在总线上有单个或多个器件时都可以使用。 Skip ROM CCh 这条命令允许总线控制器不用提供 64 位 ROM 编码就使用存储器操作命令, 在单点总线情况下右以节省时间。如果总线上不止一个从机,在 Skip ROM命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突(漏极开路下拉效果相当于相相与)。Search ROM F0h 当一个系统初次启动时,总线控制器
9、可能并不知道单线总线上有多少器件或它们的64位ROM编码。搜索 ROM命令允许总线控制器用排除法识别总线上的所有从机的 64 位编码。 Alarm Search ECh 这条命令的流程图和 Search ROM 相同。然而,只有在最近一次测温后遇到符合报警条件的情况, DS1820 才会响应这条命令。 报警条件定义为温度高于 TH 或低于 TL。 只要DS1820不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。 I/O 信号 DS1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写 0、写1、读0 和读 1。所有这些信号,除存在脉冲外,
10、都是由总线控制器发出的。 和 DS1820 间的任何通讯都需要以初始化序列开始,初始化序列见图 11。一个复位脉冲跟着一个存在脉冲表明 DS1820 已经准备好发送和接收数据 (适当的 ROM 命令和存储器操作命令) 。 备注:1、温度转换时间可长达500ms。接到温度转换的协议后,如果器件不是从 VDD 供电的话,I/O线就必须至少保持 500ms 高电平。这样,发出一个 Convert T 命令之后,单线总线上在这段时间内就不能有其他活动。 2、接到 Copy Scratchpad 协议后,如果器件不是从VDD 供电的话,I/O 线必须至少保持10ms高电平。这样,在发出一个Copy Sc
11、ratchpad 命令后,这段时间内单线总线上就不能有其他活动。 总线控制器发出(TX)一个复位脉冲(一个最少保持480s 的低电平信号),然后释放总线,进入接收状态(RX)。单线总线由 5K 上拉电阻拉到高电平。探测到 I/O 引脚上的上升沿后,DS1820等待 1560s,然后发出存在脉冲(一个 60240s 的低电平信号)。 存储器操作命令: Write Scratchpad 4E 这个命令向 DS1820的暂存器中写入数据,开始位置在地址 2。接下来写入的两个字节将被存到暂存器中的地址位置 2 和 3。可以在任何时刻发出复位命令来中止写入。 Read Scratchpad BEh 这个
12、命令读取暂存器的内容。读取将从字节0 开始,一直进行下去,直到第 9(字节 8CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。 Copy Scratchpad 48h 这条命令把暂存器的内容拷贝到DS1820的 E2存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而 DS1820 又正在忙于把暂存器拷贝到 E2存储器,DS1820 就会输出一个“0”,如果拷贝结束的话,DS1820则输出“1”。如果使用寄生电源,总线控制器必须在这条命令发出后立即起动强上拉并最少保持10ms。 Convert T 44h 这条
13、命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后 DS1820保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS1820 又忙于做时间转换的话,DS1820 将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。 Recall E2 B8h 这条命令把报警触发器里的值拷回暂存器。这种拷回操作在 DS1820 上电时自动执行,这样器件一上电暂存器里马上就存在有效的数据了。若在这条命令发出之后发出读时间隙,器件会输出温度转换忙的标识:“0”=忙,“1”=完成。 Read Power Supp
14、ly B4h 若把这条命令发给 DS1820 后发出读时间隙,器件会返回它的电源模式:“0”=寄生电源,“1”=外部电源。 读/写时间隙 DS1820 的数据读写是通过时间隙处理位和命令字来确认信息交换。当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1 时间隙和写 0时间隙。所有写时间隙必须最少持续 60s,包括两个写周期间至少 1s 的恢复时间。 I/O 线电平变低后,DS1820 在一个 15s 到 60s 的窗口内对 I/O 线采样。如果线上是高电平,就是写 1,如果线上是低电平,就是写 0(见下图)主机要生成一个写时间隙,必须把数据线拉到低电平然后释放
15、,在写时间隙开始后的 15s内允许数据线拉到高电平。 主机要生成一个写 0 时间隙,必须把数据线拉到低电平并保持 60s。 读时间隙 当从 DS1820 读取数据时,主机生成读时间隙。当主机把数据线从高高平拉到低电平时,写时间隙开始。数据线必须保持至少 1s;从 DS1820 输出的数据在读时间隙的下降沿出现后 15s 内有效。因此,主机在读时间隙开始后必须停止把 I/O 脚驱动为低电平 15s,以读取I/O 脚状态(见下图)。在读时间隙的结尾,I/O 引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少 60s,包括两个读周期间至少 1s 的恢复时间。 最大:TINIT 和 TRC 保持时间
16、尽可能小;把控制器采样时间放到 15s 周期的最后。DS18B20头文件将DS18B20读取温度并返回的程序用一个头文件存储,然后调用,该程序为:#ifndef _DS18B20_H_#define _DS18B20_H_sbit DQ= P13 ; /定义DS18B20端口DQ unsigned char flag_Negative_number = 0;/负数标志void delay_18B20(unsigned int i) while(i-);/DS18B20初始化函数Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_1
17、8B20(4); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(100); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(100) ;/读一个字节 ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); return(dat);/写一个字节,调用后可以向DS18B20写入命令字 WriteOneCh
18、ar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(10); DQ = 1; dat=1; /读取温度ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned int t=0; Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器)前两个就是实时温度a=ReadOneCha
19、r();b=ReadOneChar();/启动下一次温度转换Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换t=b;t0xfff) /判断是否为负温度t=t+1; /若为负温度则取反加一(即求补)flag_Negative_number = 0xff;/ 若为负温度,符号标志为0xffreturn(t);#endif该程序流程图为:初始化DS18B20写入命令字读出温度启动下一次温度转换将两个8位数值转换为16位判断温度的正负结束开始2、LCD1602液晶显示原理液晶显示代码:/*写入指令,用
20、于设置液晶显示模式*/ void wr_com(unsigned char com) delay1ms(1); RS=0; RW=0; EN=0; P0=com; delay1ms(1); EN=1; delay1ms(1); EN=0;/*写入数据,用于向1602输入要显示的内容*/void wr_dat(unsigned char dat) delay1ms(1); RS=1; RW=0; EN=0; P0=dat; delay1ms(1); EN=1; delay1ms(1); EN=0;void lcd_init()delay1ms(15); wr_com(0x38);delay1ms
21、(5);/显示模式设置 wr_com(0x08);delay1ms(5); / 显示关闭 wr_com(0x01);delay1ms(5); /显示清屏 wr_com(0x06);delay1ms(5);/显示光标移动 wr_com(0x0c);delay1ms(5);/显示开机光标设置/*显示温度*/void disp()temp=ReadTemperature();/读取温度;if (flag_Negative_number)wr_com(0xc5);wr_dat(-) ; /负号显示else wr_com(0xc5) ; wr_dat( ) ;temp=temp*(0.0625); di
22、splay3= (int)temp/100%10+0x30; /百位display2 = (int)temp/10%10+0x30;/十位display1= (int)temp%10+0x30; /个位display0=(int)(temp*10)%10+0x30; /小数位 if(display3=0x30) /高位为0,不显示 display3=0x20 ; if(display2=0x30) /次高位为0,不显示 display2=0x20 ; wr_com(0xc6) ;wr_dat(display3) ; /百位数显示 wr_com(0xc7) ;wr_dat(display2) ;
23、 /十位数显示 wr_com(0xc8) ;wr_dat(display1) ; /个位数显示 wr_com(0xc9) ;wr_dat(.) ; wr_com(0xca) ;wr_dat(display0); /小数位显示Delay(50); /*显示上限温度*/ void dispuptemp()wr_com(0x83);wr_dat(uptemp0) ;wr_com(0x86);wr_dat(uptemp1+0x30) ; /个位数显示 if(uptemp3=0) /高位为0,不显示 wr_com(0x84);wr_dat(0x20); if(uptemp2=0) wr_com(0x85
24、);wr_dat(0x20) ; /次高位为0,不显示 else wr_com(0x85);wr_dat(uptemp2+0x30) ; /十位数显示 elsewr_com(0x85);wr_dat(uptemp2+0x30) ; /显示十位 wr_com(0x84) ;wr_dat(uptemp3+0x30) ; /百位数显示 Delay(50); /*显示下限温度*/void dispdowntemp() wr_com(0x8b);wr_dat(downtemp0) ;wr_com(0x8e);wr_dat(downtemp1+0x30) ; /个位数显示 if(downtemp3=0x0
25、0) /高位为0,不显示 wr_com(0x8c);wr_dat(0x20) ; if(downtemp2=0x00) wr_com(0x8d) ;wr_dat(0x20) ; /十位数不显示 elsewr_com(0x8d);wr_dat(downtemp2+0x30) ; /十位数显示 elsewr_com(0x8d);wr_dat(downtemp2+0x30) ; wr_com(0x8c);wr_dat(downtemp3+0x30) ; /百位数显示 Delay(50); 3、上下限设置用6个按键设置,有两个用于选择设置的是上限还是下限,用三个分别设置个位、十位、百位,最后一个用于设
26、置符号。设置程序如下:/*设置上限温度*/ void up() dispuptemp(); while(upbit=0) if( j1=0) /设置个位 uptemp1+=1; if(uptemp1=10) uptemp1=0; if( j10=0) /设置十位 uptemp2+=1; if(uptemp2=10) uptemp2=0; if( j100=0) /设置百位 uptemp3+=1; if(uptemp3=10) uptemp3=0; if(sign=0) /设置符号 if(uptemp0=0x20) uptemp0=-; else uptemp0=0x20; dispuptemp
27、(); delay1ms(200); /*设置下限温度*/ void down() dispdowntemp(); while(downbit=0) if( j1=0) /设置个位 downtemp1+=1; if( downtemp1=10) downtemp1=0; if( j10=0) /设置十位 downtemp2+=1; if( downtemp2=10) downtemp2=0; if( j100=0) /设置百位 downtemp3+=1; if( downtemp3=10) downtemp3=0;if(sign=0) /设置符号 if( downtemp0=0x20)down
28、temp0=-; elsedowntemp0=0x20; dispdowntemp(); delay1ms(200); 4、报警子程序:用上下限分别与读取的温度值比较若超出设置的范围则报警。并且上下不得小于或等于下限。报警子程序代码/*报警*/ void bijiao() int uptemper;int downtemper; downtemper=(downtemp3*100+downtemp2*10+downtemp1); /求下限温度 uptemper=(uptemp3*100+uptemp2*10+uptemp1) ; /求上限温度/*比较上下限*/ if(uptemp0=-&dow
29、ntemp0=0x20) beep(); delay1ms(1000); else if(uptemp0=-&downtemp0=-) if(downtemper=uptemper)beep(); delay1ms(1000);/*与温度比较*/ if(flag_Negative_number=0) if(downtemper=temp) if(downtemp0=0x20) beep(); if (uptemp0=0x20) if(uptemper=temp) beep(); if(downtemp0=-)&(downtemper)=temp) beep(); else if(downtem
30、p0=0x20)beep(); 5、蜂鸣器发声:蜂鸣器发声代码:void beep() unsigned char y ; for (y=0 ;y100 ;y+) Delay(50) ; BEEP=!BEEP ; /BEEP取反 /关闭蜂鸣器6、主程序:/*主函数main()*/ main() Menu () ;Init_DS18B20();delay1ms(5);while(1)disp();up(); down(); bijiao(); 7、仿真图8、protel原理图主要模块 9、PCB图三、总结经过几周的课程设计,我加深了对C语言、单片机原理、硬件设计、软件仿真、设置应用软件的学习与理解,并能很好的叫他们应用于实质硬件制作当中。加强了动手能力。深化了理论与实践的结合。四、参考文献:单片机原理与接口技术(第二版)马淑华等编著-北京邮电大学出版社C语言程序设计教程 (第二版)李凤霞主编 -北京理工大学出版社例说51单片机 人民邮电出版社单片机及应用系统设计原理与实践刘海成编著北京航空航天大学出版社DS18B20中文资料LCD1602中文资料