您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页多点温度检测系统

多点温度检测系统

来源:叨叨游戏网


辽 宁 工 业 大 学

电子综合设计与制作(论文)

题目: 多点温度检测系统

院(系): 电子与信息工程学院 专业班级: 电子092班 学 号: 090404051 学生姓名: 胡贺强 指导教师: 教师职称: 起止时间:2012.12.29—2013.1.11

电 子 综 合 设 计 与 制 作 (论 文)

课程设计(论文)任务及评语

院(系):电子与信息工程学院 教研室:电子信息教研室 学 号 题 目 090404051 学生姓名 胡贺强 专业班级 电子092班 多点温度检测系统 任务和要求: 设计一个多点温度检测系统。 主控器能对各温度检测器(简称:检测器)通过串行传输线实现温度数据传输以及显示。 具体设计制作任务: 1 设计制作各温度检测器(至少有2台温度检测器) (1)温度测量精度:0.5℃; (2)温度测量范围:-20℃~+125℃。 2设计制作主控器 (1)具有串行通信功能; (2)具有温度显示功能。 平时: 论文质量: 答辩: 总成绩: 学生签字:___________ 指导教师签字: 年 月 日 任务和要求 指导教师评语及成绩 注:成绩:平时20% 论文质量60% 答辩20% 以百分制计算

I

电 子 综 合 设 计 与 制 作 (论 文)

摘 要

随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。本课题以ATC51单片机系统为核心,能对多点的温度进行实时巡检。DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图。

关键词:温度测量;单总线;数字温度传感器;单片机

II

电 子 综 合 设 计 与 制 作 (论 文)

目 录

第1章 方案论证比较与选择 ............................................ 1

1.1 引言 ......................................................... 1 1.2 方案论证 ..................................................... 1 1.3 方案的比较与选择 ............................................. 2 1.4 方案的阐述与论证 ............................................. 2 第2章 硬件电路设计 .................................................. 4

2.1 温度传感器 .................................................... 4 2.2 单片机系统设计 ............................................... 8 2.3 显示电路设计 ................................................ 10 2.4 键盘电路设计 ................................................ 11 2.5 报警电路设计 ................................................ 13 2.6 通信模块设计 ................................................ 13 第3章 软件设计 ..................................................... 14

3.1 系统主程序流程图 ............................................ 14 3.2 传感器程序设计 .............................................. 15 3.3 显示程序设计 ................................................ 17 3.4 键盘程序设计 ................................................ 18 3.5 报警程序设计 ................................................ 20 3.6 通信模块程序设计 ............................................ 20 第4章 设计总结 ..................................................... 21 参考文献 ............................................................ 22 附录Ⅰ:元器件清单 .................................................. 23 附录Ⅱ:主电路图 .................................................... 24 附录Ⅲ:程序清单 .................................................... 25

III

电 子 综 合 设 计 与 制 作 (论 文)

第1章 方案论证比较与选择

1.1 引言

温度测量的方案有很多种,可以采用传统的分立式传感器、模拟集成传感器以及新兴的智能型传感器。对于控制系统可以采用计算机、单片机等。

1.2 方案论证

设计方案一

采用模拟分立元件,如电容、电感或晶体管等非线形元件,实现多点温度的测量及显示,该方案设计电路简单易懂,操作简单,且价格便宜,但采用分立元件分散性大,不便于集成数字化,而且测量误差大。

设计方案二

本方案采用ATC51单片机为核心,通过温度传感器AD590采集温度信号,经信号放大器放大后,送到A/D转换芯片,最终经单片机检测处理温度信号。

采用该方案技术已经成熟,AD转换电路设计较烦琐,而且使用AD590进行温度检测必须对冷端进行补偿,以减小误差。

设计方案三

本设计运用主从分布式思想,由一台上位机(PC微型计算机),下位机(单片机)多点温度数据采集,组成两级分布式多点温度测量的巡回检测系统。该系统采用 RS-232串行通讯标准,通过上位机(PC)控制下位机(单片机)进行现场温度采集。温度值既可以送回主控PC进行数据处理,由显示器显示。也可以由下位机单独工作,实时显示当前各点的温度值,对各点进行控制。

下位机采用的是单片机基于数字温度传感器DS18B20的系统。DS18B20利用单总线的特点可以方便的实现多点温度的测量,轻松的组建传感器网络,系统的抗干扰性好、设计灵活、方便,而且适合于在恶劣的环境下进行现场温度测量。本系统可以应用在大型工业及民用常温多点监测场合。如粮食仓储系统、楼宇自动化系统、温控制程生产线之温度影像检测、医疗与健诊的温度测试、空调系统的温度检测、石化、机械等。系统框图如下

1

电 子 综 合 设 计 与 制 作 (论 文)

图1.1 系统框图

下位机(ATC51) 传感器模块 显示模块 控制模块 传感器模块 显示模块 控制模块

上位机(PC) 下位机ATC51 1.3 方案的比较与选择

基于数字式温度计DS18B20的温度测量仪的硬软件开发过程,DS18B20将温度信号直接转换为数字信号,实现了与单片机的直接接口,从而省去了信号调理电路。该仪器电路简单、功能可靠、测量效率高,很好地弥补了传统温度测量方法的不足。相对与方案1,在功能、性能、可操作性等方面都有较大的提升。相对与方案2,硬件电路简单,易于操作,具有更高的性价比,更大的市场。所以我采用方案3完成本设计。

1.4 方案的阐述与论证

方案三以DS18B20为传感器、ATC51单片机为控制核心组成多点温度测试系统,该系统包括传感器电路、键盘与显示电路、串口通信电路等组成部。采用美国Dallas半导体公司推出的数字温度传感器DS18B20,属于新一代适配微处理器的智能温度传感器。它具有独特的单总线接口,仅需要占用一个通用I/0端口即可完成与微处理器的通信。全部传感元件及转换电路集成在形如一只三极管的集要求通过简单的编程实现9~12位的数字值读数方式。其可以分别93.75ms和750ms内完成9位和12位的数字量,最大分辨率为0.0625℃ , 而且从DS18B20读出或写入DS18B20的信息仅需要一根口线(单线接口)读写。

