《单片机DS18B20数字温度计课程设计报告(共25页).doc》由会员分享,可在线阅读,更多相关《单片机DS18B20数字温度计课程设计报告(共25页).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上成绩 南京工程学院 通信工程学院 课程设计任务书题 目 DS18B20数字温度计设计 课 程 名 称 单片机原理及应用B 专 业 班 级 学 生 姓 名 学 号 设 计 地 点 指 导 教 师 设计起止时间: 年 月 日至 年 月 日 目录2.1 基本思路.32.2系统设计原理.,32.3系统组成.3三、系统硬件设计.6 4.1具体步骤和设计内容14五、结果验证、参考文献25绪论1.1 设计目的1掌握单总线协议的基本特点及通信过程;2. 掌握数字温度传感器DS18B20的基本特点及单总线控制协议;3. 掌握单片机IO端口模拟单总线时序控制程序的编写方法;4.掌握LCD
2、液晶显示器的显示驱动方法。1.2设计内容(1)基本内容:在nKDE51单片机实验教学系统上,利用DS18B20数字温度传感器连续测试环境温度,对测试数据进行处理计算,在RT-1602字符点阵LCD上实时显示环境温度值;(2)附加内容:实现环境温度越限告警功能。1.3设计要求1单片机I/O口和DS18B20的数据段相连;2编写单片机通过IO端口模拟单总线时序控制DS18B20的程序,独出温度;3在1602字符点阵液晶显示模块上显示实时温度。二、基本设计2.1基本思路本次课程设计主要是数字式环境温度测试仪设计,实现环境温度越限告警功能。当LCD液晶显示器显示的温度小于29度时,只显示温度,当显示的
3、温度大29度时,LCD液晶显示器显示“HOT!”,蜂鸣器鸣叫。2.2系统设计原理利用温度传感器DS18B20可以直接读取被测温度值,进行转换的特性,模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,并与设置的温度报警限比较,超过限度后通过扬声器报警。同时处理后的数据送到LCD中显示。2.3系统组成本课题以是AT89C51单片机为核心设计的一种数字温度控制系统,系统整体硬件电路包括,传感器数据采集电路DS18B20,温度显示电路,蜂鸣器报警电路,单片机主板电路等组成。系统框图主要由主控制器、单片机复位、蜂鸣器报警、时钟振荡、LCD显示、温度传感器组成。系统框图如图所示
4、:单片机复位温度传感器LCD显示电路蜂鸣器报警主 控 制 器时钟振荡电路 图2-1方案设计1主控制器单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。2温度显示电路字符型液晶显示模块是一种专门用于显示字母、数字、符号等的点阵式液晶显示模块。它是由若干个5*7或5*11等点阵字符位组成,每一个点阵字符位都可以显示一个字符。点阵字符位之间有一定的间隔,起到字符间距和行距的作用。3温度传感器DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元
5、件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。4蜂鸣器报警当温度达到设定上下限时,蜂鸣器会发出报警,同时有液晶显示“LOW!”或者“HOT!”,同时可看到被测物体温度或环境实时温度。三、系统硬件设计3.1系统电路接线图 图3-1 系统电路接线图3.2 主系统AT89C51是一个低功耗,高性能8位单片机,片内含4k Bytes ISP (In-system programmable)的可反复擦写1000次的Flash 只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通
6、用8位中央处理器和ISP Flash存储单元,AT89C51在众多嵌入式控制应用系统中得到广泛应用。主要性能特点1、4k Bytes Flash片内程序存储器;2、128 bytes的随机存取数据存储器;3、32个外部双向输入/输出(I/O)口;4、5个中断优先级、2层中断嵌套中断5、6个中断源;6、2个16位可编程定时器/计数器7、2个全双工串行通信口;8、片内振荡器和时钟电路;9、与MCS-51兼容;10、全静态工作:0Hz-33MHz;11、三级程序存储器保密锁定;12、可编程串行通道;13、低功耗的闲置和掉电模式。管脚说明:VCC:电源电压输入端。GND:电源地。 图3-2 单片机引脚
7、图引脚功能说明:P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的在FLASH3作为第八编程和校验时,P1口编程和校验时,P1口作为第八位地址P2口:P2口为一
8、个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平
9、,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口除了作为普通I/O口,还有第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(T0定时器的外部计数输入)P3.5 T1(T1定时器的外部计数输入)P3.6 /WR(外部数据存储器的写选通)P3.7 /RD(外部数据存储器的读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到
10、内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。89C51的P0、P1、P2、P3口作为输入时都是准双向口。除了P1口外P0、P2、P3口都还有其他的功能。RST:复位输入端,高电平有效。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:地址锁存允许/编程脉冲信号端。当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用
11、作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号,低电平有效。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:外部程序存储器访问允许。当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电
12、平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)XTAL1:片内振荡器反相放大器和时钟发生器的输入端。XTAL2:片内振荡器反相放大器的输出端。3.3显示电路LM016LLM016L的结构及功能:LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM
13、),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码,CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可查找参考书。CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符。图3-3 引脚图 LM016L引脚功能说明:Vss(1脚):一般接地。Vdd(2
14、脚):接电源。Vee(3脚):液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。RS(4脚):RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W(5脚):R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(6脚):E(或EN)端为使能(enable)端,下降沿使能。DB0(7脚):底4位三态、 双向数据总线 0位(最低位)。DB1(8脚):底4位三态、 双向数据总线 1位。DB2(9脚):底4位三态、 双向数据总线 2位。DB3(10脚):底4位三态、 双向数
15、据总线 3位。DB4(11脚):高4位三态、 双向数据总线 4位。DB5(12脚):高4位三态、 双向数据总线 5位。DB6(13脚):高4位三态、 双向数据总线 6位。DB7(14脚):高4位三态、 双向数据总线 7位(最高位)(也是busy flang)。寄存器选择控制如表3-1。表3-1寄存器选择控制RSR/W操作说明00写入指令寄存器(清除屏等)01读busy flag(DB7),以及读取位址计数器(DB0DB6)值10写入数据寄存器(显示各字型等)11从数据寄存器读取数据3.4 蜂鸣器报警 图3-4 蜂鸣器引脚图蜂鸣器的工作原理:蜂鸣器的端口定义为P2.2,其原理根据将蜂鸣器的一端接
16、高电平,另一端接至P2某一脚,编写的简单程序使那一脚为低电平即可使其发出声音,否则不响。同时,在上下限报警时LCD显示“LOW!”或“HOT!”。3.5 DS18B20传感器1 DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。 图3-5 DS18B20内部结构 2DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。 图3-6 DS18B20引脚图 3DS18B20工作原理DS18B20的读写时序和测温原理与
17、DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。这是1
18、2位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。DS18B20温度数据表如表3-2所示:表3-2:DS18B20温度数据表TEMPERTUREDIGALOUTPUT(Binary)DIGITALOUTPUT(Hex)+1250000 0111 1101 000007D0h+850000 0101 0101 00000550h+25.06250000 0001 1001 0001
19、01991h+10.1250000 0000 1010 001000A2h+0.50000 0000 0000 10000008h00000 0000 0000 0000000h-0.51111 1111 1111 1000FFF8h-10.1251111 1111 0101 1110Ff5Eh-25.06251111 1110 0110 1111FE6Fh-551111 1100 1001 0000FC90h4DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器 TH、TL和结构寄存器
20、。配置寄存器各位字节的意义如下表3-3:表3-3: 配置寄存器结构TMR1R011低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用 户不要去改动。R1和R0用来设置分辨率,如下表3-4所示:(DS18B20出厂时被设置为12位) 表3-4: 温度分辨率设置表R1R0分辨率温度最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750ms5高速暂存存储器 高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和
21、第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。对应的温度计算: 当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表3-5是对应的一部分温度值。第九个字节是冗余检验字节。表3-5 DS18B20暂存寄存器分布存储器内容字节地址温度值低位(LS Byte)0温度值高位(MS Byte)1高温限值(TH)2低温限值(TL)3配置寄存器4保留5保留6保留7CRC校验值6根据DS18B20的通讯协议 主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功
22、后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。RAM指令表如3-6所示:表3-6 RAM指令表指定约定代码功能温度变换44H启动DS18B20进行温度转换,12位转换时最长为750ms(9位93.75ms)。结果存入内部9字节RAM中读暂存取0BEH读内部RAM中9字节的内容写暂存取4EH发出向内部RAM的3写上、下.4字节送两字节数据限温度数据命令,紧跟该命令之后,是传送两字节的数据复制暂存48
23、H将ROM中第3、4字节的内容复制到EEPROM中重调EEPROM0B8H将EEPROM中内容恢复到ROM中的第3、4字节读供电方式0B4H读DS18B20的供电模式。寄生供电时DS18B20发送“0”,外接电源供电DS18B20发送“1” 四、系统软件设计4.1具体步骤和设计内容1、主程序中首先初始化:检测DS18B20是否存在,然后通过调用读温度子程序读出DS18B20的当前值,调用温度转换子程序把从DS18B20中读出的值转换成对应的温度,调用显示子程序把温度值在LCD液晶显示器相应位置进行显示。2、温度测量子程序的功能:读出并处理DS18B20测量的当前温度值,读出的温度值以BCD码的
24、形式存放在缓冲区,DS18B20每一次读写之前都要先进行复位,复位成功后发送一条ROM指令,最后发送RAM指令。3、温度转换子程序:把从DS18B20中读出的值转换成对应的温度值,以BCD码的形式存放在缓冲区,正负号存放在符号标志位中。4、显示缓冲区和LCD液晶显示器:显示子程序首先把温度转换子程序得到的值变换后放入显示缓冲区,然后调用LCD液晶显示器动态显示程序显示4.2程序流程图主程序 开 始(1)主程序 调用显示子程序显示 调用温度转换子程序 调用测温子程序 初 始 化 (2)温度测量子程序 开 始 DS18B20复 位 初 始 化 发 跳 过 ROM 指 令 发温度转换命令温度转换 D
25、S18B20 复 位 初 始 化 读 转 换 温 度 值 返 回(3)温度转换子程序 开 始 求补后得温度编码符 号 标 志 置1 返 回 转 换 成 BCD 码 小 数 四 舍 五 入 直 接 得 温 度 编 码 符 号 标 志 清 0 判 断 正 负 负 正 LCD 液 晶 显 示 器 显 示 温 度 值 放 入 显 示 缓 充 区 开 始(4)显示子程序 温 度 大 于29 否 返 回LCD 液 晶 显 示 器 闪 烁,蜂鸣器鸣叫 是4.3源程序清单#include #include #define uchar unsigned char#define uint unsigned int
26、void lcd_busy();void lcd_init();void lcd_wcmd(uchar cmd) ;void lcd_wdat(uchar dat);uchar ow_reset(void);void initds18b20(void);uchar read_byte(void);void write_byte(uchar val);void temperature_cov(void);void display();void delay(uint i);sbit DQ =P00; /DS18B20端口sbit RS=P20;/LCD端口sbit RW=P21;sbit E=P2
27、2;sbit buzzer=P27; /定义蜂鸣器端口unionuchar c2;uint x; temp; /联合体uchar flag; /定义温度正负值标志变量,正为0,负为1int cc,xs;/*/*延时函数 */*/void delay(uint i)for(;i0;i-);/*/*复位函数 */*/uchar ow_reset(void)uchar reset;DQ=0;delay(50);DQ=1;delay(3);reset=DQ;delay(25);return(reset);/*/*初始化DS18B20 */*/void initds18b20(void) ow_rese
28、t(); /write_byte(0xCC);write_byte(0x4E);write_byte(0x00);write_byte(0x00);write_byte(0x7F);/*/*从单总线读取一个字节 */*/uchar read_byte(void)uchar i;uchar value=0;for (i=8;i0;i-)value=1;DQ=0;DQ=1;delay(1);if(DQ)value|=0x80;delay(6);return(value);/*/*向单总线上写一个字节 */*/void write_byte(uchar val)uchar i;for(i=8;i0;
29、i-)DQ=0;DQ=val&0x01;delay(5);DQ=1;val=val/2;delay(5);/*/*读取温度 */*/ void Read_Temperature(void)ow_reset();write_byte(0xCC);write_byte(0x44);ow_reset();write_byte(0xCC);write_byte(0xBE); temp.c1=read_byte();temp.c0=read_byte();/*/*温度转换 */*/void temperature_cov(void) if (temp.c00xF8)/判断温度是正数还是负数flag=1;
30、 /温度为负数flag置1temp.x=temp.x+1;xs=temp.x&0x0F;xs=xs*10;cc=temp.c0*256.0+temp.c1; /将温度从两个八位数表示成一个十六位数cc=cc*0.0625; xs=xs*0.0625;/*/*显示 */*/void display()int i;/SP=0x50;/lcd_init();lcd_wcmd(0x80); /写入缓冲区起始地址为第一行第一列 lcd_wdat(0x54); /显示TEMPERATURElcd_wdat(0x45);lcd_wdat(0x4d);lcd_wdat(0x50);lcd_wdat(0x45)
31、;lcd_wdat(0x52);lcd_wdat(0x41);lcd_wdat(0x54);lcd_wdat(0x55);lcd_wdat(0x52);lcd_wdat(0x45);lcd_wcmd(0xc0); lcd_wdat(0x44);lcd_wdat(0x51);lcd_wdat(0x59);lcd_wdat(0x20);buzzer=1;lcd_wcmd(0x8C); lcd_wdat(0x20); lcd_wdat(0x20);lcd_wdat(0x20); lcd_wdat(0x20);lcd_wcmd(0xc4); if(flag = 1)lcd_wdat(0x2d); /如
32、果flag为1表示温度为负值,显示-符号if(cc=4) buzzer = 0; lcd_wcmd(0x8C); lcd_wdat(0x4C); lcd_wdat(0x4F); lcd_wdat(0x57); lcd_wdat(0x21); lcd_wcmd(0xc4); if(cc=29) buzzer=0; lcd_wcmd(0x8C); lcd_wdat(0x48); lcd_wdat(0x4F); lcd_wdat(0x54); lcd_wdat(0x21); lcd_wcmd(0xc4); if(cc 99)lcd_wdat(cc/100+0x30); /百位数转换为LCD显示模式
33、lcd_wdat(cc%100/10+0x30); /十位数转换为LCD显示模式 lcd_wdat(cc%10+0x30); /个位数转换为LCD显示模式 lcd_wdat(0x2e); /显示.小数点lcd_wdat(xs+0x30); lcd_wdat(0xdf); /显示。符号 lcd_wdat(0x43); /显示C 符号for( i=0;i3;i+)delay (5000);/*/*检查LCD忙状态 */*lcd_busy为1时,忙,等待 lcd-busy为0时,闲,可写指令与数据 */*/ void lcd_busy()P1=0xff;RS=0;RW=1;E=1;E=0;while
34、(P1&0x80)E=0;E=1;delay(256);/*/* LCD初始化设定 */*/void lcd_init() delay(15) ;lcd_wcmd(0x01); /清屏lcd_wcmd(0x38); /使用八位数据,显示两行,使用5*7的字型delay(5) ;lcd_wcmd(0x0c); /显示器开,光标开,字符不闪烁delay(5) ;lcd_wcmd(0x06); /字符不动,光标自动右移一格delay(5) ;/*/*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码 */*/void lcd_wcmd(uchar cmd)lcd_busy(); E=0;RS=0;RW=0;E=1;P1=cmd;E=0;delay(256);/*/*写显示数据到LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据 */*