资源描述
沈阳理工大学课程设计论文
目 录
1 概述 1
1.1 简述 1
1.2 温度控制系统的目的 1
2 系统主要元器件介绍 2
2.1 单片机的选用及功能介绍 2
2.2 DS18B20 温度传感器介绍 4
3 总体设计方案 8
3.1 设计原则 9
3.2 引脚连接 9
3.2.1 晶振电路 9
3.2.2 串口引脚 10
3.3 显示部分 10
3.4 温度采集部分 10
4 系统整体设计 11
4.1 系统硬件电路设计 11
4.1.1 主板电路设计 11
4.1.2 各部分电路 11
4.2 系统软件设计 13
4.2.1 系统软件设计整体思路 13
4.2.2 系统程序流图 13
4.2.2 系统程序代码 15
5 结束语 28
参考文献 29
1 概述
1.1 简述
单片机在测控领域中具有十分广泛的应用,它既可以直接处理电信号,也可以间接处理温度、湿度、压力等非电信号。由于该特点,因而被广泛应用于工业控制领域。
本文正是基于温度传感器和单片机而构建的电路,进而完成温度的测量和显示。
温度传感器的发展经历了三个发展阶段:
①传统的分立式温度传感器
②模拟集成温度传感器
③智能集成温度传感器。
目前使用最广的是智能温度传感器 (亦称数字温度传感器) ,是在20世纪90年代中期问世的。它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配于各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍了智能集成温度传感器DS18B20的结构特征及控制方法,并以此传感器为测温元件,AT89S51单片机为控制核心,构成的数字温度测量装置,并对其的工作原理及程序设计作了详细的介绍。
1.2 温度控制系统的目的
本设计的内容是温度测试控制系统,控制对象是温度。温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制。而以往温度控制是由人工完成的而且不够重视,其实在很多场所温度都需要监控以防止发生意外。针对此问题,本系统设计的目的是实现一种可连续高精度调温的温度控制系统,它应用广泛,功能强大,小巧美观,便于携带,是一款既实用又廉价的控制系统。
2 系统主要元器件介绍
2.1 单片机的选用及功能介绍
AT89S51 是美国ATMEL公司生产的低功耗,高性能CMOS型8位单片机,片内含4Kbytes 的可编程的Flash只读程序存储器,兼容标准8051指令系统及引脚。它集Flash ROM程序存储器,并支持可在线编程(ISP)功能;另一方面,由于价格低、因而被广泛应用于许多高性价比的场合,如工业控制、消费电子等各种控制领域,对于简单的测温系统而言,它已经足够。单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。设计中采用89S51单片机。其主要特性如下:
² 与MCS-51产品指令系统完全兼容;
² 4K字节可编程闪烁存储器;
² 1000擦写周期;
² 4.0~5.5V工作电压范围;
² 全静态工作:0Hz-33MHz;
² 程序存储器具有3级加密保护;
² 128*8位内部RAM;
² 32可编程I/O线;
² 两个16位定时器/计数器;
² 6个中断源和2个优先级;
² 可编程全双工串行通道; 图2.1 89S51单片机引脚
² 低功耗的闲置和掉电模式;
² 看门狗(WDT)及双数据指针;
² 具有JTAG接口,可方便地在线编程或在系统编程。
AT89S51 单片机为40引脚双列直插式封装。其引脚排列和逻辑符号如图2.1 所示。
各引脚功能简单介绍如下:
² VCC:供电电压。
² GND:接地。
² P0口:P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高。
² P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入“1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
² P2口:P2口为一个内部上拉电阻的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”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口:P3.0 RXD(串行输口);P3.1TXD(串行输出口) ;P3.2 INT0(外部中断0);P3.3 INT1(外部中断1) ;P3.4 T0(定时器0外部输入);P3.5 T1(定时器1外部输入);P3.6 WR (外部数据存储器写选通);P3.7 RD (外部数据存储器读选通)。同时P3口同时为闪烁编程和编程校验接收一些控制信号。
² RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
² ALE / PROG :当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
² PSEN:外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN两次有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。
² EA/VPP:当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
² XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
² XTAL2:来自反向振荡器的输出。
2.2 DS18B20 温度传感器介绍
每一片DSl8B20在其ROM中都存有其唯一的48位序列号,在出厂前已写入片内ROM 中。主机在进入操作程序前必须用读ROM(33H)命令将该DSl8B20的序列号读出。
DS18B20的测温原理如下,低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜坡累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。
1、DS18B20的性能特点如下:
1) 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;
2) 测温范围 -55℃~+125℃,固有测温分辨率0.5℃;
3) 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温;
4) 工作电源: 3~5V/DC;
5) 在使用中不需要任何外围元件;
6) 测量结果以9~12位数字量方式串行传送;
7) 温度以3位数字显示;
8) 用户可定义报警设置,报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
9) 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
2、 DS18B20的内部结构
DS18B20采用3脚PR-35封装;DS18B20的内部结构,如图2.3所示。
3、 DS18B20内部结构主要由四部分组成
1) 64位光刻ROM。开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前56位的CRC校验码,这也是多个DS18B20可以采用一线进行通信的原因[10]。64位闪速ROM的结构如下.
8b检验CRC
48b序列号
8b工厂代码(10H)
MSB LSB MSB LSB MSB LSB
图2.2 ROM结构
图2.3 DS18B20内部结构
2) 非挥发的温度报警触发器TH和TL,可通过软件写入用户报警上下限值。
3) 高速暂存存储,可以设置DS18B20温度转换的精度。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的E2PRAM。高速暂存RAM的结构为8字节的存储器,结构如表2.5所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。它的内部存储器结构和字节定义如图2.6所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式。
DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率,如表2.7。由表可见,分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
Byte0
温度测量值LSB(50H)
Byte1
温度测量值MSB(50H)
E2PROM
Byte2
TH高温寄存器
ß----à
TH高温寄存器
Byte3
TL低温寄存器
ß----à
TL 低温寄存器
Byte4
配位寄存器
ß----à
配位寄存器
Byte5
预留(FFH)
Byte6
预留(0CH)
Byte7
预留(IOH)
Byte8
循环冗余码校验(CRC)
图2.4 DS18B20内部存储器结构
TM
R1
R0
1
1
1
1
1
图2.6 DS18B20字节
表2.1 DS18B20温度转换时间表
R1
R0
分辨率/位
温度最大转向时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。图2.8是一部分温度值对应的二进制温度数据。
4) CRC的产生
在64 b ROM的最高有效字节中存储有循环冗余校验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
表2.2 一部分温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0000
0191H
+10.125
0000 0000 1010 0001
00A2H
+0.5
0000 0000 0000 0010
0008H
0
0000 0000 0000 1000
0000H
-0.5
1111 1111 1111 0000
FFF8H
-10.125
1111 1111 0101 1110
FF5EH
-25.0625
1111 1110 0110 1111
FE6FH
-55
1111 1100 1001 0000
FC90H
3 总体设计方案
考虑使用温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行转换,依次完成设计要求。
在本系统的电路设计方框图如图2.1所示,它由三部分组成:①控制部分主芯片采用单片机AT89S51;②显示部分采用3位LED数码管以动态扫描方式实现温度显示;③温度采集部分采用DS18B20温度传感器。
单
DS18B20
数码管
显示
蜂鸣器
图3.1 温度计电路总体设计方案
3.1 设计原则
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图3.1所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。本设计采用电源供电方式, P1.1口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管和89S51的P1.0来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10 μs。采用寄生电源供电方式是VDD和GND端均接地。由于单线制只有一根线,因此发送接收口必须是三状态的。主机控制DS18B20完成温度转换必须经过3个步骤:
² 初始化;
² ROM操作指令;
² 存储器操作指令。
3.2 引脚连接
3.2.1 晶振电路
单片机XIAL1和XIAL2分别接30PF的电容,中间再并个12MHZ的晶振,形成单片机的晶振电路。
3.2.2 串口引脚
P1.1和P1.2引脚接继电器电路的4.7K电阻上,P1口其他引脚悬空
P2口中P2.0、P2.1、P2.2、P2.3分别接到显示电路的4.7K电阻上,P2.5接蜂鸣器电路,其他引脚悬空
P3口中P3.5、P3.6、P3.7接到按键电路。
ALE引脚悬空,复位引脚接到复位电路、VCC接电源、VSS接地、EA接电源。
3.3 显示部分
显示电路采用3位共阳LED数码管,从P0口送数,P2口扫描。
3.4 温度采集部分
DS18B20温度传感器是美国DALLAS公司生产的,DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。这一部分主要完成对温度信号的采集和转换工作,由DS18B20数字温度传感器及其与单片机的接口部分组成。数字温度传感器DS18B20把采集到的温度通过数据引脚传到单片机的P1.0口,单片机接受温度并存储。此部分只用到DS18B20和单片机,硬件很简单。
29
4 系统整体设计
4.1 系统硬件电路设计
4.1.1 主板电路设计
单片机的P1.0接DS18B20的2号引脚,P0口送数P2口扫描,P1.1、P1.2控制加热器和电风扇的继电器。如附录2。
4.1.2 各部分电路
(1) 显示电路
显示电路采用了7段共阴数码管扫描电路,节约了单片机的输出端口,便于程序的编写。
图4.1 显示电路图
(2) DS18B20温度传感器电路
图4.2 温度传感器电路引脚图
(3) 单片机电路
图4.3 单片机电路引脚图
(4) 晶振控制电路
图4.4 晶振控制电路图 (5) 复位电路
图4.5复位电路图
4.2 系统软件设计
4.2.1 系统软件设计整体思路
高级语言是面向问题和计算过程的语言,它可通过于各种不同的计算机,用户编程时不必仔细了解所用的计算机的具体性能与指令系统,而且语句的功能强,常常一个语句已相当于很多条计算机指令,于是用高级语言编制程序的速度比较快,也便于学习和交流,但是本系统却选用了汇编语言。
本装置的软件包括主程序、读出温度子程序、复位应答子程序、写入子程序、以及有关DS18B20的程序(初始化子程序、写程序和读程序)
4.2.2 系统程序流图
1)主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
通过调用读温度子程序把存入内存储中的整数部分与小数部分分开存放在不同的两个单元中,然后通过调用显示子程序显示出来
开始
初始化
示化
获取温度值
与温度上下限比较
报警
转换并显示
YES
图4.6 主程序流程图
2)读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
DS18B20的各个命令对时序的要求特别严格,所以必须按照所要求的时序才能达到预期的目的,同时,要注意读进来的是高位在后低位在前,共有12位数,小数4位,整数7位,还有一位符号位。
DS18B20复位、应答子程序
跳过ROM匹配命令
写入子程序
温度转换命令
写入子程序
显示子程序
DS18B20复位、应答子程序
跳过ROM匹配命令
写入子程序
读温度命令子程序
结 束
图4.7 读出温度子程序
4.2.2 系统程序代码
#include<AT89X52.h> //将AT89X52.h头文件包含到主程序
#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)
#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)
#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)
uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度
bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右
bit s1=0; //s1标志位用于上下限查看时的显示
void display1(uint z); //声明display1()函数(display.h头文件中的函数,ds18b20.h要用应先声明)
#include"ds18b20.h" //将ds18b20.h头文件包含到主程序
#include"keyscan.h" //将keyscan.h头文件包含到主程序
#include"display.h" //将display.h头文件包含到主程序
/***********************主函数************************/
void main()
{
beer=1; //关闭蜂鸣器
led=1; //关闭LED灯
timer1_init(0); //初始化定时器1(未启动定时器1)
get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)
while(1) //主循环
{
get_temperature(0); //获取温度函数
display(temp,temp_d*0.625);//显示函数
alarm(); //报警函数
}
}
#ifndef __ds18b20_h__ //定义头文件
#define __ds18b20_h__
#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)
#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)
sbit DQ= P2^3; //可位寻址变量定义,用DQ表示P2.3口
sbit beer=P1^0; //用beer表示P1.0
sbit led=P1^1; //用led表示P1.1
uchar temp=0; //测量温度的整数部分
uchar temp_d=0; //测量温度的小数部
bit f=0; //测量温度的标志位,0’表示“正温度”‘1’表示“负温度”)
bit f_max=0; //上限温度的标志位‘0’表示“正温度”‘1’表示“负温度”)
bit f_min=0; //下限温度的标志位‘0’表示“正温度”、‘1’表示“负温度”)
bit w=0; //报警标志位‘1’启动报警‘0’关闭报警)
/*****************************延时子函数******************************/
void ds18b20_delayus(uint t) //延时几μs
{
while(t--);
}
void ds18b20_delayms(uint t) //延时1ms左右
{
uint i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}
/**************************ds18b20初始化函数*************************/
void ds18b20_init() // DS18B20初始化
{
uchar c=0;
DQ=1;
DQ=0; //控制器向DS18B20发低电平脉冲
ds18b20_delayus(80); //延时15-80μs
DQ=1; //控制器拉高总线,
while(DQ); //等待DS18B20拉低总线,在60-240μs之间
ds18b20_delayus(150); //延时,等待上拉电阻拉高总线
DQ=1; //拉高数据线,准备数据传输;
}
/***************************ds18b20字节读函数************************/
uchar ds18b20_read() //DS18B20 字节读取
{
uchar i;
uchar d = 0;
DQ = 1; //准备读;
for(i=8;i>0;i--)
{
d >>= 1; //低位先发;
DQ = 0;
_nop_();
_nop_();
DQ = 1; //必须写1,否则读出来的将是不预期的数据;
if(DQ) //在12us处读取数据;
d |= 0x80;
ds18b20_delayus(10);
}
return d; //返回读取的值
}
/*************************ds18b20字节写函数**************************/
void ds18b20_write(uchar d) // ds18b20字节写
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=d&0x01;
ds18b20_delayus(5);
DQ=1;
d >>= 1;
}
}
/***************************获取温度函数****************************/
void get_temperature(bit flag)
{
uchar a=0,b=0,c=0,d=0;
uint i;
ds18b20_init(); //DS18B20初始化
ds18b20_write(0xcc); //向DS18B20发跳过读ROM命令
ds18b20_write(0x44); //写启动DS18B20进行温度转换命令,转换结果存入内部RAM
if(flag==1)
{ //首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。
display1(1); //用开机动画耗时
}
else
ds18b20_delayms(1);
ds18b20_init(); //DS18B20初始化
ds18b20_write(0xcc); //向DS18B20发跳过读ROM命令
ds18b20_write(0xbe); //写读内部RAM中9字节的内容命令
a=ds18b20_read(); //读内部RAM (LSB)
b=ds18b20_read(); //读内部RAM (MSB)
if(flag==1) //局部位变量f=1时读上下线报警温度
{
max=ds18b20_read(); //读内部RAM (TH)
min=ds18b20_read(); //读内部RAM (Tl)
}
if((max&0x80)==0x80) //若读取的上限温度的最高位(符号位)为‘1’表明是负温度
{f_max=1;max=(max-0x80);} //将上限温度符号标志位置‘1’表示负温度,将上限温度装换成无符号数。
if((min&0x80)==0x80) //若读取的下限温度的最高位(符号位)为‘1’表明是负温度
{f_min=1;min=(min-0x80);} //将下限温度符号标志位置‘1’表示负温度,将下限温度装换成无符号数。
i=b;
i>>=4;
if (i==0)
{
f=0; //i为0,正温度,设立正温度标记
temp=((a>>4)|(b<<4)); //整数部分
a=(a&0x0f);
temp_d=a; //小数部分
}
else
{
f=1; //i为1,负温度,设立负温度标记
a=~a+1;
b=~b;
temp=((a>>4)|(b<<4)); //整数部分
a=(a&0x0f); //小数部分
temp_d=a;
}
}
/*************************存储极限温度函数***************************/
void store_t()
{
if(f_max==1) //若上限温度为负,将上限温度转换成有符号数(最高位为1是负,为0是正)
max=max+0x80;
if(f_min==1) //若下限温度为负,将上限温度转换成有符号数
min=min+0x80;
ds18b20_init(); //DS18B20初始化
ds18b20_write(0xcc); //向DS18B20发跳过读ROM命令
ds18b20_write(0x4e); //向DS18B20发写字节至暂存器2和3(TH和TL)命令
ds18b20_write(max); //向暂存器TH(上限温度暂存器)写温度
ds18b20_write(min); //向暂存器TL(下限温度暂存器)写温度
ds18b20_write(0xff); //向配置寄存器写命令,进行温度值分辨率设置
ds18b20_init(); //DS18B20初始化
ds18b20_write(0xcc); //向DS18B20发跳过读ROM命令
ds18b20_write(0x48); //向DS18B20发将RAM中2、3字节的内容写入EEPROM
} //DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器
**********************************************************************/
#ifndef __ds18b20_display_H__ //定义头文件
#define __ds18b20_display_H__
#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)
#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)
sbit wei1=P2^4; //可位寻址变量定义,用wei1表示P2.4口
sbit wei2=P2^5; //用wei2表示P2.5口
sbit wei3=P2^6; //用wei3表示P2.6口
sbit wei4=P2^7; //用wei4表示P2.7口
uchar num=0; //定义num为全局无符号字符型变量,赋初值为‘0’
uchar code temperature1[]={ 0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //定义显示码表0~9
uchar code temperature2[]={ 0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef}; //带小数点的0.~9.
uchar code temperature3[]={ 0x00,0x80,0x40,0x76,0x38}; //依次是‘不显示’‘.’‘-’‘H’‘L’
/*****************************延时子函数******************************/
void display_delay(uint t) //延时1ms左右
{
uint i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}
/**************************定时器1初始化函数***************************/
void timer1_init(bit t)
{
TMOD=0x10; //设定定时器1工作在方式1,最大定时65.53ms
TH0=0x3c; //定时器赋初值,定时50ms
TL0=0xb0;
EA=1; //开总中断
ET1=1; //开定时器1中断
TR1=t; // 局部变量t为1启动定时器1,为
展开阅读全文