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