stm32学习记录——扫码开锁

目录

usart.c

硬件连接

百度网盘源码


我用的是串口通信的扫码模块,他可以识别二维码的内容直接通过串口发送给单片机。

用到的模块有扫码模块,继电器,电子锁。

实质就是扫码模块扫码将码的内容通过串口传输给单片机做判断,识别到码的内容再控制继电器的开关,继电器进一步控制电子锁。

单片机判断这一步其实都是串口代码

usart.c

#include "config.h"
#include "Usart.h"

u8 USART_RxBUF[USART_RXBUF_SIZE];
u16 USART1_RecPos=0;


void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
	
	
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
		
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
		
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	
	USART_InitStructure.USART_BaudRate=USART_BAUD;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	
	USART_Init(USART1,&USART_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	USART_Cmd(USART1,ENABLE);
	USART_ClearFlag(USART1,USART_FLAG_TC);
	
}
void UsartSendByte(USART_TypeDef* USARTx,u8 ch)
{
	USART_SendData(USARTx,(u16)ch);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
void UsartSendString(USART_TypeDef*USARTx,u8*str)
{
	u32 pos=0;
	while(*(str+pos)!='\0')
	{
		UsartSendByte(USARTx,*(str+pos));
		pos++;
	}
	
}
int fputc(int ch,FILE*f)
{
	USART_SendData(USART1,(u16)ch);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
	return (ch);
	
}
void USART1_IRQHandler(void)
{
	u8 RecCh;
	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
	{
		USART1RecTimer=10;
		RecCh= (u8)USART_ReceiveData(USART1);
		USART_RxBUF[USART1_RecPos++]=RecCh;
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
	
	
}
unsigned char USRET1_RecProcess(void)
{
	if(USART1RecTimer)return FALSE;
	if(!USART1_RecPos)return FALSE;
	USART_RxBUF[USART1_RecPos++]='\0';
	
	if(strstr((char *)USART_RxBUF,"码的内容")!=NULL)
	{
		relay_off();
		SysTickDelayMs(200);
		relay_on();
	}
	memset(USART_RxBUF,0,USART_RXBUF_SIZE);
	USART1_RecPos=0;
	return TRUE;
}

设置判断和控制继电器的函数

unsigned char USRET1_RecProcess(void)
{
	if(USART1RecTimer)return FALSE;
	if(!USART1_RecPos)return FALSE;
	USART_RxBUF[USART1_RecPos++]='\0';
	
	if(strstr((char *)USART_RxBUF,"码的内容")!=NULL)
	{
		relay_off();
		SysTickDelayMs(200);
		relay_on();
	}
	memset(USART_RxBUF,0,USART_RXBUF_SIZE);
	USART1_RecPos=0;
	return TRUE;
}

设置码的内容可以下载一个二维码生成器。

硬件连接

扫码模块的rx——单片机PA9

扫码模块的tx——单片机PA10

继电器IN——PB7

百度网盘源码

最后奉上我调试时用的代码。

链接:https://pan.baidu.com/s/1J5sy5ldL1jGp90VrwaHSAA 
提取码:9438

猜你喜欢

转载自blog.csdn.net/sujiaxin12/article/details/123762236
今日推荐