它有如下的性能特点:

1)独特的单线接口,既可通过串行口线,也可通过其它I/O口线与微机接口,无需变换其它电路,直接输出被测温度值;

2

电 子 综 合 设 计 与 制 作 (论 文)

2)多点能力使分布式温度检测应用得以简化; 3)不需要外部元件;

4) 既可用数据线供电,也可采用外部电源供电; 5)不需备份电源;

6) 测量范围为-55~+125℃ , 固有测温分辨率为0.5℃ ; 7)通过编程可实现9~12位的数字读数方式; 8)用户可定义非易失性的温度告警设置;

9)警告搜索命令能识别和寻址温度在编定的极限之外的器件(温度警告情况); 10)应用范围包括恒温控制、工业系统、消费类产品、温度计或任何热敏系统。 以上特性使得DS18B20非常适用于构建高精度、多点温度测量系统。 根据DS18B20以上的特点我选用方案三来实现本课题。

3

电 子 综 合 设 计 与 制 作 (论 文)

第2章 硬件电路设计 2.1 温度传感器

1.温度传感器选用细则

现代传感器在原理与结构上千差万别,如何根据具体的测量目的、测量对象以及测量环境合理地选用传感器,是在进行某个量的测量时首先要解决的题。当传感器确定之后,与之相配套的测量方法和测量设备也就可以确定了。测量结果的成败,在很大程度上取决于传感器的选用是否合理。

2.温度传感器DS18B20

DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器。全部传感元件及转换电路集成在形如一只三极管的集成电路内。与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。其可以分别93.75ms和750ms内完成9位和12位的数字量,最大分辨率为0.0625℃ , 而且从DS18B20读出或写入DS18B20的信息仅需要一根口线(单线接口)读写。

DS18B20的性能特点

单线数字化智能集成温度的传感器,其特点是:

DSI8B20可将被测温度直接转换成计算机能识别的数字信号输出,温度值不需要经电桥电路先获取电压模拟量,再经信号放大和A/D转换成数字信号,解决了传统温度传感器存在的因参数不一致性,在更换传感器时会因放大器零漂而必须对电路进行重新调试的问题,使用方便.

DS18B20能提供9到12位温度读数,精度高,且其信息传输只需1根信号线,与计算机接口十分简便,读写及温度变换的功率来自于数据线而不需额外的电源.

每一个DS18B20都有一个惟一的序列号,这就允许多个DS18B20连接到同一总线上.尤其适合于多点温度检测系统.

负压特性:当电源极性接反时,DS18B20虽然不能正常工作,但不会因发热而烧毁 正是由于具有以上特点,DS18B20在解决各种误差、可靠性和实现系统优化等方面与传统各种温度传感器相比,有无可比拟的优越性,因而广泛应用于过程控制、环境控制、建筑物、机器设备中的温度检测。

DS18B20与单片机的典型接口设计

DS18B20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等优

4

电 子 综 合 设 计 与 制 作 (论 文)

点。Dsl8B20与单片机的硬件连接有两种方法:一是Vcc接外部电源,GND接地,I/0与单片机的I/0线相连;二是用寄生电源供电,此时,~UDD和GND接地,I/0接单片机I/0。无论是哪种供电方式,I/0口线都要接4.7k Q左右的上拉电阻。图4给出了DSl8B20与微处理器的典型连接。

DS18B20寄生电源供电方式:

在寄生电源供电方式下,DS18B20从单线信号线上汲取能量:在信号线DQ处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。

独特的寄生电源方式有三个好处:进行远距离测温时,无需本地电源;可以在没有常规电源的条件下读取ROM;电路更加简洁,仅用一根I/O口实现测温。

要想使DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7K上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。

因此,该电路只适应于单一温度传感器测温情况下使用,不适宜采用电池供电系统中。并且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。

(1)DS18B20寄生电源强上拉供电方式:

为了使DS18B20在动态转换周期中获得足够的电流供应,当进行温度转换或拷贝到E2存储器操作时,用MOSFET把I/O线直接拉到VCC就可提供足够的电流,在发出任何涉及到拷贝到E2存储器或启动温度转换的指令后,必须在最多10μS内把I/O线转换到强上拉状态。在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺点就是要多占用一根I/O口线进行强上拉切换。

(2)DS18B20的外部电源供电方式:

在外部电源供电方式下,DS18B20工作电源由VDD引脚接入,其VDD端用3~5.5V电源供电,此时I/O线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个DS18B20传感器,组成多点测温系统。注意:在外部供电的方式下,DS18B20的GND引脚不能悬空,否则不能转换温度,读取的温度总是85℃。

(3)DS18B20 的内部结构:

它主要包括寄生电源、温度传感器、 位激光ROM 单线接口、存放中间数据的高速暂存器(内含便笺式RAM),用于存储用户设定的温度上下限值的TH 和TL 触发器

5

电 子 综 合 设 计 与 制 作 (论 文)

存储与控制逻辑、8 位循环冗余校验码(CRC)发生器等七部分。位光刻ROM 的排列是:开始8位是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。光刻R0M 的作用是使每一个DS18B20都各不相同,这可实现一根总线上挂接多个DS18B20的目的。暂存存储器包含了8个连续字节,前2个字节是测得的温度信息,第1个字节的内容是温度的低8位,第2个字节是温度的高8位。第3个和第4个字节是TH、TL的易失性拷贝,第5个字节是结构寄存器的易失性拷贝,这3个字节的内容在每一次上电复位时被刷新。第6、7、8个字节用于内部计算。第9个字节是冗余检验字节

(4)DS18B20 的测温原理:

DS1820测温原理如下图所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。

高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,DS1 8B20测量温度原理停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

在正常测温情况下,DS18B20 的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS18B20 提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分TZ,然后再用BEH 指令取计数器1 的计数剩余值CS 和每度计数值CD。考虑到DS18B20测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度TS 可用下式计算:TS=(TZ-0.25℃) +(CD-CS)/CD

