摘要
随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集系统与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STC89C52单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括STC89C52单片机最小系统,18B20测温电路,温度显示电路,报警电路等。系统程序主要包括主程序,读温度子程序,计算温度子程序,按键处理子程序,LED显示子程序等。
【关键字】STC89C52单片机;DS18B20;显示电路
Abstract
Along with the computer measurement and control technology of the rapid development and wide application,based on singlechip temperature gathering and control system .The control system can real-time storage temperature data and record related to the current time.System design related hardware circuit and related applications. Hardware circuit include STC89C52 microcontroller smallest system,18B20 temperature detection circuit, temperature display circuit,alarm circuit,etc.System programming mainly include main program,read temperature subroutine,the calculation of temperature subroutines,key processing procedures,LED display procedures,etc.
【keyword】STC89C52 microcontroller; DS18B20; display circuit
目录
[1绪论................................................................................................................ 1](#1绪论................................................................................................................ 1)
[2 系统总设计方案.............................................................................................. 1](#2 系统总设计方案.............................................................................................. 1)
[2.1数字温度计设计方案论证............................................................................. 1](#2.1数字温度计设计方案论证............................................................................. 1)
[2.1.1方案一...................................................................................................... 1](#2.1.1方案一...................................................................................................... 1)
[2.1.2 方案二..................................................................................................... 2](#2.1.2 方案二..................................................................................................... 2)
[2.2系统总体框图............................................................................................... 2](#2.2系统总体框图............................................................................................... 2)
[2.3系统的功能.................................................................................................. 2](#2.3系统的功能.................................................................................................. 2)
[2.4本系统优点.................................................................................................. 2](#2.4本系统优点.................................................................................................. 2)
[2.4.1线路简单.................................................................................................. 2](#2.4.1线路简单.................................................................................................. 2)
[2.4.2温度测量准确........................................................................................... 2](#2.4.2温度测量准确........................................................................................... 2)
[3 主要硬件模块介绍.......................................................................................... 3](#3 主要硬件模块介绍.......................................................................................... 3)
[3.1 STC单片机介绍........................................................................................... 3](#3.1 STC单片机介绍........................................................................................... 3)
[3.1.1 STC单片机功能介绍................................................................................. 3](#3.1.1 STC单片机功能介绍................................................................................. 3)
[3.1.2 STC89C52 单片机引脚结构与功能............................................................ 4](#3.1.2 STC89C52 单片机引脚结构与功能............................................................ 4)
[3.2系统模块...................................................................................................... 5](#3.2系统模块...................................................................................................... 5)
[3.2.1系统原理图............................................................................................... 6](#3.2.1系统原理图............................................................................................... 6)
[3.2.2主控制器.................................................................................................. 6](#3.2.2主控制器.................................................................................................. 6)
[3.2.3显示电路.................................................................................................. 7](#3.2.3显示电路.................................................................................................. 7)
[3.2.4报警温度调整按键电路............................................................................. 8](#3.2.4报警温度调整按键电路............................................................................. 8)
[3.2.5温度传感电路........................................................................................... 8](#3.2.5温度传感电路........................................................................................... 8)
[3.2.6报警电路.................................................................................................. 9](#3.2.6报警电路.................................................................................................. 9)
[3.3 DS18B20数字温度传感器介绍...................................................................... 9](#3.3 DS18B20数字温度传感器介绍...................................................................... 9)
[3.3.1特性介绍.................................................................................................. 9](#3.3.1特性介绍.................................................................................................. 9)
[3.3.2引脚介绍................................................................................................ 10](#3.3.2引脚介绍................................................................................................ 10)
[3.3.3访问18B20的协议.................................................................................. 10](#3.3.3访问18B20的协议.................................................................................. 10)
[3.3.4 DS18B20命令设置................................................................................. 12](#3.3.4 DS18B20命令设置................................................................................. 12)
[3.3.5 DS18B20内部温度表现形式.................................................................... 12](#3.3.5 DS18B20内部温度表现形式.................................................................... 12)
[4 18B20时序图及相应的软件设计..................................................................... 14](#4 18B20时序图及相应的软件设计..................................................................... 14)
[4.1复位时序.................................................................................................... 14](#4.1复位时序.................................................................................................... 14)
[4.2 读/写时序................................................................................................. 15](#4.2 读/写时序................................................................................................. 15)
[5 程序框图及C语言设计................................................................................. 18](#5 程序框图及C语言设计................................................................................. 18)
[5.1温度采集系统流程图.................................................................................. 18](#5.1温度采集系统流程图.................................................................................. 18)
[5.2读取温度流程图......................................................................................... 18](#5.2读取温度流程图......................................................................................... 18)
[5.3温度显示流程图......................................................................................... 18](#5.3温度显示流程图......................................................................................... 18)
[5.4温度设置流程图......................................................................................... 20](#5.4温度设置流程图......................................................................................... 20)
[5.5温度采集系统C语言设计........................................................................... 21](#5.5温度采集系统C语言设计........................................................................... 21)
[结论................................................................................................................. 30](#结论................................................................................................................. 30)
[致谢................................................................................................................. 31](#致谢................................................................................................................. 31)
[参考文献.......................................................................................................... 32](#参考文献.......................................................................................................... 32)
基于单片机的温度采集系统的设计
-软件设计
电子与信息工程学院 电子信息工程专业 级 班
指导老师 xxx
1绪论
随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时还有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。
本文主要介绍了一个基于STC89C52单片机的测温系统,详细描述了利用数字温度传感器DS18B20 开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20 的数据采集过程。对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20与STC89C52结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
2 系统总设计方案
2.1数字温度计设计方案论证
2.1.1方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D 转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D 转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。
2.1.2 方案二
考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。
2.2系统总体框图

图2.3-1
2.3系统的功能
温度测量功能:利用DS18B20数字温度传感器实现对温度进行准确的测量,使温度值显示到数码管上。
2.4本系统优点
2.4.1线路简单
DS18B20与单片机之间一根导线进行数据传输,不需要对数据进
行转换,接线简单。
2.4.2温度测量准确
DS18B20的温度分辨率为0.0625,所以对温度值可以进行准确的温度转换。
3 主要硬件模块介绍
3.1 STC单片机介绍
3.1.1 STC单片机功能介绍
单片机是随着大规模集成电路的出现极其发展,将计算机的CPU,RAM,ROM,定时/计数器和多种I/O接口集成在一片芯片上,形成了芯片级的计算机,因此单片机早期的含义称为单片微型计算(single chipmicrocomputer).它拥有优异的性价比、集成度高、体积小、可靠性高、控制功能强、低电压、低功耗的显著优点.主要应用于智能仪器仪表、工业检测控制、机电一体化等方面,并且取得了显著的成果.单片机应用系统可以分为:(1)最小应用系统是指能维持单片机运行的最简单配置的系统。这种系统成本低廉,结构简单,常构成一些简单的控制系统,如开关状态的输入/输出控制等。片内ROM/EPROM的单片机,其最小应用系统即为配有晶振,复位电路,电源的单个单片机.片内无ROM/EPROM的单片机,其最小应用系统除了外部配置晶振,复位电路,电源外,还应外接EPROM或EEPROM作为程序存储器用.(2)最小功耗应用系统是指为了保证正常运行,系统的功耗最小.(3)典型应用系统是指单片机要完成工业测控功能所必须的硬件结构系统。
STC89C52 是一种低功耗、高性能 CMOS8 位微控制器,具有8K在系统可编程 Flash 存储器。使用 Atmel 公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 STC89C52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52 具以下标准功能:8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗定时器,2个数据指针,三个 16 位定时器/计数器一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52 可降至 0Hz 静态逻辑操作,支持 2 种软件可选择节电模式。空闲模式下,CPU停止工作,允许 RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
3.1.2 STC89C52 单片机引脚结构与功能

图3.1.2-1
VCC : 电源
GND : 地
P0 口: P0 口是一个 8 位漏极开路的双向 I/O 口。作为输出口,每位能驱动 8 个 TTL 逻辑电平。对 P0 端口写"1"时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低 8 位地址/数据复用。在这种模式下,P0 具有内部上拉电阻。在 flash 编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1 口: P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P1 端口写"1"时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0 和 P1.2 分别作定时器/计数器 2 的外部计数输入(P1.0/T2)和时器/计数器 2的触发输入(P1.1/T2EX),具体如下表所示。在 flash 编程和校验时,P1 口接收低 8 位地址字。
P2 口: P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P2 端口写"1"时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行 MOVX @DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送 1。在使用8 位地址(如 MOVX @RI)访问外部数据存储器时,P2 口输出 P2 锁存器的内容。在 flash 编程和校验时,P2 口也接收高 8 位地址字节和一些控制信号。
P3 口: P3 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P3 端口写"1"时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3 口亦作为 STC89C52 特殊功能(第二功能)使用,如下表所示。在 flash 编程和校验时,P3 口也接收一些控制信号。
RST: 复位输入。晶振工作时,RST 脚持续 2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功能无效。DISRTO 默认状态下,复位高电平有效。
ALE/PROG : 地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在 flash 编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。如果需要,通过将地址为 8EH 的 SFR 的第 0 位置 "1",ALE 操作将无效。这一位置"1",ALE 仅在执行 MOVX 或 MOVC 指令时有效。否则,ALE 将被微弱拉高。这个 ALE 使能标志位地址为 8EH 的 SFR 的第 0 位)的设置对微控制器处于外部执行模式下无效。
PSEN: 外部程序存储器选通信号PSEN是外部程序存储器选通信号。当 STC89C52 从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN 将不被激活。
XTAL1: 振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2: 振荡器反相放大器的输出端。
3.2系统模块
系统由单片机最小系统、显示电路、按键、18B20温度传感器、蜂鸣器报警电路组成。
系统硬件电路设计
4.1系统整体电路图
该系统电路主要包括:单片机最小系统、DS18B20温度传感器系统、报警系统、LED显示模块电路及电源接口和数据下载接口等电路,如图 4.1.1所示。
图中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。
图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。

图 : 系统整体电路图
单片机最小系统
最小系统包括晶振电路、复位电路、按键设置部分,AT89S52单片机最小系统的电路如图:4.2.1
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要[11],很适合便携手持式产品的设计使用系统可用二节电池供电。
3.2.1系统原理图

图3.2.1-1
3.2.2主控制器
晶振电路采用12MHZ,复位电路采用上电加按钮复位

图3.2.2-1 晶振电路

图3.2.2-2复位电路
3.2.3显示电路
显示电路采用4 位共阴极LED 数码管,P0 口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。P2 口的低四位作为数码管的位选端。采用动态扫描的方式显示。

图3.2.3-1显示电路
3.2.4报警温度调整按键电路

本系统设计三个按键,一个用于选择设定,另外两个分别用于设置报警温度的加和减。
图3.2.4-1按键电路
3.2.5温度传感电路

图3.2.5-1温度传感电路
3.2.6报警电路

图3.2.6-1报警电路
3.3 DS18B20数字温度传感器介绍
3.3.1特性介绍
• 独特的单线接口仅需一个端口引脚进行通讯
• 简单的多点分布应用
• 无需外部器件
• 可通过数据线供电
• 零待机功耗
• 测温范围-55℃~+125℃,以0.5℃递增。华氏器件-67~+2570F,以0.90F 递增
• 温度以9 或12位数字量读出
• 温度数字量转换时间200ms(典型值)
• 用户可定义的非易失性温度报警设置
• 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
• 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统
说明:
DS1820 数字温度计以9 位或12位数字量的形式反映器件的温度值。
DS1820 通过一个单线接口发送或接收信息,因此在中央微处理器和DS1820 之间仅需一条连
接线(加上地线)。用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。
因为每个 DS1820 都有一个独特的片序列号,所以多只DS1820 可以同时连在一根单线总线上,
这样就可以把温度传感器放在许多不同的地方。这一特性在HVAC 环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。
3.3.2引脚介绍


3.3.3访问18B20的协议
通过单线总线端口访问 DS1820 的协议如下:
• 初始化
• ROM 操作命令
• 存储器操作命令
• 执行/数据
1初始化
通过单线总线的所有执行(处理)都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和跟有其后由从机发出的存在脉冲。存在脉冲让总线控制器知道 DS1820 在总线上且已准备好操作。
2 ROM 操作命令
一旦总线控制器探测到一个存在脉冲,它就可以发出 5 个ROM 命令中的任一个。所有ROM 操作命令都8 位长度。下面是这些命令
Read ROM [33h]
这个命令允许总线控制器读到DS1820 的8 位系列编码、唯一的序列号和8 位CRC 码。只有在总线上存在单只DS1820 的时候才能使用这个命令。如果总上有不止一个从机,当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起开成相与的效果)。
Match ROM [55h]
匹配ROM 命令,后跟64 位ROM 序列,让总线控制器在多点总线上定位一只特定的DS1820。只有和64 位ROM 序列完全匹配的DS1820 才能响应随后的存储器操作命令。所有和64 位ROM序列不匹配的从机都将等待复位脉冲。这条命令在总线上有单个或多个器件时都可以使用。
Skip ROM [CCh]
这条命令允许总线控制器不用提供64 位ROM 编码就使用存储器操作命令,在单点总线情况下右以节省时间。如果总线上不止一个从机,在Skip ROM 命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突(漏极开路下拉效果相当于相与)。
Search ROM [F0h]
当一个系统初次启动时,总线控制器可能并不知道单线总线上有多少器件或它们的64 位ROM编码。搜索ROM 命令允许总线控制器用排除法识别总线上的所有从机的64 位编码。
Alarm Search [ECh]
这条命令的流程图和Search ROM 相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS1820 才会响应这条命令。报警条件定义为温度高于TH 或低于TL。只要DS1820 不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。
3.3.4 DS18B20命令设置

3.3.5 DS18B20内部温度表现形式
1 DS18B20用9位存贮温值度最高位为符号位,下图为18B20的温度存储方式。负温度S=1 正温度S=0 如:
00AAH 为+85 ℃,0032H 为25 FF92H 为55℃

2 DS18B20用12位存贮温值度最高位为符号位,下图为18B20的温度存储方式。负温度S=1 正温度S=0 如:
0550H 为+85℃ ,0191H 为25.0625℃ ,FC90H 为-55℃

3 DS18B20温度转换形式(12位存储形式)
|-----------|---------------------|------------|
| 实际温度值 | 数字输出(二进制) | 数字输出(十六进制) |
| +125℃ | 0000 0111 1101 0000 | 07D0H |
| +85℃ | 0000 0101 0101 0000 | 0550H |
| +25.0625℃ | 0000 0001 1001 0001 | 0191H |
| +10.125℃ | 0000 0000 1010 0010 | 00A2H |
| +0.5℃ | 0000 0000 0000 1000 | 0008H |
| 0℃ | 0000 0000 0000 0000 | 0000H |
| -0.5℃ | 1111 1111 1111 1000 | FFF8H |
| -10.125℃ | 1111 1111 0101 1110 | FF5EH |
| -25.0625℃ | 1111 1110 0110 1111 | FE6EH |
| -55℃ | 1111 1100 1001 0000 | FC90H |
3.4.1数码管的分类
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个"8"可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮[8]。如图3.5.1



图3.4.1 八段数码管事物图
3.4.2数码管驱动原理
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,在有些时候需要做一个简单的显示系统。那么在单片机I/O资源够用的情况下可以直接用单片机的I/O口驱动数码管,也可以根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
(1)静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性[8]。
(2)动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮[9]。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低[10]。
静态驱动方式简单不容易出错,如果电路设计合适,也能够用较少的线完成多个数码管的驱动。但是动态驱动方式省单片机的资源,如今已经有很多这样成熟的基于动态扫描的芯片。
所以能满足本文显示设计要求,采用LG3641BH LED数码管做为显示电路,数码管显示电路采用4位共阳LED数码管从P14,P15,P16,P17串口输出段码。

图 4.2.1 单片机最小系统电路
4 18B20时序图及相应的软件设计
4.1复位时序

void ds_reset()
{
uint i;
ds=0; // 数据时钟线拉低
i=103; // 延时480us~960us
while(i>0)i--;
ds=1; // 拉高数据时钟线
i=4; // 延时15us~60us
while(i>0)i--;
while(ds); // 检测18b20的存在
while(~ds);
i=30;
while(i>0)i--;}
4.2 读/写时序



//功能:单片机向18b20写一个字节//
void ds_write_byte(uchar date)
{
uint i,j;
bit a;
for(j=8;j>0;j--)
{
a=date&0x01; // 先写低位
date=date>>1;
if(a) // 要写的位为1
{
ds=0; // 数据时钟线拉低
i++;i++; //延时15us之内
ds=1; //ds拉低15us之内必须把要写的数据1放到数据时钟线上
i=8; // 延时大于1us
while(i>0)i--;
}
else //写0
{
ds=0; //数据时钟线拉低
i=8;
while(i>0)i--;//延时大于15us,15us之后18b20对数据采集
ds=1; //数据时钟线拉高释放数据线
i++;i++; //延时
}
}
}
//功能:单片机读一位
//========================//
bit ds_read_bit()
{
uint i;
bit dat;
ds=0; //数据时钟线拉低
i++; //延时大于1us
ds=1; //释放数据线
i++; // 延时小于15us
dat=ds; //读数据
i=8; //延时
while(i>0)i--;
return dat;
}
//功能:单片机读一个字节数据
uchar ds_read_byte()
{
uchar i,j,date;
date=0;
for(i=8;i>0;i--)
{
j=ds_read_bit();
date=(j<<7)|(date>>1);//先读低位数据
}
return date;
}
5 程序框图及C语言设计
5.1温度采集系统流程图
见图5-1

图 5-1温度采集系统
5.2读取温度流程图
见图5-2
5.3温度显示流程图
见图5-3

图5-2 读取温度图

图5-3 温度显示
5.4温度设置流程图
见图5-4

图5-4温度设置
5.5温度采集系统C语言设计
#include<reg52.h>
#include<intrins.h>
#include"18b20.h"
#define uint unsigned int
#define uchar unsigned char
uchar T_H=40,T_L=0;
uchar flag1,flag2,flag3;
uchar flag;
float tem; // 定义一个温度 变量存储温度
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//不带小数点0~9编码
uchar code tab1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点的0~9编码
sbit wei1=P2^0; //数码管位选定义
sbit wei2=P2^1; // 数码管位选定义
sbit wei3=P2^2; // 数码管位选定义
sbit wei4=P2^3; //数码管位选定义
sbit key1=P2^4;
sbit key2=P2^5;
sbit key3=P2^6;
sbit beep=P1^0;
sbit ds=P2^7; //18b20数据时钟线
//=======================//
//功能:18b20复位函数
//=======================//
void ds_reset()
{
uint i;
ds=0; // 数据时钟线拉低
i=103; // 延时480us~960us
while(i>0)i--;
ds=1; // 拉高数据时钟线
i=4; // 延时15us~60us
while(i>0)i--;
while(ds); // 检测18b20的存在
while(~ds);
i=30;
while(i>0)i--;
}
//=========================//
//功能:单片机向18b20写一个字节
//========================//
void ds_write_byte(uchar date)
{
uint i,j;
bit a;
for(j=8;j>0;j--)
{
a=date&0x01; // 先写低位
date=date>>1;
if(a) // 要写的位为1
{
ds=0; // 数据时钟线拉低
i++;i++; //延时15us之内
ds=1; //ds拉低15us之内必须把要写的数据1放到数据时钟线上
i=8; // 延时大于1us
while(i>0)i--;
}
else //写0
{
ds=0; //数据时钟线拉低
i=8;
while(i>0)i--;//延时大于15us,15us之后18b20对数据采集
ds=1; //数据时钟线拉高释放数据线
i++;i++; //延时
}
}
}
//========================//
//功能:单片机读一位
//========================//
bit ds_read_bit()
{
uint i;
bit dat;
ds=0; //数据时钟线拉低
i++; //延时大于1us
ds=1; //释放数据线
i++; // 延时小于15us
dat=ds; //读数据
i=8; //延时
while(i>0)i--;
return dat;
}
//====================//
//功能:单片机读一个字节数据
//====================//
uchar ds_read_byte()
{
uchar i,j,date;
date=0;
for(i=8;i>0;i--)
{
j=ds_read_bit();
date=(j<<7)|(date>>1);//先读低位数据
}
return date;
}
//====================//
//功能:启动18b20转换
//=====================//
void init_18b20()
{
ds_reset(); //18b20复位
ds_write_byte(0xcc); //跳过读ROM
ds_write_byte(0x44); //启动温度转换
}
//=======================//
//功能:读温度
//=======================//
float get_temp()
{
uchar n,m,m1;
uint temp;
float T;
ds_reset(); //18b20复位
ds_write_byte(0xcc); //跳过ROM
ds_write_byte(0xbe); //读温度暂存器
m=ds_read_byte(); // 读低字节
n=ds_read_byte(); //读高字节
m1=n&0xf8; //判断温度的符号位
if(m1==0x00) // 温度为正
{
temp=(n*256+m);
T=temp*0.0625;
flag=1; // 温度为正的标志位
}
else //温度为负
{
temp=(n*256+m);
temp=~temp+1; //取补码
T=temp*0.0625;
flag=2; // 温度为负的标志位
}
return T;
}
/*=====================================
功能:延时函数,变量Z为多少就延时多少毫秒
例如Z=10,就是延时10MS
=======================================*/
void delay(uint z) // 延时函数
{
uint x,y;
for(y=110;y>0;y--)
for(x=z;x>0;x--);
}
/*==================================
功能:温度显示函数
显示采用的是动态扫描的方式
===================================*/
void display(uint dat) //温度显示函数
{
wei1=0; // 显示温度整数的百位
wei2=1;
wei3=1;
wei4=1;
P0=tab[dat/1000];
delay(2);
wei1=1; // 显示温度整数 的十位
wei2=0;
wei3=1;
wei4=1;
P0=tab[dat%1000/100];
delay(2);
wei1=1; // 显示温度整数 的个位
wei2=1;
wei3=0;
wei4=1;
P0=tab1[dat%1000%100/10];
delay(2);
wei1=1; // 显示温度的小数位
wei2=1;
wei3=1;
wei4=0;
P0=tab[dat%10];
delay(2);
}
/*===================================
功能:温度范围设定函数
====================================*/
void key()
{
if(key1==0) // 温度范围设定选择键,按第一次设定上限,按第二次设定下限
{
delay(10);// 延时消抖动
if(key1==0)
{
flag1++;
}
while(!key1); // 按键松手检测
delay(5);
while(!key1);
}
if(key2==0) // 温度加按键
{
delay(10);
if(key2==0)
{
flag2=1;
}
while(!key2);
delay(5);
while(!key2);
}
if(key3==0) // 温度减键
{
delay(10);
if(key3==0)
{
flag3=1;
}
while(!key3);
delay(5);
while(!key3);
}
if(flag1==1) // 按第一次设定 温度上限
{
if(flag2==1) // 温度上限加
{
flag2=0;
T_H++;
}
if(flag3==1) // 温度上限减
{
flag3=0;
T_H--;
}
display(10*T_H);
}
if(flag1==2) // 按第二次设定温度下限
{
if(flag2==1) // 温度下限加
{
flag2=0;
T_L++;
}
if(flag3==1) // 温度下限减
{
flag3=0;
T_L--;
}
display(10*T_L);
}
if(flag1==3) //退出温度设定显示
{
flag1=0;
}
}
/*===================================
主函数
====================================*/
void main()
{
while(1)
{
if(flag1==0)
{
init_18b20(); // 温度传感器初始化
tem=get_temp();// 温度测试
display(10*tem); //温度显示
}
key();
if(tem>T_H||tem<T_L)
beep=0;
else
beep=1;
}
}
结论
随着现代信息技术的飞速发展,温度测量控制系统在工业、农业及人们的日常生活中扮演着一个越来越重要的角色,它对人们的生活具有很大的影响,所以温度采集控制系统的设计与研究有十分重要的意义。
由于单片机具有功能强、体积小、可靠性好、和价格低廉等独特优点,因此,在智能仪器仪表、工业自动控制、计算机智能终端、家用电器、儿童玩具等许多方面,都已得到了很好的应用,因而受到人们高度重视,取得了一系列科研成果,成为传统工业技术改造和新产品更新换代的理想机种,具有广阔的发展前景。
本次用单片机设计的温度采集系统终于完成了,在本次设计中,从采集元件,软件设计,硬件设计与焊接到论文的编写都是先查阅大量的资料后确定的,在经过老师指导,最后经过长时间的不断努力才完成的。在本次设计中,我切身感受到了动手实践以及团队合作的重要性,这对我以后的学习工作将产生深远的影响。
在本次设计研究和撰写论文的过程中,我查阅了许多文献资料,从中学到了很多关于系统开发和程序调试等发面的知识。在软件开发过程中掌握了一些技术难题的解决方法和技巧,巩固和加深了对所学知识的理解,能够把所学的知识和实践相结合,培养了认真谨慎的学习态度,为以后的学习与工作积累了大量的经验,提高了分析问题和解决问题的能力,但是由于认识上的片面与不足,本设计还有待经一部的完善与优化,这在以后的学习过程中要注重积累。
致谢
感谢老师对我的指导,他的严谨细致、一丝不苟的作风将一直是我学习与工作中的榜样。他循循善诱的教导和不拘一格的思路给与了我无尽的启迪。无论是在课题的开题还是研究的方法、技术路线以及本文的撰写都得到了郑老师的严格要求和精心指导,郑老师花费了大量的精力,在各个环节中给与了我许多宝贵的意见。在这次设计中郑老师严谨的学术作风、治学态度、求是的工作作风和孜孜不倦的探索精神,以及平易近人的师长风范给我创造了良好的学习设计环境。这些都是我不断前进的动力,必将对我以后的学习和工作产生深远的影响,我将终生学习和铭记。在此,谨向郑老师的培育之恩表示最深的谢意!
衷心感谢我的同学们,在我的学习和研究过程中,他们始终在鼓励和支持我,和他们探讨问题使我受益良多,通过我们之间的交流,使我增长了学识,拓宽了知识面,他们的一些建议给我很大的启示,使我在研究工作中受益匪浅。感谢我的室友,和他们相处这四年的时间,我感到非常愉快,谢谢他们对我生活和学习上的帮助。
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有许多可劲的老师、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!
再次向所有曾经给予我指导、支持、鼓励和帮助的各位老师、朋友、家人致谢!
参考文献
1\]孙涵芳,徐爱卿.MSC51/96单片机原理及应用(修订版),北京航空航天大学出版社 \[2\]郭天祥.新概念51单片机C语言教程,北京电子工业出版社,2009 \[3\]陈杰.黄鸿传感器监测与技术,北京,高等教育出版社,2002 \[4\]单片机原理及其接口技术\[M\].北京,清华大学出版社,1996,胡汉才 \[5\] 楼然苗,李光飞.51系列单片机设计实例\[M\].北京航空航天大学版社 \[6\] 李桂岩, 魏宾, 谷秀明. [基于DS18B20单线多点温度测量系统](http://219.231.8.23/kns50/detail.aspx?dbname=CJFD2011&filename=KBCK201102027&filetitle=%e5%9f%ba%e4%ba%8eDS18B20%e5%8d%95%e7%ba%bf%e5%a4%9a%e7%82%b9%e6%b8%a9%e5%ba%a6%e6%b5%8b%e9%87%8f%e7%b3%bb%e7%bb%9f "基于DS18B20单线多点温度测量系统")\[J\]. [可编程控制器与工厂自动化](http://219.231.8.23/kns50/Navi/Bridge.aspx?DBCode=cjfd&LinkType=BaseLink&Field=BaseID&TableName=CJFDBASEINFO&NaviLink=%e5%8f%af%e7%bc%96%e7%a8%8b%e6%8e%a7%e5%88%b6%e5%99%a8%e4%b8%8e%e5%b7%a5%e5%8e%82%e8%87%aa%e5%8a%a8%e5%8c%96&Value=KBCK "可编程控制器与工厂自动化"), [2011,(02)](http://219.231.8.23/kns50/Navi/Bridge.aspx?DBCode=cjfd&LinkType=IssueLink&Field=BaseID*year*issue&TableName=CJFDYEARINFO&Value=KBCK*2011*02&NaviLink=%e5%8f%af%e7%bc%96%e7%a8%8b%e6%8e%a7%e5%88%b6%e5%99%a8%e4%b8%8e%e5%b7%a5%e5%8e%82%e8%87%aa%e5%8a%a8%e5%8c%96 "2011,(02)") \[7\] 陈同果, 赵永杰. [基于DS18B20的单片机温度测量系统](http://219.231.8.23/kns50/detail.aspx?dbname=CJFD2007&filename=ZXLJ200717105&filetitle=%e5%9f%ba%e4%ba%8eDS18B20%e7%9a%84%e5%8d%95%e7%89%87%e6%9c%ba%e6%b8%a9%e5%ba%a6%e6%b5%8b%e9%87%8f%e7%b3%bb%e7%bb%9f "基于DS18B20的单片机温度测量系统")\[J\]. [科技资讯](http://219.231.8.23/kns50/Navi/Bridge.aspx?DBCode=cjfd&LinkType=BaseLink&Field=BaseID&TableName=CJFDBASEINFO&NaviLink=%e7%a7%91%e6%8a%80%e8%b5%84%e8%ae%af&Value=ZXLJ "科技资讯"), [2007,(17)](http://219.231.8.23/kns50/Navi/Bridge.aspx?DBCode=cjfd&LinkType=IssueLink&Field=BaseID*year*issue&TableName=CJFDYEARINFO&Value=ZXLJ*2007*17&NaviLink=%e7%a7%91%e6%8a%80%e8%b5%84%e8%ae%af "2007,(17)")