单片机课程设计 - 图文

更新时间:2024-01-29 14:37:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计(论文)

学院名称 电气工程学院 指导教师 汪普林 职 称 讲师 学 号 20134450405 学生姓名 李振

题 目基于单片机的多点无线温度监控系统设计

班 级 电气工程及其自动化1304班

2016年 9 月 9 日

南 华 大 学

课程设计(论文)任务书

起 止

学 院: 电气工程学院

题 目: 基于单片机多点无线温度能监控系统设计

间:2016年 8月29日至2016年9月9日 学 生 姓 名: 李振 专 业 班 级: 电气工程及其自动化1304班 指 导 教 师: 汪普林 教研室主 任: 肖金凤 院 长: 王新林

2016年8月26日

1.课程设计的内容和要求(包括原始数据、技术要求、工作要求等): (1)设计内容 设计应包括以下基本功能: (1) 具备检测多点温度的能力 (2) 能够动态添加奴机的数量 (3) 可以主动轮询每个从机 (4) 主机显示从机温度和编号 以上是本设计实现的功能。 除以上功能外,设计者还可根据电路自行扩展功能。 可以在实现温度限制报警 (2)设计要求 ① 硬件电路设计。 根据设计任务选择合适的单片机,根据控制功能要求,设计各单元模块电路,设计的单元电路必须有设计原理分析,器件的选择与作用,参数计算过程。 ② 编写程序。 根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单。 ③ 利用仿真器进行系统整体仿真调试、运行程序,并分析仿真结果。 ④ 完成硬件电路的制作与调试。 ⑤ 使用PROTEL绘制系统电路原理图。 ⑥ 编写设计论文说明书。 要求条理清楚,重点突出,结构合理。对电路有详细分析,所用芯片详细介绍,并附有完整电路图(A3)及带有注释说明的完整的软件源程序清单,格式符合设计论文规范。

2.对课程设计成果的要求〔包括图表(或实物)等硬件要求〕: 设计电路与程序,仿真与实物安装调试,分析实验结果,并写出设计说明书,语言流畅简洁,文字不得少于3500字。要求图纸布局合理,符合工程要求,使用Altium Designer (Protel)软件绘出原理图(SCH),使用Proteus软件平台仿真,器件的选择要有计算依据。 3.主要参考文献: [1] 张洪润,易涛.单片机应用技术教程[M].清华大学出版社.2009 [2] 康华光.电子技术基础[M].高等教育出版社.2013 [3] 阎石.数字电子技术基础[M].高等教育出版社.2011 [4] 刘乐善.微型计算机接口技术及应用[M].华中科技大学出版社.2011 [5]野火科技.零基础玩转STM32 [M].机械工业出版社.2008 4.课程设计工作进度计划: 序号 1 2 3 4 5 6 7 2016.8.29-2013.8.30 2016.8.31-2016.9.2 2016.9.3-2016.9.5 2016.9.6-2016.9.8 2016.9.9 汪普林 日期: 分析设计任务,查阅相关资料,确定设计方案 完成硬件电路设计 编写程序、录入程序、软件编译调试、仿真。 硬件电路制作与调试,编写设计论文说明书 提交设计成果,答辩 2016 年 8 月 26 日 起 迄 日 期 工 作 内 容 主指导教师

摘要:本设计以STM32F030C8T6和TM4C123GH6PM单片机为控制单元,采用Dallas单线数字温度传感器DS18B20和无线收发模块NRF24L01对试验现场温度数据进行远程无线测量与控制。整个系统包括主、从两个子系统,其中主系统完成对试验现场设定值显示、实际值显示和接收数据功能;子系统完成温度采集、设定温度值、温度控制、显示温度、失控报警和发送数据功能。该系统结构简单实用、功能齐全,通用性强,可被应用于许多工业生产领域。

关键词:

ARM单片机;

i

温度采集系统;无线收发;温度传感器;

Abstract: This system STM32F030C8T6 and TM4C123GH6PM microcontroller for the control unit, the use of single-wire digital temperature sensor Dallas DS18B20 and wireless transceiver module NRF24L01 test site temperature data for remote wireless measurement and control. The system includes the main, from two subsystems, wherein the master system to complete the test site set value is displayed, the actual value display and receive data capabilities; complete subsystem temperature acquisition, set temperature, temperature control, temperature display, alarms and out of control functions to send data. The system is simple and practical, functional and versatile, can be applied to many spheres of industry.

Keywords: temperature acquisition system; wireless transceiver; a temperature sensor; ARM microcontroller;

ii

iii

目录

引言................................................................................................................................................... 1 1 综述............................................................................................................................................... 3

1.1项目设计的内容 ................................................................................................................ 3 1.2设计要求 ............................................................................................................................ 3 1.3系统基本方案选择 ............................................................................................................ 3