(5)警告信号:

DS18B20 完成温度转换后,就把测得的温度值与TH、TL 作比较。若T>TH 或T(6)CRC 的产生:

在 位ROM 的最高有效字节中存有循环冗余校验码(CRC)。主机根据ROM 的前56 位来计算CRC 值,并和存入DS18B20 中的CRC 值作比较,以判断主机收到的ROM 数据是否正确。CRC 的函数表达式为:CRC=X8+X5+X4+1。此外,DS18B20 尚需依上式为暂存器中的数据来产生一个8位CRC 送给主机,以确保暂存器数据传送无误。在本

6

电 子 综 合 设 计 与 制 作 (论 文)

课题中采用四个数字式温度传感器DS18B20与单片机C51连接如下图

图2.1 温度传感器的连接 (7) DS1820使用中注意事项

DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

①较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。

②在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此。当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。

③连接DS18B20的总线电缆是有长度的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS18B20进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。

④在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环。这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。

7

电 子 综 合 设 计 与 制 作 (论 文)

2.2 单片机系统设计

复位电路:无论哪种单片机,都会涉及到复位电路。如果复位电路不可靠,在工作中就有可能出现“死机”,“程序走飞”等现象。所以,一个单片机复位电路的好坏,直接影响到整个系统工作的可靠性。复位操作完成单片机片内电路的初始化,使单片机从一种确定的状态开始运行。当c51单片机的复位引脚RST出现5ms以上的高电平时,单片机就完成了复位操作,如果RST持续为高电平,单片机就处于循环复位状态,而无法执行程序,因此要求单片机复位后能脱离复位状态。复位操作通常有上电和开关复位。上电复位要求接通电源后,自动实现复位操作。开关复位要求在电源接通的条件下,在单片机运行期间,如果发生死机,用按钮开关操作使单片机复位。常用的上电复位且开关复位电路如图3.6所示,上电后,由于电容充电,使RST持续一段高电平时间。当单片机已在运行之中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电且开关复位的操作。单片机的复位操作使单片机进入初始化过程,其中包括是程序计数器PC=0000H,P0-P3=FFH,SP=07H,其他寄存器处于零,程序从0000H地址单元开始执行,单片机复位后不改变片内RAM区中的内容。

图2.2 复位电路 时钟电路:c51单片机的时钟信号通常用内部振荡和外部振荡方式。在引脚XTAL1和XTAX2外接晶体振荡器,就够成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。晶振通常选用6MHZ、12MHZ或24MHZ。内部振荡器方式如下。如图3.7,电容器C1、C2起稳定振荡频率、快速起振的作用,电容值一般为5-30PF。内部振荡方式所得的时钟信号比较稳定。外部振荡方式是把已有的时钟信号引入单片机

8

电 子 综 合 设 计 与 制 作 (论 文)

内,这种方式适于用于用来使单片机的时钟与外部信号保持一致。

串口:串行通信是CPU与外界交换的一种基本方式。单片机运用于数据采集或工业控制时,往往作为前端机安装在工作现场,远离主机,现场数据采用串行通信方式主机并进行处理,以降低通信成本,提高通信可靠性。51系列单片机自身有全双工的异步通信接口,通过软件编程,它可以作为通用异步接受和发送器使用,也可作为同步移位寄存器。

c51单片机串口主要由两个数据缓冲寄存器SBUF和一个输入移位寄存器组成,其内部还有一个串行控制寄存器SCON和一个波特率发生器。接受缓冲器与发送缓冲器占用同一个地址99H,其名称亦同样为SBUF。CPU写SBUF,一方面修改发送寄存器,同时启动数据串行发送;读SBUF,就是读接受寄存器,完成数据的接受。特殊功能寄存器SCON用以存放串行口的控制和状态信息。根据对其写的控制字决定工作方式,从而决定波特率发生器的时钟是来自系统时钟还是来自定时器T1。特殊功能寄存器PCON的最高位SMOD为串行口波特率的倍增控制位。

c51单片机的串行口正是通过对上述专用寄存器的设置,检测与读取来管理串行通信。在进行通信时,外界的串行数据是通过引脚RXD输入的。输入数据先逐位进入输入移位寄存器,在送入接受SBUF。在此采用了双缓冲结构,为了避免在接受到第二帧数据之前,CPU未及时响应接受器的前一帧的中断请求而把前一帧数据读走,造成两帧数据重叠的错误。对于发送器,因为发送时CPU是主动的,不会产生写重叠问题,不需要双缓冲器结构,为了保持最大传送速率,仅用了SBUF一个缓冲器。

I/O口:计算机对外设进行数据操作时,外设的数据是不能直接连到CPU的数据线上的,必须经过接口。这是由于CPU的数据线是外设或存储器和CPU进行数据传输的唯一公共通道,为了使数据线的使用对象不产生使用总线的冲突,以及协调快速的CPU和慢速的外设,CPU和外设之间必须有接口电路,接口起着缓冲、锁存数据、地址译

图2.3 时钟电路 9

电 子 综 合 设 计 与 制 作 (论 文)

码、信息格式转换、传递状态、发布命令等功能,I/O接口有并行接口、串行接口、定时/计数器、A/D、D/A等,根据外设的不同情况的应用要求,选择不同的接口。单片机的I/0 口一般是双向的. 既可以做输入. 也可以做输出。以5 1系列为例,其P0、P 1、P2、P3均为双向口,且可位操作。

c51单片机内部有P0、P1、P2、P3四个8位双向I/O口,外设可直接连接于这几个接口上,而无须另加接口芯片。P0-P3的每个端口可以按字节输入或输出,也可以按位进行输入或输出,共32根口线,用作控制十分方便。P0口为三态双向口,能带8个TTL电路。P1、P2、P3口为准双向口,负载能力为4个TTL电路,如果外设需要的驱动电流大,可加接驱动器。

图2.4 单片机电路 2.3 显示电路设计

本课题要将传感器的温度信号和键盘输入的控制信号都显示出来,利用单片机c51传输控制信号。本课题要用到MAXIM 公司生产的MAX7219串行LED驱动显示器,

