单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 课件 任务1.5 利用位操作实现温度报警器_第1页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 课件 任务1.5 利用位操作实现温度报警器_第2页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 课件 任务1.5 利用位操作实现温度报警器_第3页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 课件 任务1.5 利用位操作实现温度报警器_第4页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 课件 任务1.5 利用位操作实现温度报警器_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机产品设计与制作

(stm32机型)袁秀英石梅香项目1、利用GPIO和位带操作实现温度报警任务1.5利用位操作实现温度报警器总目录1项目1、利用GPIO和位带操作实现温度报警

2项目2、利用SysTick实现温度报警与控制

3项目3、利用按键查询实现参数设定及显示

4项目4、利用外部中断实现工件计数显示

5项目5、利用定时器实现直流电动机PWM调速6项目6、利用计数器实现工件计数显示和打包控制

7项目7、利用ADC实现土壤湿度采集

具体工作任务设计基于STM32单片机的温度报警器,实现如下功能:

温度超过设定温度(30℃)时,报警灯点亮;否则,报警灯熄灭。请进行1、方案设计2、器件选型3、电路和程序设计4、完成软硬件调试。项目总目标1、了解单片机的发展及用途,理解其关键概念与术语;2、了解单片机产品的开发过程,会使用开发工具进行软硬件设计与调试;3、理解基于STM32F103ZET6的电源电路原理,能够独立进行电源电路的设计与调试;4、理解按键、温度开关等简单DI电路的原理,能够独立进行类似电路的设计与调试;5、理解LED等简单DO电路的原理,能够独立进行类似电路的设计与调试;6、掌握基于HAL库函数的GPIO引脚读写和位操作编程方法;7、能够按照分组管理的模块化设计方法进行程序设计与调试;8、了解STM32GPIO电路的内部结构;9、会查找相关资料、阅读相关文献。子目录1项目1、利用GPIO和位带操作实现温度报警

1.1任务1.1 认识STM32单片机及其开发工具1.2任务1.2 方案设计

1.3任务1.3 电路设计

1.4任务1.4 程序设计

1.5任务1.5 利用位带操作实现温度报警

1.6任务1.6 stm32软硬件深入(一)

任务1.5利用位操作实现温度报警器1、理解位操作的基本概念,会利用给出的框架和位操作文件,

编写GPIO位操作程序;2、会给程序加入宏定义,提高程序的可移植性;3、理解分组管理的模块化程序设计思路,会利用现有框架,

设计调试自己的模块化程序。课程回顾——基于STM32的温度报警器电路课程回顾——流程图课程回顾——程序结构voidGPIOA_Init(){}voidGPIOC_Init(){}int

main(){}//包含声明,头文件stm32f1xx.h中包含了关于stm32单片机的各种定义#include"stm32f1xx.h"//main()函数,主函数,复位后首先运行的函数//两个子函数,运行中被main()调用数课程回顾——GPIO库函数GPIO_PinState

HAL_GPIO_ReadPin(GPIO_TypeDef

*GPIOx

uint16_t

GPIO_Pin)端口名引脚号读GPIO引脚void

HAL_GPIO_WritePin

(GPIO_TypeDef*GPIOx,

uint16_t

GPIO_Pin,GPIO_PinState

PinState)端口名引脚号写GPIO引脚输出值HAL_StatusTypeDef

HAL_Init(

)HAL初始化void

HAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init)GPIO初始化端口名GPIO初始化变量

__HAL_RCC_GPIOx_CLK_ENABLE()开启GPIO时钟