1.3.1单片机选择 ............................................................................................................ 3 1.3.2 温度传感器的选择与论证 ................................................................................... 4 1.3.3 无线收发模块的选择与论证 ............................................................................... 4 1.3.4 显示模块的选择与论证 ..................................................................................... 5 1.3.5 报警模块的选择与论证 ..................................................................................... 5 1.3.6 电路设计方案的最终确定 ................................................................................. 5

2系统硬件的设计与实现 ................................................................................................................ 6

2.1 接收机硬件设计 ............................................................................................................. 6

2.1.1 TM4C123GH6PM最小系统 ...................................................................................... 6 2.1.2 无线接收模块 ..................................................................................................... 8 2.1.3 LCD1602液晶显示器 ........................................................................................ 10 2.2 从机硬件电路设计 ....................................................................................................... 11

2.2.1 单片机STM32F030C8T6 .................................................................................... 11 2.2.2 温度传感器DS18B20 ........................................................................................ 13 2.2.3 数码管显示电路 ............................................................................................... 16 2.2.4 按键原理图 ....................................................................................................... 17 2.2.5 蜂鸣器原理图 ................................................................................................. 17

3接收机程序设计框架 .................................................................................................................. 19 4 从机程序设计框架 ................................................................................................................... 20 5 实物制作 ................................................................................................................................... 21 结束语............................................................................................................................................. 24

iii

参考文献 ......................................................................................................................................... 25 谢辞................................................................................................................................................. 26 附录Ⅰ 程序 ................................................................................................................................... 27 附录Ⅱ 主机原理图 ....................................................................................................................... 62 附录Ⅲ 从机原理图 ....................................................................................................................... 63 附录Ⅳ 原件清单 ........................................................................................................................... 64

iv

南华大学电气工程学院课程设计(论文)

引言

在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。因此,单片机对温度的控制问题是一个工业生产中经常会遇到的控制问题。 单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等部分于一体的器件,只需要外加电源和晶振就可实现对数字信息的处理和控制。因此,单片机广泛用于现代工业控制中。 随着“信息时代”的到来,作为获取信息的手段——传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。传感器技术已成为衡量一个国家科学技术发展水平的重要标志之一。因此,了解并掌握各类传感器的基本结构、工作原理及特性是非常重要的。 由于传感器能将各种物理量、化学量和生物量等信号转变为电信号,使得人们可以利用计算机实现自动测量、信息处理和自动控制,但是它们都不同程度地存在温漂和非线性等影响因素。传感器主要用于测量和控制系统,它的性能好坏直接影响系统的性能。因此,不仅必须掌握各类传感器的结构、原理及其性能指标,还必须懂得传感器经过适当的接口电路调整才能满足信号的处理、显示和控制的要求,而且只有通过对传感器应用实例的原理和智能传感器实例的分析了解,才能将传感器和信息通信和信息处理结合起来,适应传感器的生产、研制、开发和应用。另一方面,传感器的被测信号来自于各个应用领域,每个领域都为了改革生产力、提高工效和时效,各自都在开发研制适合应用的传感器,于是种类繁多的新型传感器及传感器系统不断涌现。温度传感器是其中重要的一类传感器。其发展速度之快,以及其应用之广,并且还有很大潜力。 为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合传感器技术而开发设计了这一温度监控

第1页,共69页

南华大学电气工程学院课程设计(论文)

系统。文中传感器理论与单片机实际应用有机结合,详细地讲述了基于单片机STM32F030,TM4C123GH6PM和温度传感器DS18B20的温度监测系统的设计方案与软硬件实现方案。系统包括数据采集模块,单片机控制模块,无线传输模块,显示模块和温度设置模块,驱动电路六个部分。文中对每个部分功能、实现过程作了详细介绍。本设计应用性比较强, 系统稍微改装可以作为生物培养液温度监控系统,可以做热水器温度调节系统、实验室温度监控系统等等。设计后的系统具有操作方便,控制灵活等优点。

第2页,共69页

南华大学电气工程学院课程设计(论文)

1 综述

1.1项目设计的内容

本设计是基于单片机的无线温度监控系统,经过大量查阅资料和研究,最终确定采用STM32F030C8T6为从机主控芯片,TM4C123GH6PM为接收机的主控芯片,DS18B20作为温度采集芯片,NRF24L01作为无线接收和发射模块,采用LCD1602液晶屏进行显示。该系统由发射系统和接收系统组成,发射系统进行温度采集以及数据发射,接收系统作为主系统,对数据接收处理并显示出来。该系统具有温度过限报警功能,设有4个独立按键,分别进行温度高低限定值的选择、设定,清除报警声和报警灯。该系统具有操作方便,远距离操控,功能多样,电路简洁,成本低廉等优点,符合电子技术的发展趋势,有很广阔的市场前景。 经过设计和一系列的调试,测试结果基本达到了该设计预期制定的各项要求,顺利地完成了本次课程设计的目标。

1.2设计要求

(1) 实现多点温度监控,动态添加从机。

(2) 接收系统显示实际温度值,收发距离:150米以内。 (3) 可以人工设定报警温度上下限定值。 (4) 超过温度限定值是蜂鸣器报警。

1.3系统基本方案选择