10

电 子 综 合 设 计 与 制 作 (论 文)

此显示器具有接口简单.占用资源少、控制灵活方便、LED级联扩展便利的优点。MAX7219是串行输出共阴极显示驱动芯片,每片可驱动8个LED,具有级联功能可控制更多的LED 。MAX7219为24引脚芯片,除与LED显示相连的线外,与微控制器只需3根连线相接:芯片端管脚分别为CLK.DIN.LOAD,其中CLK为时钟输入端,DIN为数据输入端,LOAD为锁存信号。MAX7219的工作时序为:时钟的上升沿MAX7219把DIN引脚数据移入内部移位寄存器, 在时钟下降沿MAX7219把数据移向DOUT端, 而LOAD的上升沿则锁存最后移入的16位串行数据。对MAX7219的控制操作很方便,其片内具有8个位寄存器和6个控制寄存器.位寄存器对应LED的具体内容,控制寄存器决定LED的工作方式。控制寄存器分别为:不工作方式寄存器、译码方式寄存器、亮度控制寄存器。

MAX7219是在脉冲控制下工作的,因此其抗干扰就更为重要。一般在其电源和地之间接一十几pf的电容。另外,当MAX72l9和其他串行芯片共用I/O引脚时,最好在其外边加一上拉电阻。P1口内部有上拉电阻,如不在其外部接上拉电阻,有时出现驱动能力不足的现象。

要用MAX7219控制多于8个的LED时,可以将多个MAX7219级联使用。各芯片的CLK和LOAD端并接在一起。上一级MAX7219的DOUT端接下一级的D 端。级联显示时,如欲控制次级的MAX7219,只需向前几级的MAX7219的不工作方式寄存器送空操作数:本级则送欲显示的数据。另外,需注意,LOAD信号只需执行一次清O和置位,分别在整个过程的始末。即:级联调用WrTwoByte()程序时,应将程序里的LOAD清O和置位语句屏蔽掉。只在级联显示的开始和最后分别将LOAD置O和1。具体连接如下图:

图2.5 显示电路 2.4 键盘电路设计

键盘一般采用行列扫描方式来设计。行列扫描是指:把键盘按键排列成n行×m

11

电 子 综 合 设 计 与 制 作 (论 文)

列的n×m行列点阵,使用软件或硬件的方法对其行、列分别进行扫描,从而判断是否有键按下,并获得扫描码。当无键按下时,行线与列线断开,所有列线均为高电平。当有一个键按下时,则与此键对应的行线与列线接通。如此行线为低电平,则此列线也为低电平。为确定是否有键按下,CPU先通过并行输出口使所有的行线为低电平,然后通过并行输入口读入列信号,若为全“1”,则没有键按下,若有一个为“0”,则表示有一个键已按下。若有一个为“0”,则表示有一个键已按下。为消去按下时的抖动现象,程序延迟20ms后再判断具体是哪一个键按下先将第一行置为低电平,然后读入列信号,若有一个为“0”,则按下的键在此行;若为全“1”,则按下的键不在此行,再将下一行置为低电平,并测试列信号。

如果在最后一行也为低电平时仍未找到按下的键,则认为刚才有键按下的情况为误动作。对找到的键,进行分析并处理。当按键时间较为短促时,系统判断不到有键按下。经测试,按键在按下或释放时,通常伴随着几ms到十几ms的触点抖动,然后才能稳定下来。在触点抖动期间检测按键的通断状态,会导致一次按键或释放被错误地认为是多次操作。所以,当检测到有键按下或释放时,应通过软件延时20 ms左右,避开触点抖动的影响。去抖时间既不能太短也不能太长:如果时间太短,无法起到去抖作用;如果时间太长,超过了键按下的持续时间,则会判不到按键。软件去抖时间不宜太短也不宜太长,定为20ms 。本设计使用行列扫描方式,其电路原理图如下图所示。

图2.6 键盘电路 本课题使用行列扫描方式,在单片机的P1口上连接上4*4的键盘,单片机扫描键盘,如果有键按下,单片机会根据键码执行相应的程序,使整个系统的功能更加完善。

12

电 子 综 合 设 计 与 制 作 (论 文)

2.5 报警电路设计

为了实现多点温度检测报警系统,本课题采用ATC51单片机作为主控制器,采用扫描的方式对多点DS18B20温度传感器获取对应该位置的温度值,经处理后通过串口可以立即发送到上位机,如温度不在设定的范围内,给出报警信号。系统总体硬件电路如图所示

2.6 通信模块设计

如前所述,本文采用MAX232作为PC机与单片机的串行通信接口芯片。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图所示

图2.7 报警电路

图2.8 通信模块电路

13

电 子 综 合 设 计 与 制 作 (论 文)

第3章 软件设计 3.1 系统主程序流程图

测温子程序 系统初始化 开始

测温键是否按下 是 显示温度

图4.1 系统主程序流程图 清除键是否按下 清除显示是 子程序 14

电 子 综 合 设 计 与 制 作 (论 文)

系统软件设计主要包括系统程序和流程图,根据整个系统的要求,完成温度的测量与控制必须经过以下几个步骤:单片机接受传感器的温度信号,并通过MAX7219驱动显示出来,单片机扫描键盘,接受控制信号,并将温度显示出来,若温度不在范围内则发出报警。

3.2 传感器程序设计

DS18B20在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求,只有严格遵守通讯协议才能保证数据传输的正确性和完整性。所有时序均以主机为Master,单总线器件为Slave,每次数据的传输均从主机启动写时序开始,如果要求单总线器件回送数据,则在写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

(1)DS18B20的复位时序

unsigned char ow_reset(void) { unsigned char presence; }

(2)DS18B20的读时序

DS18B20的读时序分读0时序和读1时序两个过程。读时序是主机先把单总线拉低,在之后的l5s内必须释放单总线,以便将数据传输到单总线上。DS18B20完成一个读时序至少需要60s。