__HAL_RCC_GPIOx_CLK_DISABLE()关闭GPIO时钟GPIO引脚的位操作读PA0引脚输入给变量AAA,可直接写:AAA=PAin(0);相当于:AAA=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);向PA0引脚输出0,可写语句:PAout(0)=0;相当于:HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);这就是位操作,也称为位带(BitBand)操作。这种输入输出方法和51单片机很相似,因此特别受熟悉51单片机编程人员的欢迎。这也是我们后续主要采用的GPIO引脚读写方法。直接使用GPIO管腿号进行数据输入输出,例如:搭建带有位操作的程序框架“01-01-程序框架-加入位操作”中包含有sys.c和sys.h两个文件。含有位操作的定义有了这两个文件,我们就可以使用诸如PAin(0)、PAout(0)等符号进行GPIO位读写操作了。搭建带有位操作的程序框架(1)复制文件夹“01-01-程序框架-加入位操作”,将其保存,以便以后使用。(2)再复制一次,将副本文件夹名修改为:01-03-温度报警器-位操作-方法1。(3)打开“01-03-温度报警器-位操作-方法1”,修改工程名为:Temperature_Alarm。(4)双击文件:Temperature_Alarm,打开工程。搭建带有位操作的程序框架(5)观察Project中增加了SYSTEM文件夹和sys.c文件。(6)打开main.c,多了一条:#include“sys.h”。(7)进行编译(compile)、生成(build)操作,确保框架没有错误(error)和警告(warning)。做完后会在左侧的Project窗口中点击的sys.c前的“+”号,可以找到sys.h。程序编辑与调试(1)将“01-02-温度报警器-GPIO读写”中main.c内容复制粘贴过来,再对照以下程序进行修改。(2)检查声明部分是否包含了“sys.h”。(3)屏蔽第19行的GPIOC_Init()函数中的GPIO写引脚函数。(4)增加20行:PCout(0)=1;此句的功能与19行相同。(5)修改23、28、29、30行。(6)做编译生成操作,直到没有错误和警告。程序分析ØPAin(0),就是输入PA0,相当于语句:HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);利用sys.c和sys.h文件提供的位操作方法时,不支持GPIO_PinState数据类型,应将其数据类型设为uint16_t(第23行)ØPCout(0)=0,就是让PC0管腿输出0,相当于语句:HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);ØPCout(0)=1,就是让PC0管腿输出1,相当于语句:HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);大家看,这样写程序根本不用记复杂的库函数,而是直接使用管腿号和in、out符号:输入PA0就是PAin(0),输出PA0就是PAout(0),是不是特别简明!这种通过直呼GPIO引脚名进行数据输入输出的方法,就是位操作。还可以将主函数修改如下:程序修改“!”是逻辑取反运算符。这种编程方法不需要定义中间变量temperature(1)复制文件夹“01-03-温度报警器-位操作-方法1”。(2)将副本文件夹名修改为:01-04-温度报警器-位操作-方法2。(3)双击文件:Temperature_Alarm,打开工程。(4)修改主函数(5)编译、生成、下载、调试6、位操作支持文件的初步解读本程序能够使用PAin(0)、PAout(0)等符号进行位操作,是由于有sys.h文件的支持。程序分析至于第66~85行其它内容是什么意思,为什么这么写就能实现位操作,我们暂不理会,留待以后研究。打开sys.h文件,第66行和67行定义了PAout(n)和PAin(n),n=0~15。第64~85行定义了每一个GPIO管腿的位操作名。练习编写程序,利用位操作,实现:按下开发板上的K_DOWN按键(连接在PE3上),LED5(连接在PC6)点亮。利用宏定义实现温度报警器1、程序框架搭建(1)复制文件夹:01-04-温度报警器-加入位操作-方法2;(2)修改副本名字为:01-05-温度报警器-位操作-加入宏定义;(3)双击Temperature_Alarm,打开工程。

2、管腿再定义

给每一个管腿都起一个有意义的名字。利用宏定义实现温度报警器利用宏定义实现温度报警器3、程序编辑与调试利用#define语句,在程序中增加关于这些引脚的再定义,然后在程序中直接使用这些管腿的名字。具体修改如下,请大家注意第3~14行、第31行、第38行。使用宏定义给管腿起名的好处:(1)意义清晰,可读性好。(2)程序的移植性好。4、软硬件联调对程序进行编译生成操作,将程序下载到开发板。反复操作按键,观察LED显示情况是否正确。编写程序,利用宏定义和位操作,实现:按下开发板上的K_LEFT按键(连接在PE2上),LED8(连接在PC7)点亮。练习利用分组管理实现温度报警1、框架结构再观察仔细观察Project(工程)窗口,我们发现:(1)在Temperature_Alarm工程中,包含Target1(目标)文件夹;(2)Target1中包含USER、CORE等多个文件夹,这些文件夹也被称为Group(组);(7)HARDWARE(硬件)组:用来存放我们自己编写的一些关于硬件初始化的文件。(3)USER(用户)组:内含我们熟悉的main.c文件;(4)SYSTEM(系统)组:内含位带操作需要的sys.c和sys.h等文件;(5)CORE(内核)组:内含启动文件以及ARM公司提供的内核文件;(6)HALLIB(HALLibrary,HAL库)组:内含ST公司提供HAL库文件。利用分组管理实现温度报警2、主函数结构再观察这种结构用户把自己编辑的所有函数都放在文件main.c中,因此简单直观。但是如果子函数比较多或者比较长,程序就会很冗长,不容易抓住重点。利用分组管理实现温度报警3、分组管理的思路类似位带操作的sys.c和sys.h,将按键和LED初始化函数独立,写在key.c、key.h、led.c、led.h文件中;再把它们放到某个组Group,例如HARDWARE里,这样,只要在main.c的开头用#include将对应头文件包含进来,主文件里就不需要再书写那些子函数了。这样的文件管理方式,就是分组管理。利用分组管理实现温度报警4、框架搭建为实现分组管理,我们可以按以下步骤进行操作。(1)退出Keil,复制文件夹:01-05-温度报警器-位操作-加入宏定义;(2)修改副本文件夹名为:01-06-温度报警器-位操作-加入宏定义-分组管理,(3)打开后,在HARDWARE中新建两个文件夹:KEY和LED;(4)复制SYSTEM文件夹中的sys.c和sys.h到KEY和LED,