1.3.1单片机选择

从机和接收机我们采用了两种不同的单片机。鉴于ARM单片机在的广泛使用,从机我们采用的是意法半导体公司生产的Cortex M0内核的STM32F030C8T6 32位单片机。接收机我们采用的是德州仪器公司生产的Cortex M4内核的TM4C123GH6PM 32位单片机。两者速度均高于传统的8051单片机,功能更强,

第3页,共69页

南华大学电气工程学院课程设计(论文)

便于以后对系统功能的扩展。

1.3.2 温度传感器的选择与论证

方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加了线路的复杂程度,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。因此此方案不可行。 方案二:采用DS18B20。DS18B20的数字温度输出通过1-Wire总线,又称为“一线”总线,这种独特的方式可以使多个DS18B20方便地组建成传感器网络,为整个测量系统的建立和组合提供了更大的可能性。它在测温精度、转换时间、测数距离、分辨率等方面比其他温度传感器有了很大的进步,给用户带来了更方便的使用和更令人满意的效果。DS18B20直接输出数字温度值,不需要校正,因此选择此方案。

1.3.3 无线收发模块的选择与论证

方案一:采用TX315A-T01和TX315A-R01的无线收发模块。应用目前最先进的声表面波器件和数据专用ASK超外差式单片接收电路开发生产了TX315系列模块电路,其中含有RF、TF、DATA等高频、中频、数字处理电路。TX315A可应用于无线遥控、数据传送、自动抄表系统、无线键盘操作系统、警戒系统。TX315A由TX315A-T01发射组件和TX315A-R01接收组件两部分组成,因其频率绝对一致,故在使用时可随意增加发射和接收组件,以组成所需的功能系统。此系统用此模块很好,但是这个模块的价格太昂贵,所以放弃此方案。

方案二:采用一对NRF24L01作为无线收发模块。NRF24L01是一款新型单片射频收发器件,工作于2.4 GHz~2.5 GHz ISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型Shock Burst技术,其中输出功率和通信频道可通过程序进行配置。NRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;接收时,工作电流只有12.3mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便,而且价格相对其他无线模块较低,易

第4页,共69页

南华大学电气工程学院课程设计(论文)

于购买,因此选择此方案。

1.3.4 显示模块的选择与论证

方案一:采用数码管显示,成本低、亮度高。但本系统所要实现较多的内容,硬 件电路设计会比较复杂,而且功耗大,所以不适合本设计。

方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。

方案三:采用LCD1602液晶屏显示,显示内容较多,方便组合,可视面积大,画面效果好,抗干扰能力强,调用方便简单,而且可以节省软件中断资源。系统中需要显示温度和上限温度等信息,要求显示内容丰富。

比较上述三种方案,方案三电路简单、显示信息量大、能很好的满足题目要求,因此接收机采用方案三,从机采用方案一。

1.3.5 报警模块的选择与论证

方案一:采用555定时器构成蜂鸣器,常用于定时报警,非常实用,其时间可控, 但本设计报警时间是随机的,取决于试验现场的温度,因此不可行。 方案二:采用9102三极管驱动蜂鸣器,当达到温度上下限值,就会给三极管一个高电平驱动蜂鸣器,实现声音报警,并且可以接个发光二级管,同时点亮二极管,实现发光报警。此方案实行起来方便,电路也简单,因此选用此方案。

1.3.6 电路设计方案的最终确定

由以上讨论的各种方案最终得出本次设计的方案为:采用单片机芯片STM32F030C8T6和TM4C123GH6PM作为主控制芯片,DS18B20数字温度传感,NRF24L01作为无线收发模块,LCD1602作为接收机显示模块,数码管作为从机显示模块,采用蜂鸣器声音报警。

第5页,共69页

南华大学电气工程学院课程设计(论文)

2系统硬件的设计与实现

2.1 接收机硬件设计

2.1.1 TM4C123GH6PM最小系统

单片机我们是用的TI的TM4C123GH6PM,德州仪器Tiva?C系列微控制器

为设计人员提供了高性能ARM?基于-M-的Cortex?架构一套广泛的集成能力和强大的生态系统软件和开发工具。针对性能和灵活性,Tiva?C系列架构提供了一个80 MHz的Cortex-M的与FPU,各种综合内存和多个可编程GPIO。 TIVA?C系列设备为消费者带来引人注目的具有成本效益的解决方案通过集成专用外设,并提供软件的综合库工具,最大限度地降低电路板成本和设计周期时间。提供更快的时间到市场和成本积蓄,Tiva?C系列微控制器是高性能的32位领导的选择应用程序。芯片内部资源如图所示:

表2.1 TM4C123GH6PM内部资源

第6页,共69页

南华大学电气工程学院课程设计(论文)

TI还提供了这个芯片的评估板,它包含有仿真电路和一个最小系统。为简化电路设计我们的接收机将围绕此评估板展开,此评估板总共引出40个引脚,包括电源接线和通用IO口,实物和引脚排布如图所示:

图2.2 LaunchPad实物图