unsigned char read_bit(void) { unsigned char i;

DQ = 0; delay(36); DQ = 1; delay(5); delay(30);

// 将 DQ 线拉低

// 保持 // DQ返回高电平 // 等待存在脉冲

// 获得存在信号 // 等待时间隙结束

// 返回存在信号,0 = 器件存在, 1 = 无器件

presence = DQ; return(presence);

DQ = 0; _nop_(); _nop_(); DQ = 1;

//将DQ 拉低开始读时间隙

// then return high

// 延时15μs

15

for (i=0; i<3; i++);

电 子 综 合 设 计 与 制 作 (论 文)

}

return(DQ); // 返回 DQ 线上的电平值

unsigned char read_byte(void) { }

(3)DS18B20的写时序

DS18B20的写时序也分为写0时序和写1时序两个过程。写0时序和写1时序的要求不同,写0时,单总线要被拉低至少60s,保证DS18B20能够在15-45s之间正确采样I/O总线上的“0”电平。写1时,单总线被拉低,在之后的15s内必须释放单总线。

void write_bit(char bitval) {

DQ = 0; _nop_(); _nop_();

if(bitval==1) DQ =1; delay(8);

// 如果写1,DQ 返回高电平 // 在时间隙内保持电平值,

// 将DQ 拉低开始写时间隙

unsigned char i;

unsigned char value = 0; for (i=0;i<8;i++) { }

return(value);

{

value |= 0x01<delay(8);

// 然后将其左移

// 读取字节,每次读取一个字节

if(read_bit())

DQ = 1; // Delay函数每次循环延时13μs,因此delay(8) = 105μs

}

void write_byte(char val) {

unsigned char i; unsigned char temp;

16

电 子 综 合 设 计 与 制 作 (论 文)

}

for (i=0; i<8; i++)

{ // 写入字节, 每次写入一位 }

delay(5);

temp = val>>i; temp &= 0x01;

write_bit(temp);

DS18B20复位后,就可以编程控制读到其内部RAM所采集到的温度值(通过P0.7),并且读取数据时低位在前,高位在后。读出数据后,需判断对应的温度是正值还是负值,当温度值为正值时,直接将二进制数转换为十进制温度值;当温度值为负值时先将二进制补码变为原码,再转换为十进制温度值。

3.3 显示程序设计

根据系统的要求,单片机不仅要能接收到温度信号,还要将温度信号显示出来,使系统一目了然。对于输入的温度信号的显示是利用MAX7219驱动进行显示的,MAX7219是串行输出共阴极显示驱动芯片,每片可驱动8个LED,此显示器具有接口简单.占用资源少、控制灵活方便等,因此利用MAX7219驱动显示方便,快捷。

首先初始化5个控制寄存器,然后送1~8个显示数据 一旦送完控制字后,下一步按实际需要可以改变1~8个数据显示寄存器的内容,MX7219则按显示亮度等初始化规定与待显示的数据自动扫描显示。

(1)译码寄存器 译码寄存器(D7~D0)中数据可初始化为00H、01H、0FH 以及FFH共四种情况,分别表示:对数据显示寄存器中的内容不译码{只对 DIG0译码而对DIG7~DIG1不译码;对DIG3~DIG0译码而对DIG7~DIG4不译码;对DIG7~在译码方式时,只对数据显示寄存器中的D3~D0位译码,D6 ~D4位DIG0均译码。

为任意值,D7位控制小数点。当D7 =l时,小数点亮;D7=O时,小数点熄灭。

(2)显示亮度寄存器 其中,DIG7~DIG4位可任意,DIG3~DIG0可选择的范围是0000~l111。DIG3~DIG0的值越大,LED显示器越亮。

(3)扫描范围寄存器 其中,DIG7~DIG3位可任意,而D2D1D0这三位二进制数排列从000到I11,其中000表示只接有DIG0控制的一个LED 显示器,001表示接有由DIG0和DIG1控制的两个LED显示器,由此类推;111则表示DIG0~DIG7均接有一个LED显示器。

(4)关闭寄存器 其中, D7~D1位可以任意; D0=0,关闭所有显示器,

17

电 子 综 合 设 计 与 制 作 (论 文)

D0=0,允许显示。

(5)显示测试寄存器 其中D7~D1位可以任意;LED处于正常工作状态,D0=0,

D0=1,LED处于显示测试状态,即LED所有的段全亮。

初始化MAX7219的程序流程如图4.6。按照图4送完所有控制寄存器的地址和相应的控制命令之后,再按同样的方法送待显示的数据,每次先送某个LED的地址字节,后送待显示的数据字节。由于控制寄存器和数据显示寄存器全部单独编址,所以在送控制字或送显示数据时,均没有规定其先后顺序。

初始化程序主要部分如下: void InitialMax7219(void) {

unsigned char i; CS0=1; CLK0=0;

WriteToMax7219(0x0F,0x00);

WriteToMax7219(0x0C,0x01);

WriteToMax7219(0x0A ,0x06);

WriteToMax7219(0x09,0xFF) ;

WriteToMax7219(0x0B,0x07) ;

for(i=2;i<9;i++) {

WriteToMax7219(i,ascii[8]); }

WriteToMax7219(0x01,0x0E); }

3.4 键盘程序设计

根据本课题的系统要求,采用4*4的键盘电路结构,P1.0-P1.3接四条行线,P1.4-P1.7接四条列线,整个系统的功能可以利用16个按键将系统完善化、系统化,

18

电 子 综 合 设 计 与 制 作 (论 文)

对于键盘各键的功能如下图所示:

1 5 9 13 14 2 6 10 3 7 11 循环 4 8 12 查询

图4.2 键盘按键功能图 如果按下数字0-数字14,表示输入控制温度的信号;本课题设计时只用了四个温度传感器,所以数字键用1~4即可。按下“查询”键开始输入数据按键是告诉单片机系统要开始输入该传感器的温度信号,接着按下显示传感器输入的序号按键,单片机会将保存的传感器序号数据和对应的传感器温度值通过数码管显示出来;按下“循环显示”键盘输入的数据按键,单片机也会将保存的键盘控制循环信号显示出来,即各个传感器的温度值循环显示; 根据键盘电路连接情况,P1.0-P1.3接四条行线,P1.4-P1.7接四条列线,确定按键的键码值。 按键的主要程序段如下:

while(1)

temp_key = FindKey(); if (temp_key != 0) {

key = temp_key;

if (key==15) show = 1; if (key==16) show = 0;

{

}

19

电 子 综 合 设 计 与 制 作 (论 文)

再定义一个键盘扫描的函数,接受键盘的键码值,根据扫描的键码值单片机转入执行相应的按键功能,显示温度数值

3.5 报警程序设计

本课题采用高温和低温报警,当按下“循环”键后,如果某个传感器的温度超过或者低于了设定温度,数码管将停止循环,将只显示发出报警的传感器的温度值和该传感器的序列号;当按下“查询”时,在数码管上显示同样的信息。

warning() {int i,j;

for(j=0;j<400;j++) {

{sound=1;

for(i=0;i<100;i++) sound=0; } } }

3.6 通信模块程序设计

系统通过串口与上位及通信,可以实时向上位机传送温度值.实物中通过RS232总线与计算机连接。当运行PROTEUS软件时,可以从虚拟终端看到上位机接收到的4个通道的温度值循环。

void SendStr(char *str) { TI = 0; }

20

while(*str != 0x00) { SBUF = *str++; }

while(TI == 0); TI = 0;

电 子 综 合 设 计 与 制 作 (论 文)

第4章 设计总结 随着科学技术的不断进步与发展,温度控制在工业控制、电子测温计、医疗仪器、家用电器等各种温度控制系统中广泛应用,且由过去的单点测量向多测量发展。目前温度传感器有模拟和数字两类传感器,为了克服模拟传感器与微处理器接口时需要信号调理电路和A/D转换器的弊端,大多数多点测温控制系统采用数字传感器,并大大方便了系统的设计。比较有代表性的数字温度传感器有DS18B20、MAX6575、DS1722、MAX6635、SMT160-30等。

本课题以ATC51单片机系统为核心,能对多点的温度进行实时巡检。DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图。

21

电 子 综 合 设 计 与 制 作 (论 文)

参考文献 [1]赵广林.Protel99SE电路设计与制版.北京:电子工业出版社,2005 [2]万文略. 单片机原理及应用.重庆: 重庆大学出版社, 2004

[3]郁有文、常健、程继红.传感器原理及工程应用.第二版.西安:西安电子科技大学出版

社,2003

[4]余成波,胡新宇,赵勇主编.传感器与自动检测技术.北京:高等教育出版社,2004.2 [5]付家才.单片机测控工程实践技术.北京: 化学工业出版社, 2001 [6]李广弟.单片机基础(修订本).北京:北京航空航天大学出版社, 2001

[7]诸昌铃.LED显示屏系统原理及工程技术.西安:西安电子科技大学出版社,2000.9 [8]沈红卫.单片机应用系统设计实例与分析.北京:北京航空航天大学出版社,2003 [9]楼然苗,李光飞.51系列单片机设计实例.北京:北京航空航天大学出版社,2003 [10] 李庆祥.现代精密仪器设计.北京:清华大学出版社,2004

[11] 陈小忠 等 单片机接口技术实用子程序.北京:人民邮电出版社 2005.9

[12] 徐爱钧,彭秀华编著 Keil Cx51 V7.0单片机高级语言编程与μ Vision2应用实践 北

京: 电子工业出版设 2006.5

[13] 张齐 杜群贵编著 单片机应用系统设计技术—基于C语言编程.北京: 电子工业出版 2004.8

[14] 李群芳 肖看 编著 单片机原理、接口及应用—嵌入式系统计数基础.北京:清华大学出版社 2005.3

22

电 子 综 合 设 计 与 制 作 (论 文)

附录Ⅰ:元器件清单 器件名称 ATC51 MAX232 MAX7219 电容 电解电容 按键开关 电阻 DS18B20 COMPIM 报警器sounder 晶体振荡器

器件数量 1个 1个 1个 3个 4个 17个 7个 4个 1个 1个 1个 23

电 子 综 合 设 计 与 制 作 (论 文)

附录Ⅱ:主电路图

24

电 子 综 合 设 计 与 制 作 (论 文)

附录Ⅲ:程序清单

#include #include #include #include #include #include #include #define P_KEY P1

sbit DQ = P0^7; // 定义DQ引脚为P0.7 #include sbit P20 = P2^0; sbit sound=P3^7; unsigned char code

ascii[15]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0F};

float t;

/******************************* 延时函数*************************

* 功能:在11.059MHz的晶振条件下调用本函数需要14μs 然后每次计数需13μs

********************************************************************/

void delay(int useconds) {

for (; useconds>0;useconds--) }

/******************************* 复位函数

25

{ }

;

电 子 综 合 设 计 与 制 作 (论 文)

***************************

* 功能:完成单总线的复位操作。

* 复位时间为480μs,因此延时时间为(480-14)/13 = 36, * 经过70μs之后检测存在脉冲,因此延时时间为(70-14)/13 = 5 ********************************************************************/

unsigned char ow_reset(void) { unsigned char presence; }

void write_bit(char bitval) { DQ = 0; 105μs

}

void write_byte(char val) { unsigned char i;

unsigned char temp; for (i=0; i<8; i++) {

// 写入字节, 每次写入一位

temp &= 0x01; write_bit(temp);

26

DQ = 0; delay(36); DQ = 1;

delay(5); delay(30);

// 将 DQ 线拉低 // 保持 480μs // DQ返回高电平 // 等待存在脉冲 // 获得存在信号 // 等待时间隙结束

// 返回存在信号,0 = 器件存在, 1 = 无器件

presence = DQ; return(presence);

// 将DQ 拉低开始写时间隙

_nop_(); _nop_();

// 如果写1,DQ 返回高电平

// 在时间隙内保持电平值,

delay(8); DQ = 1;

if(bitval==1) DQ =1;

// Delay函数每次循环延时13μs,因此delay(7) =

temp = val>>i;

电 子 综 合 设 计 与 制 作 (论 文)

}

} delay(5);

/**************************** 位读取函数 ***************************

* 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义 的delay()函数,而采用一个for()循环来实现延时。

********************************************************************/

unsigned char read_bit(void) { unsigned char i; }

unsigned char read_byte(void) { unsigned char i; }

int temp_data[2] = {0}; void read_temp() { ow_reset();

27

DQ = 0; _nop_(); _nop_(); DQ = 1;

//将DQ 拉低开始读时间隙

// then return high

// 返回 DQ 线上的电平值

for (i=0; i<3; i++); // 延时15μs return(DQ);

unsigned char value = 0; for (i=0;i<8;i++) { }

return(value);

{

value |= 0x01<delay(8);

// 120

// 然后将其左移

// 读取字节,每次读取一个字节

if(read_bit())

电 子 综 合 设 计 与 制 作 (论 文)

}

write_byte(0xcc); write_byte(0xbe); temp_data[1]=read_byte(); ow_reset(); write_byte(0xcc); write_byte(0x44);

temp_data[0]=read_byte();

char buf[20];

unsigned char RomCode[8];

unsigned char code Code1[8] = {0x28, 0x30, 0xC5, 0xB8,0x00, 0x00, 0x00, 0x8E};

unsigned char code Code2[8] = {0x28, 0x31, 0xC5, 0xB8,0x00, 0x00, 0x00, 0xB9};

unsigned char code Code3[8] = {0x28, 0x32, 0xC5, 0xB8,0x00, 0x00, 0x00, 0xE0};

unsigned char code Code4[8] = {0x28, 0x33, 0xC5, 0xB8,0x00, 0x00, 0x00, 0xD7};

void ReadCode(void) { char i; }

unsigned char FindKey() { unsigned char key, temp;

28

ow_reset(); write_byte(0x33); for(i=0; i<8; i++) { }

for(i=0; i<8; i++)

{ sprintf(buf, \" %x \ }

SendStr(buf);

RomCode[i] = read_byte();

P_KEY = 0x0f; key = P_KEY; if (key == 0x0f) { return 0;

}

delay(5000); key = P_KEY; if (key == 0x0f) { return 0;

}

temp = (key >> 4); if (temp >= 4)

{ if (temp == 4) { temp = 3;

} else { temp = 4; }

}

P_KEY = 0xf0; key = P_KEY; key = key & 0x0f; if (key >= 4)

{ if (key == 4) { key = 3;

}

电 子 综 合 设 计 与 制 作 (论 文)

29

电 子 综 合 设 计 与 制 作 (论 文)

else { key = 4;

}

}

key = (key - 1) * 4 + temp; P_KEY = 0x0f; while( P_KEY != 0x0f); return key;

}

/**************报警输出******************/

warning() //{int i,j;

for(j=0;j<400;j++) {

{sound=1; for(i=0;i<100;i++) sound=0; } } } main() { int key;

unsigned char temp = 1, i; int iTemp,cTemp,bTemp,dTemp; float ftTemp;

unsigned char temp_key; unsigned char show = 1;

long int k;

unsigned char n1=0,n2=0,n3=0,n4=0; DQ = 1;

uart_init(); InitialMax7219();

30

报警输出;

电 子 综 合 设 计 与 制 作 (论 文)

temp = ow_reset(); write_byte(0xcc);

write_byte(0x44); for (i=0; i<8; i++) { WriteToMax7219(i + 1, ascii[0]);

} while(1)

{ temp_key = FindKey(); if (temp_key != 0) {

key = temp_key; if (key==15) show = 1; if (key==16)

show = 0;

}

ow_reset(); ////////////////////////// write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code1[i]); }

write_byte(0x44); temp_data[0] = temp_data[1] = 0; ow_reset(); write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code1[i]);

}

31

电 子 综 合 设 计 与 制 作 (论 文)

码;

write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); delay(50000);

if(temp_data[1]>127) //如果最高位为1则将补码变为原

{temp_data[1]=(~temp_data[1]); temp_data[0]=(~temp_data[0]+1);

n1=1; }

k=((temp_data[1]&0x0f)*16+(temp_data[0]&0xf0)/16); ftTemp = k + (temp_data[0] & 0x0f) * 0.0625; if (n1 == 1)

{ if (ftTemp > 5.0)

{ show = 0; }

key = 1; warning();

} else {

if (ftTemp > 10.0) { show = 0;

key = 1; warning();

}

}

if(key==1 || show)

{sprintf(buf, \"one = %f \ SendStr(buf); bTemp = k/100; cTemp=k%100/10; iTemp = k%10;

32

电 子 综 合 设 计 与 制 作 (论 文)

dTemp=((temp_data[0]&0x0f)*0.0625*10); WriteToMax7219(1, ascii[1] & 0x7f); WriteToMax7219(2, ascii[11] & 0x7f); 码;

{temp_data[1]=(~temp_data[1]);

33

if(n1==1) n1=0; }

WriteToMax7219(3, ascii[bTemp] & 0x7f); WriteToMax7219(4, ascii[cTemp] & 0x7f); WriteToMax7219(5, ascii[iTemp]+0x80 ); }

//////////////////////////////

write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code2[i]); write_byte(0x44); }

temp_data[0] = temp_data[1] = 0; ow_reset(); write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code2[i]); }

write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); delay(50000);

