ManageProjectIteProjeet ItunsFolders/ExtensiomsBooksX++日X++日X+PoiedtTavoetsCmrTapet双击可修改新建删除Add FieaAdd Fles.as hCanealHal按下Options for Target”|按钮,选择“Output”选项卡,将Nameof Executable改为KEYWOptionsa EDutpuListine|UserIcC+AsnLinker Debug |utilities]Devic TargetSelect Folder for Obiects.Name of Executable:LEDCreate Executable:lObjectsVLEDCreate Batch FleDebug HfomationCreate HEX FleBrowseHfomatiorCCreateLibrary.VObjects\LEDbOKCancelDefaultsHelp然后在HARDWARE文件夹下新建一个BEEP文件夹,用来存放与蜂鸣器相关的代码。再新建-个KEY文件夹,用来存放于按键相关的代码首先添加蜂鸣器有关代码,我们打开USER文件夹下的KEY.uvprojx工程,按暂按钮新建一个文件,然后保存在HARDWARE→BEEP文件夹下面,保存为beep.C。在该文件中输入如下代码#include"beep.h"//初始化PB8为输出口.并使能这个口的时钟//LEDIO初始化voidBEEP_Init(void)GPIO_InitTypeDefGPIOInitStructure;RCCAPB2PeriphClockCmd(RCCAPB2PeriphGPIOB,ENABLE):GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//BEEP-->GPIOB.8端配置GPIO_InitStructure.GPIOMode=GPIOMode_OutPP:1/推挽输出GPI0InitStructure.GPI0Speed=GPI0Speed50MHz;//速度为50OMHzGPIO_Init(GPIOB,&GPIOInitStructure)://根据参数初始化GPIOB.8GPIOResetBits(GPIOB,GPIO_Pin_8)://输出0,关闭蜂鸣器输出保存beep.c代码,然后我们按同样的方法,新建一个beep.h文件,也保存在BEEP文件夹
按下 Options for Target” 按钮,选择“Output”选项卡,将 Name of Executable 改为 KEY 然后在 HARDWARE 文件夹下新建一个 BEEP 文件夹,用来存放与蜂鸣器相关的代码。再新建一 个 KEY 文件夹,用来存放于按键相关的代码 首先添加蜂鸣器有关代码,我们打开 USER 文件夹下的 KEY.uvprojx 工程,按 按钮新建一个 文件,然后保存在 HARDWARE→BEEP 文件夹下面,保存为 beep.c。在该文件中输入如下代码 #include "beep.h" //初始化 PB8 为输出口.并使能这个口的时钟 //LED IO 初始化 void BEEP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //BEEP->GPIOB.8 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速 度 为 50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化 GPIOB.8 GPIO_ResetBits(GPIOB,GPIO_Pin_8); //输出 0,关闭蜂鸣器输出 } 保存 beep.c 代码,然后我们按同样的方法,新建一个 beep.h 文件,也保存在BEEP 文件夹
下面。在beep.h中输入如下代码:#ifndefBEEPH#define_BEEP_H#include"sys.h"//蜂鸣器端口定义#defineBEEPPBout(8)//BEEP蜂鸣器接口//初始化void BEEP_Init(void);#endif将beep.h也保存。接着,我们把beep.c加入到HARDWARE这个组里面,这一次我们通过双击的方式来增加新的.c文件,双击HARDWARE,找到beep.c,加入到HARDWARE里面。可以看到HARDWARE文件夹里面多了一个beep.c的文件,然后还是用老办法把beep.h头文件所在的路径加入到工程里面。添加完蜂鸣器代码后我们继续添加按键的代码,使用同样的操作新建key.c和key.h并放在KEY文件夹下面。在key.c中输入如下代码:#include"key.h"#include"sys.h"#include"delay.h"1按键初始化函数voidKEYInit(void)/IO初始化GPIOInitTypeDefGPIOInitStructureRCC_APB2PeriphClockCmd(RCC_APB2PeriphGPIOA/RCC_APB2Periph_GPIOE,ENABLE)使能PORTA.PORTE时钟//GPIOE.3~4GPIO InitStructure.GPIOPin=GPIOPin 3JGPIO_Pin 4,1/设置成上拉输入GPIOInitStructure.GPIOMode=GPIOMode IPU;初始化GPIOE34GPIOInit(GPIOE&GPIOInitStructure),//初始化WKUP-->GPIOA.0GPIOInitStructure.GPIOPin=GPIOPinOGPIOInitStructure.GPIOMode=GPIOModeIPD/PAO设置成输入,下拉GPIOInit(GPIOA,&GPIOInitStructure);初始化GPIOA.0/按键处理函数1/返回按键值//mode:0,不支持连续按,1,支持连续按/O,没有任何按键按下/1,KEYO按下1/2,KEY1按下1/3,KEY3按下WKUPu8KEYScan(u8mode)staticu8keyup=1;J/按键按松开标志if(mode)keyup=1,//支持连按if(key_up&&(KEY0--0|KEY1-0//WK_UP-=1)delay_ms(10);//去抖动key up=0;if(KEYO--O)returnKEYO PRESelse if(KEYI--0)returnKEY1PRESelseif(WKUP--1)returnWKUPPRESfelseif(KEY0--1&&KEY1=-1&&WKUP--0)key_up-1;
下面。在 beep.h 中输入如下代码: #ifndef _BEEP_H #define _BEEP_H #include "sys.h" //蜂鸣器端口定义 #define BEEP PBout(8) // BEEP,蜂鸣器接口 void BEEP_Init(void); //初始化 #endif 将 beep.h 也保存。接着,我们把 beep.c 加入到 HARDWARE 这个组里面,这一次我们通过双 击的方式来增加新的.c 文件,双击 HARDWARE,找到 beep.c,加入到 HARDWARE 里面。可以看 到 HARDWARE 文件夹里面多了一个 beep.c 的文件,然后还是用老办法把 beep.h 头文件所在的路 径加入到工程里面。 添加完蜂鸣器代码后我们继续添加按键的代码,使用同样的操作新建 key.c 和 key.h 并放在 KEY 文件夹下面。在 key.c 中输入如下代码: #include "key.h" #include "sys.h" #include "delay.h" //按键初始化函数 void KEY_Init(void) //IO初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOE,ENABLE); //使能PORTA,PORTE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //GPIOE.3~4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入 GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE3,4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化WK_UP->GPIOA.0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,下拉 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.0 } //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //0,没有任何按键按下 //1,KEY0按下 //2,KEY1按下 //3,KEY3按下WK_UP u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES; }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
returnO:ll无按键按下L在key.h中输入以下代码:#ifndefKEYH#defineKEYH#include"sys.h"#defineKEYOGPIOReadlnputDataBit(GPIOE.GPIOPin4)//读取按键0#defineKEY1GPIO_ReadlnputDataBit(GPIOEGPIO_Pin_3)//读取按键1#defineWK_UPGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)/读取按键3(WK_UP)1I/KEYO按下#defineKEYOPRES/KEY1按下#defineKEY1PRES2#defineWKUPPRES3I/KEYUP按下(即WKUP/KEYUP)voidKEY_Init(void);/IO初始化u8KEY_Scan(u8):1/按键扫描函数#endif最后我们回到main函数,并编写如下代码:#include"led.h"#include"delay.h"#include"key.h"#include"sys.h"#include"beep.h"int main(void)3vu8 key=0,I延时函数初始化delay_init(),LED InitO);//初始化与LED连接的硬件接口BEEPInitO,1/初始化蜂鸣器端口1/初始化与按键连接的硬件接口KEY_Init),LED0=0;川先点亮红灯while(1)key=KEY_Scan(O),/得到键值if(key)-switch(key)21/控制蜂鸣器caseWKUP PRES:BEEP=IBEEP,break,caseKEY1PRES:I/控制LED1翻转LEDI=ILED1;break,caseKEYO_PRES://同时控制LEDO,LED1翻转LEDO-ILEDO;LEDI=ILED1;break
return 0;// 无按键按下 } 在 key.h 中输入以下代码: #ifndef _KEY_H #define _KEY_H #include "sys.h" #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键 0 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键 1 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键 3(WK_UP) #define KEY0_PRES 1 //KEY0 按下 #define KEY1_PRES 2 //KEY1 按下 #define WKUP_PRES 3 //KEY_UP 按下(即 WK_UP/KEY_UP) void KEY_Init(void);//IO 初始化 u8 KEY_Scan(u8); //按键扫描函数 #endif 最后我们回到 main 函数,并编写如下代码: #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "beep.h" int main(void) { vu8 key=0; delay_init(); //延时函数初始化 LED_Init(); //初始化与 LED 连接的硬件接口 BEEP_Init(); //初始化蜂鸣器端口 KEY_Init(); //初始化与按键连接的硬件接口 LED0=0; //先点亮红灯 while(1) { key=KEY_Scan(0); //得到键值 if(key) { switch(key) { case WKUP_PRES: //控制蜂鸣器 BEEP=!BEEP; break; case KEY1_PRES: //控制 LED1 翻转 LED1=!LED1; break; case KEY0_PRES: //同时控制 LED0,LED1 翻转 LED0=!LED0; LED1=!LED1; break; }
Jelsedelay_ms(10);主函数代码比较简单,先进行一系列的初始化操作,然后在死循环中调用按键扫描函数KEY_ScanO扫描按键值,最后根据按键值控制LED和蜂鸣器的翻转。c)编译并下载和上一个跑马灯实验一样,按Build编译工程,编译成功后显示没有错误和警告,并且在OBJ目录下面生成了hex文件(KEY.hex)。将USB转MINIUSB线一端连接计算机,一端连接开发板USB232端口(USB转串口),打开开发板电源开关,开发板上PWR指示灯会亮,表示电源接通。打开上位机软件flymcu,点击菜单栏的搜索串口,自动找到CH340虚拟串口,波特率设置为460800,然后选择上一步编译生成的Hex文件(KEY.hex),并进行如图所示设置后,点击“开始编程”下载代码到开发板,即可看到程序运行的结果。OXFlyMcuV0.188--单片机在线编程专家--www.mcuisp.com系统(X)帮助M)Language搜素串口(M)Port:coM3bps:76800www.mcuisp.com编程器()关于(z).联机下载时的程序文件:编程前重装文件C:Users/Administrator/Desktop/TemplatelOBJITemplate.hex国手持万用编程器STMISP免费STMIAPNXPISPEP968_RS232凤栋哈编程后执行开始编程(P)使用Ramisp连续烧录模式读器件信息(R)清除芯片(2)读FLASH选项字节区:圆编程到FLASH时写选项字节设定选项字节等DTR的低电平复位,RTS高电平进BootLoader
}else delay_ms(10); } } 主函数代码比较简单,先进行一系列的初始化操作,然后在死循环中调用按键扫描函数 KEY_Scan() 扫描按键值,最后根据按键值控制 LED 和蜂鸣器的翻转。 c) 编译并下载 和上一个跑马灯实验一样,按 Build 编译工程,编译成功后显示没有错误和警告,并且在 OBJ 目录下面生成了 hex 文件(KEY.hex)。 将 USB 转 MINIUSB 线一端连接计算机,一端连接开发板 USB_232 端口(USB 转串口),打开 开发板电源开关,开发板上 PWR 指示灯会亮,表示电源接通。 打开上位机软件 flymcu,点击菜单栏的搜索串口,自动找到 CH340 虚拟串口,波特率设置为 460800,然后选择上一步编译生成的 Hex 文件(KEY.hex),并进行如图所示设置后,点击 “开始编 程”下载代码到开发板,即可看到程序运行的结果
六、实验结果画出跑马灯和按键实验程序流程图,并写出结果,七、思考题1.STM32系列产品命名规则是什么,以STM32F103ZET6为例进行说明2.推挽式输出和开漏输出有什么区别?3.LED灯在端口输出为高还是低的状态下会亮,蜂鸣器在端口输出为高还是低的状态下会响?
六、实验结果 画出跑马灯和按键实验程序流程图,并写出结果。 七、思考题 1. STM32 系列产品命名规则是什么,以 STM32F103ZET6 为例进行说明 2. 推挽式输出和开漏输出有什么区别? 3. LED 灯在端口输出为高还是低的状态下会亮,蜂鸣器在端口输出为高还是低的状 态下会响?