图 2.3 引脚排布图

第7页,共69页

南华大学电气工程学院课程设计(论文)

2.1.2 无线接收模块

无线收发我们使用的是

NRF24L01。nRF24L01是由NORDIC生产的工作在

2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设置可以通过SPI 接口进行设置。几乎可以连接到各种单片机芯片,并完成无线数据传送工作。极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。NRF24L01主要特性有GFSK调制:硬件集成OSI链路层;具有自动应答和自动再发射功能;片内自动生成报头和CRC校验码;数据传输率为l Mb/s或2Mb/s;SPI速率为0 Mb/s~10 Mb/s; 125个频道:与其他NRF24系列射频器件相兼容;QFN20引脚4mm×4mm封装;供电电压为1.9V~3.6V。NRF14L01的封装及引脚排列如图3-5所示 NRF24L01有4种工作模式,我们使用的是标准模式。

表2.2 工作模式表

图2.5 射频模块原理图

第8页,共69页

南华大学电气工程学院课程设计(论文)

发射数据时,首先将NRF24L01配置为发射模式:接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入NRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么NRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址TX_ADDR一致)。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX FIFO中数据保留以便在次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时,若CE为低则NRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。 接收数据时,首先将NRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在RX FIFO中,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则NRF24L01进入空闲模式1。 SPI口为同步串行通信接口,最大传输速率为10Mb/s,传输时先传送低位字节,再传送高位字节。但针对单个字节而言,要先送高位再送低位。与SPI相关的指令共有8个,使用时这些控制指令由NRF24L01的MOSI输入。相应的状态和数据信息是从MISO输出给MCU。该模块在电路中的接线如图所示:

图2.6 NRF24L01接线图

第9页,共69页

南华大学电气工程学院课程设计(论文)

2.1.3 LCD1602液晶显示器

表2.3 LCD1602的主要技术参数

LCD1602是一款简单的液晶显示器,它可以显示2行,每行16个字符,在

5V的工作电压下的工作电流是2mA,这个电流是指液晶电流,它自带背光LED灯,工作电流20mA左右。

1602液晶一共有16个引脚,每个引脚的功能如图所示:

表2.3 1602的引脚图

3脚是液晶显示对比度调节引脚,在电路中我们通过一个4.7k的电阻接地。4脚到14脚我们分别通过4.7K的电阻接到5V电源上,原因是应为我们使用的单片机IO输出电压最高为3.3V,而液晶显示器的引脚电压为5V,所以在单片机引脚开漏输出状态下,接上拉电阻,来将输出电压提高到5V。电路接线如图所示:

第10页,共69页

南华大学电气工程学院课程设计(论文)

图2.9 1602液晶的接线图

2.2 从机硬件电路设计

2.2.1 单片机STM32F030C8T6

STM32F030C8T6是法意利半导体生产的一款高性能的ARM Cortex-M0 32位的RISC指令集的单片机,工作频率为48MHz,内部有256Kbytes的Flash和32Kbytes的SRAM,提供标准的通信接口(2路I2C,2路SPI和6路USART),内部还包含有一个12位的ADC,和7个通用定时器。它的工作电压为2.4 到3.6V。 在本系统中,我们使用到SPI接口用于与射频进行数据交换,使用USART进行调试,另外我们使用普通IO口模拟了1-wire总线。ST公司为简化开发者的工作量提供了一个库,将底层的寄存器操作进行了封装,在应用时只需要调用对应的API即可。

第11页,共69页

南华大学电气工程学院课程设计(论文)

图2.10 STM32F030C8T6引脚排布

图2.12 STM32F030C8T6原理图

第12页,共69页

南华大学电气工程学院课程设计(论文)

图2.11 STM32F030C8T6内部结构图

再从机中我们使用它来驱动DS18B20,数码管和NRF24L01,原理图如图示

2.2.2 温度传感器DS18B20

DS18B20是美信公司生产的一款温度传感器,单片机可以通过1-Wire协议与DS18B20进行通信,最终读出温度,1-Wire总线的硬件接口很简单,只需要

第13页,共69页

南华大学电气工程学院课程设计(论文)

把DS18B20的数据引脚和单片机的一个IO接口接上即可。原理如图所示:

图2.13 DS18B20原理图

DS18B20通过编程,可以实现最高12位的温度存储,在寄存器中以补码格式存储如图所示:

图2.14 DS18B20的数据存储格式

一共 2 个字节, LSB 是低字节, MSB 是高字节,其中 MSb 是字节的高位, LSb 是字节的低位。大家可以看出来,二进制数字,每一位代表的温度的含义,都表示出来了。其中 S表示的是符号位,低 11 位都是 2 的幂,用来表示最终的温度。 DS18B20 的温度测量范围是从-55 度到+125 度,而温度数据的表现形式,有正负温度,寄存器中每个数字如同卡尺的刻度一样分布,如图所示: 表2.15 DS18B20的温度值

第14页,共69页

南华大学电气工程学院课程设计(论文)