分别修改文件名为key.c、key.h、led.c、led.h。利用分组管理实现温度报警5、Project设置(1)双击Temperature_Alarm,打开工程;(2)HARDWARE——右键——AddExistingFilestoGroupHARDWARE(添加已存在的文件到HARDWARE组);(3)在“查找范围”项找到KEY,选择key.c,点击Add按钮,将该文件添进来;(4)在“查找范围”项找到LED,选择led.c,点击Add按钮,将该文件添进来;(5)点击“Close”,结束文件添加。利用分组管理实现温度报警6、包含路径设置(1)点击options选项(魔术棒)按钮,进入options设置页;(2)进入C/C++页;(3)找到:IncludePaths(包含路径);(4)点击省略号“…”按钮,进入包含文件设置页。利用分组管理实现温度报警(5)在FolderSetup(文件夹设置)页,点New(Insert)(新增)和随后出现的“…”;(6)将HARDWARE文件夹下的KEY和LED文件夹选进来,这样,才可以让编译器找到led.h和key.h文件;(7)完成后点OK,退出Options设置。利用分组管理实现温度报警7、按键初始化程序编辑与调试(1)key.c1)打开key.c,删除全部内容。2)第一行加入语句:#include“key.h”3)将main.c文件中的函数

GPIOA_Init()复制到key.c。4)修改函数名为:

KEY_Init()(见第3行)。5)开启GPIOA和GPIOE时钟(第5、6行)6)对4个按键进行初始化(第8~16行)按照电路,PA0应设置为下拉(第10行),PE2、PE3、PE4应设置为上拉(15行)。此外第13行利用了“或”操作符“|”,这样可以同时对多个引脚进行操作。7)编辑完成后,对照以上程序仔细检查。8)对key.c进行编译操作。如果无错,就可以在Project窗口中的key.c前面看到“+”号。9)点击“+”号,展开后可以就可以找到key.h。利用分组管理实现温度报警(2)key.h1)打开key.h文件,编辑内容如下。利用分组管理实现温度报警2)key.h中的第5行到第8行,直接剪切自main.c,为四个管腿起名。3)第10行,则声明了函数KEY_Init()。4)由于5~8行的定义中使用了位操作,第3行还声明包含文件sys.h。5)第1行和最后一行的意思是:如果不曾定义符号_KEY_H(#ifndef_KEY_H),则做后面的内容,直到#endif,即做第2~10行的内容(定义符号_KEY_H(#define_KEY_H)等。否则,即如果已经定义过此符号,则不再做2~10行的内容,以免重复定义。最后的#endif代表结束第一行的ifndef。符号_KEY_H由文件名key.h演化而来,不一定非要是这个符号,但必须唯一。(3)文件分工“key.c”文件主要用于编写按键初始化子函数。“key.c”文件的开头应声明:#include“key.h”。“key.h”文件主要用于按键定义、并对key.c中的函数进行声明。“key.h”文件还用于声明按键初始化函数需要包含的其它头文件(例如sys.h)利用分组管理实现温度报警利用分组管理实现温度报警8、LED初始化程序设计与调试设计思路与按键初始化相同。(1)led.c第6~8行不仅使用了“或”操作符“|”,还使用了“换行连接”操作符“\”。这可以使一行不那么长。利用分组管理实现温度报警(1)led.h文件利用分组管理实现温度报警9、主程序设计与调试第3行和第4行:声明包含key.h和led.h。这两个文件分别声明了KEY_Init()和LED_Init()函数,这样,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论