Experimento de sistema integrado: [placa de desarrollo Xuanwu F103] enciende secuencialmente 4 luces pequeñas y 4 luces pequeñas en dos modos de iluminación, y usa KEY1 para controlar el cambio de modos de iluminación

1. Propósito del experimento

Hay dos modos de iluminación para encender secuencialmente 4 luces pequeñas y 4 luces pequeñas, y puede usar KEY1 para cambiar el modo de iluminación.

2. Experimentar ideas:

(1) Ejemplo de análisis del programa

#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. Pasos para escribir o leer datos en un registro de puerto de GPIO:

① Abra el registro de activación del reloj del puerto de control (GPIOx) (los GPIO están todos en APB2), use RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
② para seleccionar el pin GPIO, use GPIO_InitStructure.GPIO_Pin = GPIO_Pin_y;
③ para configurar la velocidad y el estado de funcionamiento del pin seleccionado
②``③use los parámetros establecidos para GPIO_Init(GPIOx, &GPIO_InitStructure);inicializar el Registro GPIOx

2.GPIO_Escribir

Escriba datos en el registro ODR de todos los pines GPIO a la vez ( GPIO_WriteBitentonces solo escriba en el registro ODR del pin especificado a la vez (solo escriba un bit a la vez))

3. Controla las luces intermitentes

Establezca el modo de trabajo del pin PB5 de GPIOB en salida push-pull, luego, cuando el valor de PB5 de GPIO (correspondiente al código de muestra GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5) sea 1, el nivel de LED0 es alto y la luz pequeña está apagada, de lo contrario LED0 Está encendido.

	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);
	}			

inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

(2) Realice el encendido simultáneo de 4 luces pequeñas (este papel controla PB5, PB6, PB7, PB10)

(PD: PB8 es un zumbador, no use ese pin)
(Use un cable, conecte estos cuatro pines con el cable correspondiente a la luz pequeña)

De acuerdo con el principio de encender la luz pequeña en PB5, solo necesita inicializar los parámetros correspondientes de los pines correspondientes a PB6, PB7 y PB10, y luego configurar los bits correspondientes de estos pines en Solo configúrelo en 1. el código se muestra a continuación:

#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);
	}			
}

(3) Realice la iluminación secuencial de 4 luces pequeñas (linterna giratoria)

El principio es el mismo que el anterior, solo necesita dejar una pequeña luz en secuencia cada vez que apaga las luces pequeñas, el código es el siguiente: pd:
Cada vez que se enciende la luz, debido al método utilizado GPIO_Write, también apaga otras luces al mismo tiempo otras lámparas (de 4 lámparas)

#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);
	}			
}

(4) Use KEY1 para controlar el cambio de los dos modos de iluminación anteriores

Debido al diagrama de circuito de KEY1 que se muestra en la figura a continuación, si el PE3 correspondiente a KEY1 es una entrada desplegable, el nivel en KEY1 no cambiará si se presiona KEY1 o no, lo cual no tiene sentido. Por lo tanto, configure PE3 como entrada pull-up, luego, cuando se presiona KEY1, el nivel en KEY1 es bajo y el IDR correspondiente de PE3 es 0, de lo contrario es 1, y juzgue si KEY1 está presionado o no.
inserte la descripción de la imagen aquí
Use GPIO_ReadInputDataBitel método para leer los datos IDR de PE3 y establezca el modo de trabajo de PE3 en entrada pull-up, de modo que el código que cumpla con los requisitos se diseñe de la siguiente manera:

#include "stm32f10x.h"
#include<stdio.h>
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

Supongo que te gusta

Origin blog.csdn.net/weixin_52111404/article/details/129610623
Recomendado
Clasificación