二进制数字最低位变化 1,代表温度变化 0.0625 度的映射关系。当 0 度的时候,那就是0x0000,当温度 125 度的时候,对应十六进制是 0x07D0,当温度是零下 55 度的时候,对应的数字是 0xFC90。反过来说,当数字是 0x0001 的时候,那温度就是 0.0625 度了。 DS18B20的操作指令:

(1) Skip ROM:0xCC。当总线上只有一个温度传感器是就可以使用这个

指令跳过ROM检测。 (2) RAM存储器操作指令。

Read Scratchpad(读暂存器):0xBE。 Convert Temperature(启动温度转换):0x44。

当我们发送一个启动温度转换的指令后, DS18B20 开始进行转换。从转换开始到获取温度, DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。前边说 DS18B20 最高可以用 12 位来存储温度,但是也可以用 11 位, 10 位和 9 位一共四种格式。位数越高,精度越高, 9 位模式最低位变化 1 个数字温度变化 0.5 度,同时转换速度也要快一些,如图所示:

图2.16 DS18B20的温度转换时间

第15页,共69页

南华大学电气工程学院课程设计(论文)

2.2.3 数码管显示电路

图2.17 数码管电路

因为单片机IO的驱动能力不够,所以在数码管的驱动电路里我们加上了三极管,作为开关,由数码管控制通断,来由电源直接驱动。段选脚串如一个200欧的电阻来减小流入单片机的电流。数码管是通过动态刷新来显示。

第16页,共69页

南华大学电气工程学院课程设计(论文)

2.2.4 按键原理图

图2.18 按键电路

按键的实现是通过单片机轮询每个按键来确定按键的状态的,单片机IO引脚设置为上拉输入模式,如果有按键按下,单片机IO将输入低电平,一般状态为高电平,在软件部分我们用了统计的方法来进行消抖。

2.2.5 蜂鸣器原理图

由于蜂鸣器所需电流比较大,所以我们使用了一个PnP三极管作为开关来驱

动蜂鸣器,原理是一旦IO口输出低电平时三极管导通,如果IO输出高电平时三极管关断,蜂鸣器停止鸣叫。

第17页,共69页

南华大学电气工程学院课程设计(论文)

图2.19 蜂鸣器原理图

第18页,共69页

南华大学电气工程学院课程设计(论文)

3 接收机程序设计框架

图3.1 主机程序框架

第19页,共69页

南华大学电气工程学院课程设计(论文)

4 从机程序设计框架

图4.1 从机程序框架

第20页,共69页

南华大学电气工程学院课程设计(论文)

5 实物制作

图 5.1 从机实物图

图5.2 主机实物图

第21页,共69页

南华大学电气工程学院课程设计(论文)

图5.3 从机运行图

图5.4 主机运行图

第22页,共69页

南华大学电气工程学院课程设计(论文)

首先启动接收机和从机,此时主机被设置为接收状态,从机被设置为发送状态,通过添加按键来添加从机的ID到主机,然后把主机设置为发送状态,从机设置为接收状态,通过主机来轮询每个从机来获得从机温度信息。从机另外可以通过按键设置报警温度,一旦到达指定温度,蜂鸣器就会报警。

第23页,共69页

南华大学电气工程学院课程设计(论文)

结束语

本设计以单片机STM32F030C8T6和TM4C123GH6PM为开发平台,NRF24L01无线收发模块,DS18B20温度传感器及LCD1602的特性及工作原理进行了深入研究。通过软件硬件相结合而设计了远程温度显示,远程温度报警系统。89S51单片机的采用,不仅便于数据采集,而且扩展了各种功能,比如显示、外部中断等。NRF24L01无线收发模块集成度高,集合了编码解码,发射接收功能,使用方便,使得系统的硬件和软件简单了许多。“一线”数字温度传感器DS18B20与软件处理相结合,进一步提高了系统的测温精度。在电路的设计中充分考虑了系统的可靠性和安全性。该系统具有操控简单方便、显示直观、功能多样、精确度高、电路简洁、成本低廉等诸多优点。对于单片机爱好者来说,也可以在系统的基础上进行其它功能的开发。

第24页,共69页

南华大学电气工程学院课程设计(论文)

参考文献

[1]于海生,潘松峰,于培仁.微型计算机控制技术[M].北京:清华大学出版社,2009.

[2]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2010. [3]谭浩强.C语言程序设计教程[M].北京:高等教育出版社,2010.

[4]彭伟.单片机C语言程序设计实训100例[M].北京:北京航空航天大学出版社,2010.

[5]候殿有.单片机C语言设计[M].北京:人民邮电出版社,2010. [6]姜志海,赵艳雷.单片机的C语言[M].北京:电子工业出版社,2008.

第25页,共69页

南华大学电气工程学院课程设计(论文)

谢辞

首先要感谢汪普林老师,虽然汪普林老师,工作繁忙,教学任务重,但在我们做课程设计时每个阶段,从查阅到设计草案的确定和修改,中期检查,后期详细设计,实物制作等过程都给了我们悉心的知道。