if(temp_data[1]>127) //如果最高位为1则将补码变为原

{WriteToMax7219(2, ascii[10] & 0x7f);

WriteToMax7219(6, ascii[dTemp]& 0x7f); ow_reset();

电 子 综 合 设 计 与 制 作 (论 文)

temp_data[0]=(~temp_data[0]+1); n2=1; }

k=((temp_data[1]&0x0f)*16+(temp_data[0]&0xf0)/16); ftTemp = k + (temp_data[0] & 0x0f) * 0.0625; if (n2 == 1)

{

if (ftTemp > 5.0)

{ show = 0; }

key = 2; warning();

} else {

if (ftTemp > 10.0) { show = 0;

key = 2; warning();

}

if(key==2 || show)

}

{sprintf(buf, \"two = %f \ SendStr(buf); bTemp = k/100; cTemp=k%100/10; iTemp = k%10;

dTemp=((temp_data[0]&0x0f)*0.0625*10); WriteToMax7219(1, ascii[2] & 0x7f); WriteToMax7219(2, ascii[11] & 0x7f);

if(n2==1) n2=0;

34

{WriteToMax7219(2, ascii[10] & 0x7f);

电 子 综 合 设 计 与 制 作 (论 文)

}

WriteToMax7219(3, ascii[bTemp] & 0x7f); WriteToMax7219(4, ascii[cTemp] & 0x7f) WriteToMax7219(5, ascii[iTemp]+0x80 );

WriteToMax7219(6, ascii[dTemp]& 0x7f);

}

/////////////////////////

write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code3[i]); write_byte(0x44); }

