目录
我用的是串口通信的扫码模块,他可以识别二维码的内容直接通过串口发送给单片机。
用到的模块有扫码模块,继电器,电子锁。
实质就是扫码模块扫码将码的内容通过串口传输给单片机做判断,识别到码的内容再控制继电器的开关,继电器进一步控制电子锁。
单片机判断这一步其实都是串口代码
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