其次要感谢大学三年来所有的授课老师,为我们打下电子专业知识的基础;同时要感谢所有的同学们,正是因为有了你们的支持和鼓励,此次课程设计才会顺利的完成。

通过这次的课程设计我学到了很多课堂上没有的东西,也让我理解了学以致用的道理,希望在以后的学习中能够不断完善自己的知识。

第26页,共69页

南华大学电气工程学院课程设计(论文)

附录Ⅰ 程序

主机程序

//Task.c

#include \#include \volatile uint32_t timeout;

uint8_t flag_gettemp=1;

void SysTick_Configure(void) {

IntMasterEnable();

SysTickPeriodSet(SysCtlClockGet()/1000);

SysTickIntEnable(); SysTickEnable(); }

void SysTick_Handler(void) {

if(timeout !=1000) {

timeout++; } else {

timeout=0; } }

void Task(void) {

if(timeoutP==0) { } }

//Task.h

#ifndef _SYSTICK_H_ #define _SYSTICK_H_ #include

第27页,共69页

南华大学电气工程学院课程设计(论文)

#include

#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include \#include \

extern uint8_t flag_gettemp;

void Task(void);

void SysTick_Configure(void); #endif //lcd1602.c

#include \

void Lcd1602_GPIO_Config(void) {

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

GPIOPinTypeGPIOOutputOD(GPIO_PORTB_BASE,DATA_PIN); GPIOPinWrite(GPIO_PORTB_BASE,DATA_PIN,DATA_PIN);

GPIOPinTypeGPIOOutputOD(GPIO_PORTC_BASE,LCD_CMD_PIN); GPIOPinWrite(GPIO_PORTC_BASE,LCD_CMD_PIN,LCD_CMD_PIN); }

void LCD1602_DATA_Mode_IN(void) {

GPIOPinTypeGPIOInput(GPIO_PORTB_BASE,DATA_PIN); }

void LCD1602_DATA_Mode_OUT(void) {

第28页,共69页

南华大学电气工程学院课程设计(论文)

GPIOPinTypeGPIOOutputOD(GPIO_PORTB_BASE,DATA_PIN); }

void LcdWaitReady(void) {

uint8_t sta;

LCD1602_DATA_Mode_OUT();

LCD_DATA_OUT(0xFF); LCD_RS_L; LCD_RW_H;

LCD1602_DATA_Mode_IN(); do{

LCD_EN_H;

sta=LCD_DATA_IN; LCD_EN_L; }while(sta & 0x80);

LCD1602_DATA_Mode_OUT(); }

void LcdWriteCmd(uint8_t cmd) {

LcdWaitReady(); LCD_RS_L; LCD_RW_L;

LCD_DATA_OUT(cmd); LCD_EN_H; LCD_EN_L; }

void LcdWriteDat(uint8_t dat) {

LcdWaitReady(); LCD_RS_H; LCD_RW_L;

LCD_DATA_OUT(dat); LCD_EN_H; LCD_EN_L; }

void LcdSetCursor(uint8_t x,uint8_t y) {

uint8_t addr; if(y==0)

addr=0x00+x; else

第29页,共69页

南华大学电气工程学院课程设计(论文)

addr=0x40+x;

LcdWriteCmd(addr | 0x80); }

void LcdShowStr(uint8_t x,uint8_t y,uint8_t *str) {

LcdSetCursor(x,y); while(*str !='\\0') {

LcdWriteDat(*str++); } }

void InitLcd1602(void) {

LcdWriteCmd(0x38); LcdWriteCmd(0x0c); LcdWriteCmd(0x06); LcdWriteCmd(0x01); }

void Lcd1602_Configure(void) {

Lcd1602_GPIO_Config(); InitLcd1602(); }

//lcd1602.h

#ifndef _LCD1602_H_ #define _LCD1602_H_ #include #include

#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include \

#define DATA_PIN GPIO_PIN_0 |GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7

第30页,共69页

南华大学电气工程学院课程设计(论文)

#define LCD_RS_PIN GPIO_PIN_4 #define LCD_RW_PIN GPIO_PIN_5 #define LCD_EN_PIN GPIO_PIN_6

#define LCD_CMD_PIN LCD_RS_PIN |LCD_RW_PIN |LCD_EN_PIN

#define LCD_RS_H GPIOPinWrite(GPIO_PORTC_BASE,LCD_RS_PIN,LCD_RS_PIN)

#define LCD_RS_L GPIOPinWrite(GPIO_PORTC_BASE,LCD_RS_PIN,~LCD_RS_PIN)

#define LCD_RW_H GPIOPinWrite(GPIO_PORTC_BASE,LCD_RW_PIN,LCD_RW_PIN)

#define LCD_RW_L GPIOPinWrite(GPIO_PORTC_BASE,LCD_RW_PIN,~LCD_RW_PIN)

#define LCD_EN_H GPIOPinWrite(GPIO_PORTC_BASE,LCD_EN_PIN,LCD_EN_PIN)