temp_data[0] = temp_data[1] = 0; ow_reset(); write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code3[i]); }

write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); delay(50000);

if(temp_data[1]>127) //如果最高位为1则将补码变为原码; ow_reset();

{temp_data[1]=(~temp_data[1]); temp_data[0]=(~temp_data[0]+1); n3=1; }

k=((temp_data[1]&0x0f)*16+(temp_data[0]&0xf0)/16); ftTemp = k + (temp_data[0] & 0x0f) * 0.0625; if (n3 == 1) {

35

电 子 综 合 设 计 与 制 作 (论 文)

if (ftTemp > 5.0)

{ show = 0; }

key = 3; warning();

} else {

if (ftTemp > 10.0) { show = 0;

key = 3; warning();

}

}

if(key==3 || show)

{sprintf(buf, \"three = %f \ SendStr(buf); bTemp = k/100; cTemp=k%100/10; iTemp = k%10;

dTemp=((temp_data[0]&0x0f)*0.0625*10); WriteToMax7219(1, ascii[3] & 0x7f); WriteToMax7219(2, ascii[11] & 0x7f);

if(n3==1) n3=0; }

WriteToMax7219(3, ascii[bTemp] & 0x7f); WriteToMax7219(4, ascii[cTemp] & 0x7f); {WriteToMax7219(2, ascii[10] & 0x7f);

WriteToMax7219(5, ascii[iTemp]+0x80);

WriteToMax7219(6, ascii[dTemp]& 0x7f);

}

ow_reset();

///////////////////

36

电 子 综 合 设 计 与 制 作 (论 文)

write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code4[i]); write_byte(0x44); }

