嵌入式系统实验——【玄武F103开发板】顺序点亮4小灯和4小灯全亮两种点亮模式、并使用KEY1控制切换点亮模式
创始人
2025-05-29 20:44:04
0

一、实验目的

顺序点亮4小灯和4小灯全亮两种点亮模式、并可以使用KEY1控制切换点亮模式

二、实验思路:

(一)示例程序分析

#include "stm32f10x.h"
typedef unsigned int u32; 
void delay(u32 i)
{while(i--);
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){GPIO_Write(GPIOB, 0x0);delay(0x2FFFFF);GPIO_Write(GPIOB, 0x20);delay(0x2FFFFF);}			
}

1.欲向GPIO的一个端口寄存器写入数据或读出数据的步骤:

①打开这个控制端口(GPIOx)的时钟使能寄存器(GPIO都在APB2),使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
②选中GPIO的管脚,使用GPIO_InitStructure.GPIO_Pin = GPIO_Pin_y;
③设置选中管脚的速率和工作状态
④将②``③设置的参数使用GPIO_Init(GPIOx, &GPIO_InitStructure);初始化GPIOx寄存器

2.GPIO_Write

一次性向所有GPIO管脚的ODR寄存器写入数据(GPIO_WriteBit则一次只写入指定的管脚的ODR寄存器(一次只写一位))

3.控制小灯闪烁

设置GPIOB的PB5管脚工作模式为推挽输出,则GPIO的PB5(对应示例代码中的GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5)的值为1时,LED0的电平为高电平,小灯熄灭,否则LED0点亮。

	while(1){//PB5的ODR为0,点亮GPIO_Write(GPIOB, 0x0);delay(0x2FFFFF);//0x20即为GPIO_Pin_5,0x20对应的二进制数为//0b100000,从右向左数,从第0位开始的第5位为1,//所以下面这行代码的意思就是设置PB5的ODR为1//所以在推挽输出下,LED0为高电平,LED0处小灯熄灭GPIO_Write(GPIOB, 0x20);delay(0x2FFFFF);}			

在这里插入图片描述在这里插入图片描述

(二)实现同时点亮4个小灯(本文控制的为PB5、PB6、PB7、PB10)

(PS:PB8为蜂鸣器,不用那个管脚)
(使用导线,将这四个管脚与小灯对应的导线相连接)

依照点亮PB5处小灯的原理,只需要将PB6、PB7、PB10对应的管脚也进行相应的参数的初始化即可,再在熄灭小灯的语句上,把这几个管脚对应的位设置为1即可。代码如下:

#include "stm32f10x.h"
typedef unsigned int u32; 
void delay(u32 i)
{while(i--);
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){//ps:此处由于向GPIOB所有管脚都写入0,所以只要是上面初始化//过的设置为推挽输出模式的管脚,如果下下条Write语句没有把//对应端口置1,则这样的管脚导线连接的小灯会点亮GPIO_Write(GPIOB, 0x0);delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);}			
}

(三)实现4个小灯顺序点亮(走马灯)

原理同上,只需要在熄灭小灯时每次顺序留下一个小灯不熄灭即可,代码如下:
ps:每次点亮灯的时候,由于使用的GPIO_Write方法,所以还同时熄灭了除此灯以外的其他灯(4个灯中的)

#include "stm32f10x.h"
typedef unsigned int u32; 
void delay(u32 i)
{while(i--);
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){//点亮第1个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);//点亮第2个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);//点亮第3个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_10);delay(0x2FFFFF);//点亮第4个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);delay(0x2FFFFF);}			
}

(四)使用KEY1控制上述两种点亮模式的切换

由于下图所示的KEY1的电路图,所以当KEY1对应的PE3如果为下拉输入,按下KEY1与否,KEY1处电平不改变,无意义。所以设置PE3为上拉输入,那么,当KEY1按下时,KEY1处电平为低电平,对应的PE3的IDR为0,反之为1,据此判断KEY1是否按下。
在这里插入图片描述
使用GPIO_ReadInputDataBit方法读入PE3的IDR的数据,设置PE3的工作模式为上拉输入,因此设计满足要求的代码如下:

#include "stm32f10x.h"
#include
void delay(u32 i)
{while(i--);
}
#define SYSCLK      72000000
void delay_us(unsigned int us)
{SysTick->LOAD = us * (SYSCLK / 1000000) - 1;//SysTick->VAL降为0时的时候,开始启动计时器//因此若其初值为0,则即时启动计时器SysTick->VAL = 0;SysTick->CTRL = (1 << 2) | (1 << 0);while ((SysTick->CTRL & (1 << 16)) == 0);SysTick->CTRL = 0;
}int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);GPIO_InitStructure.GPIO_Pin = 0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOE, &GPIO_InitStructure);	int mode = 0;while(1){//something maybe not  that good// when clicked key1, and press it too long to program go through a if or else block. program will meet// this first if ,and even you haven't press key1 again, mode will change// 只有按钮处于按下状态时才能进入这个if语句执行mode取反if( GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0){mode = ~mode;}//四个灯顺序点亮if(mode){GPIO_Write(GPIOB,  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 );delay(0x2FFFFF);GPIO_Write(GPIOB,  GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_10 );delay(0x2FFFFF);GPIO_Write(GPIOB,  GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_10 );delay(0x2FFFFF);GPIO_Write(GPIOB,  GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 );delay(0x2FFFFF);} //end of second if// 四个灯同时点亮else{GPIO_ResetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 );delay(0x2FFFFF);} //end of else  } //end of while
} //end of main

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...