#define LCD_EN_L GPIOPinWrite(GPIO_PORTC_BASE,LCD_EN_PIN,~LCD_EN_PIN)

#define LCD_DATA_IN GPIOPinRead(GPIO_PORTB_BASE,DATA_PIN) #define LCD_DATA_OUT(dat) GPIOPinWrite(GPIO_PORTB_BASE,DATA_PIN,0xFF&dat)

void Lcd1602_Configure(void);

void LcdShowStr(uint8_t x,uint8_t y,uint8_t *str);

#endif //spi.c

//*********************************************************************** #include \

uint8_t SPI_RW(uint8_t data) {

uint8_t bit_ctr; SCK_LOW

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

第31页,共69页

南华大学电气工程学院课程设计(论文)

{

if(data&0x80) {

MOSI_HIGH } else {

MOSI_LOW }

data=(data<<1); SCK_HIGH

data|=(GPIO_PIN_MISO==MISO); SCK_LOW }

return data; }

void SPI1_INIT(void) {

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_3|GPIO_PIN_2); GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,GPIO_PIN_3); ///CE3?ê??ˉ //**************************************************************** SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

GPIOPinTypeGPIOOutput(GPIO_PORT,GPIO_PIN_SCK|GPIO_PIN_MOSI|GPIO_PIN_CS);

GPIOPinTypeGPIOInput(GPIO_PORT,GPIO_PIN_MISO);

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

printf(\ complate!\\r\\n\} //spi.h

#ifndef _SPI_H_ #define _SPI_H_ #include #include #include

#include\#include\#include\#include\#include\

第32页,共69页

南华大学电气工程学院课程设计(论文)

#include\#include\#include\#include\typedef uint8_t u8;

#define GPIO_PORT GPIO_PORTF_BASE #define GPIO_PIN_CS GPIO_PIN_2 #define GPIO_PIN_SCK GPIO_PIN_1 #define GPIO_PIN_MOSI GPIO_PIN_4 #define GPIO_PIN_MISO GPIO_PIN_3

#define SCK_HIGH GPIOPinWrite(GPIO_PORT,GPIO_PIN_SCK,GPIO_PIN_SCK);

#define SCK_LOW

GPIOPinWrite(GPIO_PORT,GPIO_PIN_SCK,~GPIO_PIN_SCK);

#define MOSI_HIGH GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2,GPIO_PIN_2);

#define MOSI_LOW GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2,~GPIO_PIN_2);

#define MISO GPIOPinRead(GPIO_PORT,GPIO_PIN_MISO)

#defin CS_HIGH GPIOPinWrite(GPIO_PORT,GPIO_PIN_CS,GPIO_PIN_CS);

#define CS_LOW GPIOPinWrite(GPIO_PORT,GPIO_PIN_CS,~GPIO_PIN_CS);

#define SPI_CE_L() GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,~GPIO_PIN_3)

#define SPI_CE_H() GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,GPIO_PIN_3)

#define SPI_CSN_L() CS_LOW #define SPI_CSN_H() CS_HIGH

void SPI1_INIT(void); u8 SPI_RW(u8 dat);

#endif

第33页,共69页

南华大学电气工程学院课程设计(论文)

//nrf24l01.c

#include \#include \#include \#include \

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

uint8_t TX_ADDRESS[TX_ADR_WIDTH]= {0x13,0x31,0x63,0x66,0x85}; //±?μ?μ??· uint8_t RX_ADDRESS[RX_ADR_WIDTH]= {0x13,0x31,0x63,0x66,0x85}; //?óê?μ??·

uint8_t NRF24L01_RXDATA[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /*

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

uint8_t NRF_Write_Reg(uint8_t reg, uint8_t value) { uint8_t status; SPI_CSN_L(); status = SPI_RW(reg); SPI_RW(value); /* D′êy?Y */ SPI_CSN_H(); /* ???1???÷?t */ return status; } /*

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

uint8_t NRF_Read_Reg(uint8_t reg) { uint8_t reg_val; SPI_CSN_L(); SPI_RW(reg); reg_val = SPI_RW(0); /* ?áè?????′??÷·μ??êy?Y */ SPI_CSN_H(); /* ???1???÷?t */ return reg_val; } /*

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

第34页,共69页

南华大学电气工程学院课程设计(论文)

*/

