课程设计报告书
课题名称
基于数字温度传感器的数字温度计 姓 名 学 号 专 业 指导教师
机电与控制工程学院
年 月 日
2 填 写 说 明 1、正文部分
1 标题与正文格式定义标准如下
一级标题1.标题1
二级标题1.1标题2
三级标题1.1.1标题3
四级标题1.1.1.1标题4
2表格尽可能采用三线表。
3图形直接插入的插图应有图标、图号不能直接插入的图应留出插
图空位。图中文字、符号书写要清楚并与正文一致。
4文字表述要求层次清楚语言流畅语句通顺无语法和逻辑错误
无错字、别字、漏字。文字的表述应当以科学语言描述研究过程和研究结果不要
以口语化的方式表达报告中科技术语和名词应符合规定的通用词语并使用法定
计量单位和标准符号。
2、参考文献
1数量要求参考文献只选择最主要的列入应不低于5种。
2种类要求参考文献的引用可以是著作[M]、论文[J]、专利文献[P]、
会议论文等。
3文献著录格式及示例。参考文献用宋体五号字。
[1] 作者. 书名[M]. 版次. 出版地: 出版者, 出版年: 起止页
码 著作图书文献
[2] 作者. 文章名[J]. 学术刊物名称. 年. 卷(期): 起止页
码 学术刊物文献
示例 [1]王社国赵建光。基于ARM的嵌入式语音识别系统研究 [J]。微计
算机信息20072-2:149-150.
3、附录或附件可选项
重要的测试结果、图表、设计图纸、源程序代码、大量的公式、符号、照
片等不宜放入正文中的可以附录形式出现。
4、如果需要可另行附页粘贴。
3 任 务 书 1. 设计要求
利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度
传感器DS18B20测量温度信号计算后在LED数码管上显示相应的温度
值。其温度测量范围为?55℃125℃精确到0.5℃。数字温度计所测
量的温度采用数字显示控制器使用单片机AT89C51测温传感器使用
DS18B20用3位共阳极LED数码管以串口传送数据实现温度显示。
2. 原理
从温度传感器DS18B20可以很容易直接读取被测温度值进行转换即满
足设计要求。
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智
能温度传感器与传统的热敏电阻等测温元件相比它能直接读出被测
温度并且可根据实际要求通过简单的编程实现912位的数字读数方
式。
DS18B20的性能如下。
独特的单线接口仅需要一个端口引脚进行通信。
多
个DS18B20可以并联在串行传输的数据线上实现多点组网功
能。无须外部器件。
可通过数据线供电电压范围为3.05.5V。
零待机功耗。
温度以9或12位的数字读数方式。
用户可定义报警设置。
报警搜索命令识别并标志超过程序限定温度温度报警条件的
器件。
负电压特性电源极性接反时温度计不会因发热而烧毁但不
能正常工作。
4 目 录
1、绪论…………………………………………………………………… 5
2、方案论证规划、选定…………………………………………… 5
3、方案说明设计…………………………………………………… 7
4、硬件方案设计………………………………………………………… 10
5、软件方案设计………………………………………………………… 17
6、调试…………………………………………………………………… 20
7、技术小结结束语………………………………………………… 20
8、参考文献……………………………………………………………… 21
9、附录源程序代码、电路图等…………………………………………21
5 1、绪论 随着国民经济的发展人们需要对各中加热炉、热处理炉、反应炉和锅炉中温
度进行监测和控制。采用单片机来对他们控制不仅具有控制方便简单和灵活性大
等优点而且可以大幅度提高被控温度的技术指标从而能够大大的提高产品的质
量和数量。
在日常生活及工业生产过程中经常要用到温度的检测及控制温度是生产过
程和科学实验中普遍而且重要的物理参数之一。在生产过程中为了高效地进行生
产必须对它的主要参数如温度、压力、流量等进行有效的控制。温度控制在生
产过程中占有相当大的比例。温度测量是温度控制的基础技术已经比较成熟。传
统的测温元件有热电偶和二电阻。而热电偶和热电阻测出的一般都是电压再转换
成对应的温度这些方法相对比较复杂需要比较多的外部硬件支持。我们用一种
相对比较简单的方式来测量。
我们采用美国DALLAS半导体公司继DS18B20之后推出的一种改进型智能温度
传感器DS18B20作为检测元件温度范围为-55~125 oC,最高分辨率可达0.0625 oC。
DS18B20可以直接读出北侧温度值而且采用三线制与单片机相连减少了外部的
硬件电路具有低成本和易使用的特点。
本文介绍一种基于AT89C51单
片机的一种温度测量及报警电路,该电路采用
DS18B20作为温度监测元件测量范围0℃-+100℃使用LED模块显示能设置
温度报警上下限。正文着重给出了软硬件系统的各部分电路介绍了集成温度传感
器DS18B20的原理AT89C51单片机功能和应用。该电路设计新颖、功能强大、结
构简单。
2、方案论证 该系统主要由温度测量和数据采集两部分电路组成实现的方法有很多种下
面将列出两种在日常生活中和工农业生产中经常用到的实现方案。
2.1方案一 采用热电偶温差电路测温温度检测部分可以使用低温热偶热电偶由两个焊
接在一起的异金属导线所组成热电偶产生的热电势由两种金属的接触电势和单一
6 导体的温差电势组成。通过将参考结点保持在已知温度并测量该电压便可推断出
检测结点的温度。数据采集部分则使用带有A/D 通道的单片机在将随被测温度
变化的电压或电流采集过来进行A/D 转换后就可以用单片机进行数据的处理
在显示电路上就可以将被测温度显示出来。热电偶的优点是工作温度范围非常宽
且体积小但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及
漂移较高的缺点并且这种设计需要用到A/D 转换电路感温电路比较麻烦。 系统主要包括对A/D0809 的数据采集自动手动工作方式检测温度的显示
等这几项功能的信号通过输入输出电路经单片机处理。此外还有复位电路晶振
电路启动电路等。故现场输入硬件有手动复位键、A/D 转换芯片处理芯片为
51 芯片执行机构有4 位数码管、报警器等。【1】
系统框图如图 3-1所示。 单
片
机数码管
报警电路
测温电路
晶振电路
复位电路
ADC0809
按键防抖动
图 3-1 热电偶温差电路测温系统框图 2.2方案二 采用数字温度芯片DS18B20 测量温度输出信号全数字化。便于单片机处理
及控制省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定它
能用做工业测温元件此元件线形较好。在0—100 摄氏度时最大线形偏差小于1
摄氏度。DS18B20 的最大特点之一采用了单总线的数据传输由数字温度计
DS18B20和微控制器AT89S51构成的温度测量装置,它直接输出温度的数字信号,可
直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51 单片机
7 控制软件编程的自由度大可通过编程实现各种各样的算术算法和逻辑控制而
且体积小硬件实现简单安装方便。既可以单独对多DS18B20控制工作还可以
与PC 机通信上传数据另外AT89S51 在工业控制上也有
着广泛的应用编程技
术及外围功能电路的配合使用都很成熟。【1】
该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示
能够实现快速测量环境温度并可以根据需要设定上下限报警温度。该系统扩展性
非常强它可以在设计中加入时钟芯片DS1302以获取时间数据在数据处理同时
显示时间并可以利用AT24C16芯片作为存储器件以此来对某些时间点的温度数
据进行存储利用键盘来进行调时和温度查询获得的数据可以通过MAX232芯片
与计算机的RS232接口进行串口通信方便的采集和整理时间温度数据。
2.3方案选定 从以上两种方案容易看出方案一的测温装置可测温度范围宽、体积小但是
线性误差较大。方案二的测温装置电路简单、精确度较高、实现方便、软件设计也
比较简单故本次设计采用了方案二。
3、方案说明
3.1系统设计原理 利用温度传感器DS18B20可以直接读取被测温度值进行转换的特性模拟
温度值经过DS18B20处理后转换为数字值然后送到单片机中进行数据处理并
与设置的温度报警限比较超过限度后通过扬声器报警。同时处理后的数据送到
LED中显示。 3.2系统组成 本课题以是80C51单片机为核心设计的一种数字温度控制系统系统整体硬
件电路包括传感器数据采集电路温度显示电路上下限报警调整电路单片机
主板电路等组成。
系统框图主要由主控制器、单片机复位、报警按键设置、时钟振荡、LED显
示、温度传感器组成。
系统框图如图3-2所示。
8 主
控
制
器LED显
示
温
度
传
感
器单片机复位
报警按键设置
时钟振荡
图3-2 系统基本方框图
3.2.1主控制器 单片机AT89C51具有低电压供电和体积小等特点四个端口只需要两个口就
能满足电路系统的设计需要很适合便携手持式产品的设计使用系统可用二节电池
供电。
3.2.2显示电路 显示电路采用LED液晶显示数码管从P3口RXD,TXD串口输出段码。显示电
路是使用的串口显示这种显示最大的优点就是使用口资源比较少只用p3口的
RXD,和TXD,串口的发送和接收四只数码管采用74LS164右移寄存器驱动显示
比较清晰。
3.2.3温度传感器 温度传感器采用美国DALLAS半导体公司生产的DS18B20温度传感器。DS18B20
输出信号全数字化。便于单片机处理及控制在0—100 摄氏度时最大线形偏差
小于1 摄氏度采用单总线的数据传输可直接与计算机连接。
用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示能够实现
快速测量环境温度并可以根据需要设定上下限报警温
度。获得的数据可以通过
MAX232芯片与计算机的RS232接口进行串口通信方便的采集和整理时间温度数
据。
9 3.3 DS18B20温度传感器与单片机的接口电路 DS18B20可以采用两种方式供电一种是采用电源供电方式此时DS18B20的
1脚接地2脚作为信号线3脚接电源。另一种是寄生电源供电方式如图3-3 所
示单片机端口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流
可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时总线上必须有强的上拉
上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只
有一根线因此发送接口必须是三态的。
图3-1 DS18B20与单片机的接口电路
10 4、硬件方案设计
4.1 80C51单片机介绍 80C51有40个引脚4个8位并行I/O口1个全双工异步串行口同时内含
5个中断源2个优先级2个16位定时/计数器。80C51的存储器系统由4K的程
序存储器(掩膜ROM)和128B的数据存储器(RAM)组成。其基本组成框图见图4-1。 时钟电路
ROM/EPROM/Flash 4KB
RAM128B
SFR 21个
定时个/计数器2
CPU
总线控制
中断系统
5个中断源
2个优先级
串行口
全双工1个
4个并行口
XTAL2 XTAL1
RST
EA
ALE
PSEN
P0
P1
P2
P3
Vss
Vcc 图4-1 80C51单片机结构图
1. 一个8 位的微处理器(CPU)。
2. 片内数据存储器RAM(128B)用以存放可以读写的数据如运算的中间
结果、最终结果以及欲显示的数据等SST89 系列单片机最多提供1K 的RAM。
3. 片内程序存储器ROM(4KB)用以存放程序、一些原始数据和表格。但也有
一些单片机内部不带ROM/EPROM如8031803280C31 等。目前单片机的发展趋
势是将RAM 和ROM 都集成在单片机里面这样既方便了用户进行设计又提高了系
统的抗干扰性。SST 公司推出的89 系列单片机分别集成了16K、32K、64K Flash 存
储器可供用户根据需要选用。
4. 四个8 位并行IO 接口P0~P3每个口既可以用作输入也可以用作输
出。
5. 两个定时器计数器每个定时器计数器都可以设置成计数方式用以
对外部事件进行计数也可以设置成定时方式并可以根据计数或定时的结果实现
计算机控制。为方便设计串行通信目前的52 系列单片机都会提供3 个16 位定
11 时器/计数器。
6. 五个
中断源的中断控制系统。现在新推出的单片机都不只5 个中断源例
如SST89E58RD 就有9 个中断源。
7. 一个全双工UART(通用异步接收发送器)的串行IO 口用于实现单片机
之间或单机与微机之间的串行通信。 8. 片内振荡器和时钟产生电路但石英晶体和微调电容需要外接。
最高允许振荡频率为12MHz。SST89V58RD 最高允许振荡频率达
40MHz因而大大的提高了指令的执行速度。
4.1.2 80C51单片机管脚图
图4-2 80C51单片机管脚图
部分引脚说明
1. 电源类引脚
Vcc(40脚)芯片工作电源的输入端+5V。
Vss(20脚)电源的接地端。
2. 时钟电路引脚
XTAL1(19 脚)接外部晶体和微调电容的另一端在片内它是振荡
12 电路反相放大器的输入端。在采用外部时钟时该引脚必须接地。
XTAL2(18 脚)接外部晶体和微调电容的一端在8051 片内它是
振荡电路反相放大器的输出端。若需采用外部时钟电路时该引脚输入
外部时钟脉冲。
3. 控制信号引脚
RST/VPD(9 脚)RST 是复位信号输入端高电平有效。
RST 引脚的第二功能是VPD,即接入RST 端为RAM 提供备用电
源以保证存储在RAM 中的信息不丢失从而合复位后能继续正常运
行。
ALE/PROG(30 脚)地址锁存允许信号端。当8051 上电正常工作
后ALE 引脚不断向外输出正脉冲信号此频率为振荡器频率fOSC 的
1/6。CPU 访问片外存储器时ALE 输出信号作为锁存低8 位地址的控
制信号。平时不访问片外存储器时ALE 端也以振荡频率的1/6 固定输
出正脉冲因而ALE 信号可以用作对外输出时钟或定时信号。ALE 端
的负载驱动能力为8 个LS 型TTL(低功耗甚高速TTL)负载。
此引脚的第二功能PROG 在对片内带有4KB EPROM 的8751 编
程写入(固化程序)时作为编程脉冲输入端。
PSEN(29 脚)程序存储允许输出信号端。在访问片外程序存储器
时此端定时输出负脉冲作为读片外存储器的选通信号。PSEN 端有效
即允许读出EPROMROM 中的指令码。PSEN 端同样可驱动8 个LS
型TTL 负载。
EA/Vpp(31 脚)外部程序存储器地址允许输入端/固化编程电压输
入端。当EA 引脚接高电平时CPU只访问片内EPROM/ROM并执行
内部程序存储器中的指令但当PC(程序计数器)的值超过0FFFH(对
8751/8051 为4K)时将自动转去执行片外程序存储器内的程序。当输
入信号EA 引脚接低电平(接地)时CPU 只访问外部EPROM/ROM 并
执行外部程序存储器中的指令而不管是否有片内程序存储器。
此引脚的第二功能是Vpp 是对8751 片内EPROM固化编程时作
为施加较高编程电压(一般12V21V)的输入端。
4. 并行I/0口
P0口(P0.0P0.7
39~32 脚)P0口是一个漏极开路的8 位准双向
I/O口。作为漏极开路的输出端口每位能驱动8 个LS 型TTL 负载。
当P0 口作为输入口使用时应先向口锁存器(地址80H)写入全1,此时
P0 口的全部引脚浮空可作为高阻抗输入。在CPU 访问片外存储器时
P0口分时提供低8 位地址和8 位数据的复用总线。在此期间P0口内
部上拉电阻有效。
P1口(P1.0P1.71~8 脚)P1口是一个带内部上拉电阻的8 位准
双向I/O口。P1口每位能驱动4 个LS 型TTL 负载。在P1口作为输入
口使用时应先向P1口锁存地址(90H)写入全1,此时P1口引脚由内部上
拉电阻拉成高电平。
P2口(P2.0P2.721~28 脚)P2口是一个带内部上拉电阻的8 位
13 准双向I/O口。P口每位能驱动4个LS 型TTL 负载。在访问片外
EPROM/RAM 时它输出高8 位地址。
P3口(P3.0P3.710~17 脚)P3口是一个带内部上拉电阻的8 位
准双向I/O口。P3口每位能驱动4个LS型TTL负载。P3口与其它I/O 端
口有很大的区别它的每个引脚都有第二功能如下
P3.0(RXD)串行数据接收。
P3.1(RXD)串行数据发送。
P3.2(INT0#)外部中断0输入。
P3.3(INT1#)外部中断1输入。
P3.4(T0)定时/计数器0的外部计数输入。
P3.5(T1)定时/计数器1的外部计数输入。
P3.6(WR#)外部数据存储器写选通。
P3.7(RD#)外部数据存储器读选通。
4.1.3 80C51单片机的中断系统
80C51系列单片机的中断系统有5个中断源2个优先级可以实
现二级中断服务嵌套。由片内特殊功能寄存器中的中断允许寄存器IE控
制CPU是否响应中断请求由中断优先级寄存器IP安排各中断源的优
先级同一优先级内各中断同时提出中断请求时由内部的查询逻辑确
定其响应次序。
4.1.4 80C51单片机的定时/计数器
在单片机应用系统中常常会有定时控制需求如定时输出、定时
检测、定时扫描等也经常要对外部事件进行计数。80C51单片机内集
成有两个可编程的定时/计数器T0和T1它们既可以工作于定时模式
也可以工作于外部事件计数模式此外T1还可以作为串行口的波特率
发生器。
4.2 芯片DS18B20的说明
4.2.1 DS18B20 的主要特性 1适应电压范围更宽电压范围3.05.5V在寄生电源方式下可由数据
线供电
2独特的单线接口方式DS18B20 在与微处理器连接时仅需要一条口线即
可实现微处理与DS18B20 的双向通讯
3DS18B20 支持多点组网功能多个DS18B20 可以并联在唯一的三线上
实现组网多点测温
4DS18B20 在使用中不需要任何外围元件全部传感元件及转换电路集成
14 在形如一只三极管的集成电路
内
5温范围55℃125℃在-10+85℃时精度为±0.5℃
6可编程的分辨率为912 位对应的可分辨温度分别为0.5℃、0.25℃、
0.125℃和0.0625℃可以实现高精度测温。
7在9位分辨率最多在93.75ms把温度转换成数字12 位分辨率是最多可
在750ms内将温度转换成数字速度更快。
8温度测试结果直接转换成数字温度信号以“一线总线”串行传输给CPU
同事科传送SRC检验码菊友极强的抗干扰校正能力。
9负压特性电源极性接反时芯片不会因发热而烧毁但不会正常工作。
4.3 液晶显示器1602LCD的说明
4.3.1接口信号说明
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 Data I/0
2 VDD 电源正极 10 D3 Data I/0
3 VL 液晶显示偏压信号 11 D4 Data I/0
4 RS 数据/命令选择端 12 D5 Data I/0
5 R/W 读/写选择端 13 D6 Data I/0
6 E 使能信号 14 D7 Data I/0
7 D0 Data I/0 15 BLA 背光级正极
8 D1 Data I/0 16 BLK 背光级负极 4.3.2控制命令表 序号
指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 清显示 0 0 0 0 0 0 0 0 0 1
2 光标返回 0 0 0 0 0 0 0 0 1 *
3 置输入模式 0 0 0 0 0 0 0 1 I/D S
4 显示开/关控制 0 0 0 0 0 0 1 D C B
5 光标或字符移位 0 0 0 0 0 1 S/C R/L * *
15 6
置功能 0 0 0 0 1 DL N F * *
7
置字符发生存贮器
地址
0 0 0 1
字符发生存贮器地址
8 置数据存贮器地址 0 0 1 显示数据存贮器地址
9 读忙标志或地址 0 1 BF 计数器地址
10
写数到CGRAM或
DDRAM
1 0
要写的数据内容
11
从CGRAM或DDRAM
读数
1 1
读出的数据内容
4.3.3液晶显示简介 液晶显示模块是一个慢显示器件所以在执行每条指令之前一定要确认模块的忙标
志为低电平表示不忙否则此指令失效。要显示字符时要先输入显示字符地址
也就是告诉模块在哪里显示字符下图是1602的内部显址。 图4—1
① 液晶显示原理
16 液晶显示的原理是利用液晶的物理特性通过电压对其显示区域进行控制有电
就有显示这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电
路直接驱动、易于实现全彩色显示的特点目前已经被广泛应用在便携式电脑、数
字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类
液晶显示的分类方法有很多种通常可按其显示方式分为段式、字符式、点阵式
等。除了黑白显示外液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来
分可以分为静态驱动Static、单纯矩阵驱动Simple Matrix和主动矩阵
驱动Active Matrix三种。
③字符的显示
用LCD显示一个字符时比较复杂
因为一个字符由6×8或8×8点阵组成既要
找到和显示屏幕上某几个位置对应的显示RAM区的8字节还要使每字节的不同位
为“1”其它的为“0”为“1”的点亮为“0”的不亮。这样一来就组成某个
字符。但由于内带字符发生器的控制器来说显示字符就比较简单了可以让控制
器工作在文本方式根据在LCD上开始显示的行列号及每行的列数找出显示RAM
对应的地址设立光标在此送上该字符对应的代码即可。
17 5、软件方案设计
5.1 程序流程图
图5-1 总流程图
开始
DS18B20
初始化
跳过读
ROM
温度转换
跳过读
ROM
读取寄存器
中RAM数
据
将测得值乘
以0.0625
将温度值送
数码管显示
结束
18
发DS18B20复位命令 发跳过
ROM命令 发温度转换开始命令 结束 5.2 读出温度子程序 读出温度子程序的主要功能是读出RAM中的9字节在读出时需进行CRC校
验校验有错时不进行温度数据的改写。如图5-2示
5-2读出温度子程序流程图 5.3温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令当采用12位分辨率时转换时
间约为750ms在本程序设计中采用1s显示程序延时法等待转换的完成。如图5-3
所示
Y
发DS18B20复位命令
发跳过ROM命令
发读取温度命令
读取操作CRC校验
9字节完
CRC校 验
正确
移入温度暂存器
结束 N
N
Y
19 5.4 计算温度子程序 计算温度子程序将RAM中读取值进行BCD码的转换运算并进行温度值正负
的判定如图5-4所示。
图5-4计算温度子程序流程图
5.5 显示数据刷新子程序 显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作当最高显示位为0时将符号显示位移入下一位。
图5—5
开始
温度零下?
温度值取补码置“—”标
志 计算小数位温度
BCD值
计算整数位温度BCD值 结束
置“+”标志 N
Y 温度数据移入显示寄存器
十位数0
百位数0
十位数显示符号百
位数不显示
百位数显示数据
不显示符号
结束 N
N
Y
Y
20 6、调试
6.1、软件仿真 通过查找众多资料终于确定了整个设计方案即使用80c51单片机和DS18B20
作为本设计的核心芯片。有了以上资料和基本电路图经过一段时间的看图分析
终于弄明白了大概的数字温度计原理这才开始软件仿真。 6.2.硬件调试 买回所需元器件后我便开始了焊接。因为有了以前多个课程设计的基础我
的焊接技术还算不错经过差不多整整一天时间的焊接实物的雏形基本形成。接
下来是程序的烧写通过Keil C51编程软件将程序烧写进单片机但结果不如人
意没有显示灯能亮更无法实现充电功能。我对其进行硬件方面的检查如焊点
的漏焊虚焊又对程序进行了分析但最终没能解决问题本次课程设计基本以失
败告终。相信给我更多的时间和精力我能把它做好。
7、技术小结 本次课设的任务是采用AT89C51单片机作控制器温度传感器选用DS18B20来设
计数字温度计系统由3个模块组成主控制器、测温电路及显示电路。主控制器
由单片AT89C2051实现测温电路由温度传感器DS18B20实现显示电路由4位LED
数码管直读显示。
通过本次课设使我学会了很多东西通过自己找材料向老师答疑与同学讨
论自己修改研究最终完成本次课设。在这个过程中不但使我对单片机课程
所学的知识有了更深入的了解而且还培养了我的自学能力。有些不懂的问题通过
向老师请教得到解决使我受益匪浅。课设的过程是艰辛的但是收获是巨大的。
首先我再一次的加深巩固了对已有的知识的理解及认识其次我第一次将课本
知识运用到了实际设计使得所学知识在更深的层次上得到了加深。再次因为这
次课程设计的确在某些方面存有一定难度这对我来讲都是一种锻炼培养了我自
学、查阅搜集资料的能力再有计算操作工程中我们曾经面临过失败、品味过
茫然但是最终我还是坚持下来了这就是我意志、耐力和新年上的胜利在今后
的日子里它必将成为我的宝贵财富。
21 8、参考文献 1、 杨素行著.模拟电子技术基础(第二版) .北京:高等教育出版社,2006.
2、 阎石著.数字电子技术基础(第五版) .北京:高等教育出版社,2006.
3 、李全利仲伟峰徐军著.单片机原理及应用.北京:清华大学社,2006.
4 、何立民著单片机高级教程北京北京航空航天大学出版社2000.
5、 杨路明著C语言程序设计教程(第2版) 北京北京邮电大学出版社2005.
6、 马忠梅籍顺心张凯等著.单片机的C语言应用程序设计(第4版) .北京:北京
航天航空大学出版社,
2007.
7、白驹珩雷晓平著单片计算机及其应用成都电子科技大学出版社1997.
8、谭浩强著程序设计与开发技术北京清华大学出版社1991.
9、 钟富昭著.8051单片机典型模块设计与应用.北京人民邮电出版2007.
10、 于永戴佳常江著.51单片机C语言常用模块与综合系统设计实例精讲.北京
电子工业出版社2007.
11、 梁翎著C语言程序设计实用技巧与程序实例.上海上海科普出版社1998. 9.附录
9.1附录一程序清单 #include
#include
#include
#define uint unsigned int
#define unchar unsigned char
unchar templ,temph,i,y,z,n;
unchar a,b;//LCD的变量
unchar sign=0;//标志变量
bit k; //判断正负变量
sbit dq=P3^5;
sbit rs=P2^0;//LCD显示的定义取值
sbit rw=P2^1;
sbit e=P2^2;
sbit bf=P0^7;
sbit DQ=P2^5;
//键盘定义
sbit read=P3^0;
sbit incH=P3^2;
22 sbit desH=P3^3;
sbit reset=P3^4;
//蜂鸣器
sbit BUZZER=P2^6;
float t4,t5,t6,t7,tt;//温度转换的变量
uint tp;
unchar temperature,Htemp,Ltemp;
unchar D1,D2,D3;
uint D4,D5,D6,D9,D7,D8;
unchar code dis1[]={"0123456789"};
unchar code dis2[]={"temp:"};
unchar code dis3[]={"WARN"};
unchar code dis4[]={"Htemp:"};
unchar code dis5[]={"working"};
unchar code dis6[]={"Ltemp:"};
bit flag_1820_1;
bit flag_1820_2;
void delay_ms(unsigned char time);
void ledshow(void);
void keypress(void);
void init(void);
void gettemp();
void init1820(void);
void write1820(unchar);
unsigned char read1820(void);
void delay_us(unchar);
void delay3(unchar);
/* 延时*/
void delay(uint t)
{ uint i;
while(t--)
{ for(i=0;i<125;i++)
{}
}
}
//LCD显示函数
23 void delay1(unchar time)
{ unchar n;
n=0;
while(n
f(sign==0)
{EA=1;TR0=1;ET0=1;
EX0=0; //关闭外部中断0
EX1=0; //关闭外部中断1
while(1)
{
if(read==0)
{
delay3(2000);
if(read==0)
{sign++;}
}
}
}
if(sign==1)
{
BUZZER=1; //关闭蜂鸣器
EX0=1; //开启外部中断0
EX1=1; //开启外部中断1
25 init();
pos(0);
for(i=0;i<6;)
{ writedate(dis4[i]);i++;
}
D6=Htemp%10;
D7=Htemp%100/10;
D8=Htemp/100;
pos(0x6);
writedate(dis1[D8]);
writedate(dis1[D7]); }
if(sign==2)
{BUZZER=1; //关闭蜂鸣器
EX0=1; //开启外部中断0
EX1=1; //开启外部中断1
init();
pos(0);
for(i=0;i<6;)
{ writedate(dis6[i]);i++;}
D6=Htemp%10;
D7=Htemp%100/10;
D8=Htemp/100;
pos(0x6);
writedate(dis1[D8]);
writedate(dis1[D7]);
writedate(dis1[D6]);
}
if(sign>2)
{ sign=0;}
}
//中断程序
void int0(void) interrupt 0
{
EX0=0; //关外部中断0
if(desH==0&&sign==1)
{
Htemp--;
if(Htemp
}
26 else if(desH==0&&sign==2)
{
Ltemp--;
}
}
/*****外部中断1服务程序*****/
void int1(void) interrupt 2
{
EX1=0; //关外部中断1
if(incH==0&&sign==1)
{
Htemp++;
}
else if(incH==0&&sign==2)
{
Ltemp++;
if(Ltemp>Htemp)
Ltemp=Htemp;
}
}
//定时器T0服务程序
void isr_t0(void) interrupt 1
{ TH0=50000/256;
TL0=50000%256;
TMOD=0x10;
TH1=50000/256;
TL1=50000%256;
gettemp();
delay(50);
if (tp
pos(0x04);
for(i=0;i<7;)
{
writedate(dis5[i]);
i++;
}
pos(0x40);
27 for(i=0;i<5;)
{writedate(dis2[i]);
i++;}
D1=(unchar)(tp%10);
D2=(unchar)(tp%100/10);
D3=(unchar)(tp/100);
D4=(uint)(tt*10);
D5=((uint)(tt*100))%10;
if(k==1)
{pos(0x46);
writedate('-');}
else
{pos(0x46);
writedate();}
pos(0x47);
writedate(dis1[D3]);
writedate(dis1[D2]);
writedate(dis1[D1]);
writedate('.');
writedate(dis1[D4]);
writedate(dis1[D5]);
writedate(0xdf);
writedate('C');
}
else
{ init();
pos(0x04);
for(i=0;i<4;)
{
writedate(dis3[i]);
i++;}
BUZZER=0;
}
}
//DS18B20读取温度
void gettemp()
{
init1820();
28 write1820(0xcc);
write1820(0x44);
init1820();
write1820(0xcc);
write1820(0xbe);
templ=read1820();//低8位其中的第四位是小数点后的
temph=read1820();//高8位其中前五位是符号值)
z=temph;//把符号位留下判断正负
k=(bit)(z>>7);
if(k==1)
//负数就取反加一
{ templ=~templ;
templ=templ+1;
temph=~temph;
}
else
{templ=templ;
temph=temph;}
n=templ;
y=n&0x01;
t7=y*0.0625;
n>>=1;
y=n&0x01;//小数点最后的数
t4=y* 0.125;
n>>=1;
y=n&0x01;
t5=y* 0.25;
n>>=1;
y=n&0x01;
t6=y*0.5;
tt=t4+t5+t6+t7;
init1820();
tp=temph*256+templ;
temperature=tp;
tp=tp>>4;
}
//1820初始化
void init1820()
{
29 DQ = 1; _nop_();
DQ = 0;
delay_us(125); //延时510us
delay_us(125);
DQ = 1;
delay_us(15);
while(DQ)
{ _nop_(); }
delay_us(60);
DQ = 1;
}
//******write********
void write1820(unchar a)
{
unchar i;
for(i=0;i<8;i++)
{if(a & 0x01) //低位在前
{DQ = 0;
_nop_();_nop_();_nop_();
DQ = 1; }
else
DQ = 0;
_nop_();_nop_();_nop_();
delay_us(30);
DQ = 1;
_nop_();
a >>= 1;
}
}
//*******read************
unsigned char read1820(void)
{
unsigned char i;
unsigned char tmp=0;
DQ = 1; _nop_();
for(i=0;i<8;i++)
{
30 tmp >>= 1;
DQ = 0;
_nop_();
DQ = 1;
delay_us(2);
_nop_();
if(DQ)
tmp |= 0x80;
delay_us(30);
DQ = 1; _nop_();
}
return tmp; }
void delay_us(unchar a)
{
while(--a);
}
void delay_ms(unchar a)
{
unchar i,j;
for(i=0;ifor(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
31 9.2 附录二电路图
32
指导教师
评 语
课程设计
成 绩
指导教师
签 字
年 月 日