temp_data[0] = temp_data[1] = 0; ow_reset(); write_byte(0x55); for (i=0; i<8; i++) {

write_byte(Code4[i]); }

write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); delay(50000);

if(temp_data[1]>127) //如果最高位为1则将补码变为原码;

{temp_data[1]=(~temp_data[1]); temp_data[0]=(~temp_data[0]+1); n4=1; }

k=((temp_data[1]&0x0f)*16+(temp_data[0]&0xf0)/16); ftTemp = k + (temp_data[0] & 0x0f) * 0.0625; if (n4 == 1) {

if (ftTemp > 5.0)

{ show = 0; }

key = 4; warning();

}

37

电 子 综 合 设 计 与 制 作 (论 文)

else {

if (ftTemp > 10.0) { show = 0;

key = 4; warning();

}

}

if(key==4 || show)

{sprintf(buf, \"four = %f \ SendStr(buf); bTemp = k/100; cTemp=k%100/10; iTemp = k%10;

dTemp=((temp_data[0]&0x0f)*0.0625*10); WriteToMax7219(1, ascii[4] & 0x7f); WriteToMax7219(2, ascii[11] & 0x7f);

38

if(n4==1) n4=0; }

WriteToMax7219(3, ascii[bTemp] & 0x7f); WriteToMax7219(4, ascii[cTemp] & 0x7f); WriteToMax7219(5, ascii[iTemp]+0x80 ); }

{WriteToMax7219(2, ascii[10] & 0x7f);

WriteToMax7219(6, ascii[dTemp]& 0x7f); }

电 子 综 合 设 计 与 制 作 (论 文)

#include void uart_init(void) {

TMOD = 0x20; //COM2:自动重置初值的8位定时/计数器 TL1 = 0xfd;

TH1 = 0xfd;

SCON = 0x50; //串口工作方式设置字节,1个起始位,8个数据位,1

个停止位组成10位帧

PCON = 0x00; }

void SendStr(char *str) { }

#include #include

extern unsigned char code ascii[];

void WriteToMax7219 (unsigned char Cmd ,unsigned char Data) {

unsigned char tLoop = 0; unsigned int tMask = 0x0001;

39

TR1 = 1; //启动定时器

ES = 1; EA = 1;

TI = 0;

while(*str != 0x00) { }

SBUF = *str++; while(TI == 0); TI = 0;

电 子 综 合 设 计 与 制 作 (论 文)

unsigned int tWord = 0;

tWord = Cmd;

tWord = (tWord << 8) + Data; CLK0 = 0; CS0 = 0;

for(tLoop=0,tMask=0x8000; tLoop<16 ;tLoop++) {

DIN0=tWord&tMask; } CS0=1; }

void InitialMax7219(void) {

unsigned char i; CS0=1; CLK0=0;

40

_nop_();

_nop_(); //rising edge CLK0=1;

if(tLoop==15) //Take CS high (while CLK is still high after CS0=1; DIN0=0;

tMask=tMask>>1;

clocking in

CLK0=0;

WriteToMax7219(0x0F,0x00);

WriteToMax7219(0x0C,0x01);

WriteToMax7219(0x0A ,0x06);

WriteToMax7219(0x09,0xFF) ;

WriteToMax7219(0x0B,0x07) ;

for(i=2;i<9;i++) {

WriteToMax7219(i,ascii[8]); }

WriteToMax7219(0x01,0x0E);

电 子 综 合 设 计 与 制 作 (论 文)

41

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务