uint8_t NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars) { uint8_t i; uint8_t status; SPI_CSN_L(); /* ??í¨?÷?t */ status = SPI_RW(reg); /* D′??′??÷μ??· */ for(i=0; i

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

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

uint8_t NRF_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars) { uint8_t i; uint8_t status; SPI_CSN_L(); /* ??í¨?÷?t */ status = SPI_RW(reg); /* D′??′??÷μ??· */ for(i=0; i

/****************************************************************** * D′êy?Y°ü

******************************************************************/ void NRF_TxPacket(uint8_t * tx_buf, uint8_t len) { SPI_CE_L(); //StandBy I?£ê? NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len); // ×°??êy?Y SPI_CE_H(); //????CE£??¤·¢êy?Y·¢?í } /*

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

第35页,共69页

南华大学电气工程学院课程设计(论文)

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

u8 NRF_CHECK(void) { u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; u8 i; NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5); //?ònRFμ???′??÷D′è?????êy×? buf[1] = 0X11; NRF_Read_Buf(TX_ADDR,buf,5); //?ònRFμ???′??÷D′è?????êy×? for(i=0;i<5;i++) if(buf[i]!=0XA5) break; if(i!=5)return 0;//?ònRFμ???′??÷D′è?????êy×? return 1; }

void NRF24L01_INIT(void) {

SPI_CE_L(); //StandBy I?£ê? SPI_CE_L(); NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//D′RX?úμ?μ??· NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //D′TX?úμ?μ??· NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01) NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a); NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //éè??RFí¨μà?aCHANAL NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//?? NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x26); NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQê?·¢íê3é?D???ìó|£?16??CRC£??÷·¢?í SPI_CE_H(); } /*

***************************************************************** * ?óê??£ê?

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

void SetRX_Mode(void)

第36页,共69页

南华大学电气工程学院课程设计(论文)

{ SPI_CE_L(); NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQê?·¢íê3é?D???ìó|£?16??CRC £??÷?óê? SPI_CE_H(); } /*

***************************************************************** * ·¢?í?£ê?

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

void SetTX_Mode(void) { SPI_CE_L(); NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQê?·¢íê3é?D???ìó|£?16??CRC£??÷·¢?í SPI_CE_H(); }

/*======================================================================*/

void NRF_IRQ(void) { uint8_t sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); if(sta & (1<

NRF_Read_Buf(0x61,NRF24L01_RXDATA,32);// read receive payload from RX_FIFO buffer NRF_Write_Reg(0x27, 0xff);//??3ynrfμ??D??±ê???? } if(sta & (1<

void NRF_GPIO_Interrupt_Init(void) //nRFê1ó?μ?ía2??D??μ?òy??3?ê??ˉ { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_2); IntEnable(INT_GPIOE);

第37页,共69页

南华大学电气工程学院课程设计(论文)

GPIOIntEnable(GPIO_PORTE_BASE,GPIO_INT_PIN_2);

GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_2,GPIO_FALLING_EDGE); }

void NRF24L01_Configure(void) {

uint8_t flag=0; SPI1_INIT();

flag=NRF_CHECK(); if(!flag) {

while(1) {

ROM_SysCtlDelay(SysCtlClockGet()/3); printf(\ failure!\\r\\n\ } }

NRF24L01_INIT();

NRF_GPIO_Interrupt_Init(); NRF_IRQ(); }

uint32_t nrf_check;

void NRF_Data_Receive(void) { uint8_t i;

NRF_IRQ(); //??3ynRFμ??D??±ê????

// printf(\TA); // printf(\ nrf_check = 0; for(i=0;i<30;i++) {

nrf_check = nrf_check + NRF24L01_RXDATA[i]; }

if((nrf_check < 250*30 ) && (nrf_check != 0 ) && ((NRF24L01_RXDATA[30] == (uint8_t)(nrf_check & 0x00ff)) && (NRF24L01_RXDATA[31] == (uint8_t)((nrf_check & 0xff00) >> 8)))) { //??êy?Y??DD?é?¤

uint8_t id=NRF24L01_RXDATA[1]; uint8_t id_str[3]; uint8_t temp_str[4]; uint8_t alarm;

uint8_t str[]=\

第38页,共69页

南华大学电气工程学院课程设计(论文)

uint8_t str_x[]=\ uint8_t str_alarm[2]; uint16_t temp; float tempture;

temp= (NRF24L01_RXDATA[3]<<8) + NRF24L01_RXDATA[2]; alarm=NRF24L01_RXDATA[4]; tempture=temp * 0.0625;

printf(\ Temp=%f alarm=%d\\r\\n\ LcdShowStr(0,0,str); id_str[2] = id+'0'; id_str[1] = id/10+'0'; id_str[0] = id/10/10+'0'; LcdShowStr(3,0,id_str);

temp =tempture *10;

temp_str[3]=temp+'0'; temp_str[2]='.';

temp_str[1]=temp/10+'0'; temp_str[0]=temp/10/10 % 10+'0'; LcdShowStr(12,0,temp_str);

LcdShowStr(0,1,str_x);

str_alarm[0]=alarm /10 +'0'; str_alarm[1]=alarm +'0'; LcdShowStr(6,1,str_alarm); } }

void EXTI_PE_Handler(void) {

uint32_t status;

status=GPIOIntStatus(GPIO_PORTE_BASE,true); GPIOIntClear(GPIO_PORTE_BASE,status); if(status & GPIO_PIN_2) {

NRF_Data_Receive(); } }

//nrf24l01.h

#ifndef _NRF24L01_H_ #define _NRF24L01_H_

第39页,共69页

本文来源:https://www.bwwdw.com/article/9c4w.html

Top