基于STM32电子密码锁

基于STM32电子密码锁

(程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.正确输入密码前提下,开锁并有正确提示;

2.错误输入密码情况下,蜂鸣器报警并短暂锁定键盘;

3.密码可以根据用户需要更改;

4.为防止误操作,更改密码需有两次确认;

5.输出密码错误三次锁死键盘;

6.密码掉电保存功能;

添加图片注释,不超过 140 字(可选)

程序

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "sys.h"
#include "delay.h"
#include "lcd.h"
#include "led.h"
#include "usart.h"
#include "dht11.h"
#include "key.h"
#include "beep.h"
#include <stdio.h>
#include "stmflash.h"
#include "timer.h"
#include "exit.h"
#define ADDR_hum_up_1  0X0800b000
#define ADDR_hum_up_2  0X0800c000
int key=0;
int j=0;
u8 k1_flag=1;
u8 k2_flag=1;
u8 k3_flag=1;
u8 k4_flag=1;
int setpass_flag11=1;//标识正在设置密码,继电器不关闭
int err3_flag=1;
int i=0;
int djtime_flag=360;
int down_flag=0;
static u8 key_up=1;//不支持连按
u8 open_flag=1;//用于标识是否是系统的第一次打开u8 pass_shuru=0;u8 setpassword_flag=0;
u8 setopen_flag=1;//用于标识开机之后是否打开过
u8 setpass_flag=0;//当密码设置成功之后的标志位
u8 err_flag=0;//输出错误次数记录标志位
u8 errtime_flag=0;//用于错误之后延时并重置屏幕的标志位
u8 beep_flag=1;//用于标识当按键按下,蜂鸣器滴一声的时间
u8 password[]={9,9,9,9,9,9};;//记录输入的密码
u8 setpassword1[6]={1,1,1,1,1,1};//设置密码的存放位置
u8 setpassword2[6];//设置密码的存放位置static u8 ok_flag=0;//记录每次判断密码有几位正确
u8 flag16=1;//标志按键16是第几次按下,做相应的动作u8 cspassword[]={0,0,0,0,0,0};
u8 cjpassword[]={1,3,1,4,2,0};u8 table0[]="===Coded Lock===";
u8 table1[]="password:       ";
u8 table2[]="      open      ";
u8 table3[]="      error     ";
u8 table4[]="SetNewWordEnable";
u8 table5[]="input again     ";
u8 table6[]="ResetPassword OK";
u8 flash1[]={0};
u8 flash2[]={1,0,0,0,0,0};void show1(void){LCD1602_Show_dat(0,1,table1[0]);LCD1602_Show_dat(1,1,table1[1]);LCD1602_Show_dat(2,1,table1[2]);LCD1602_Show_dat(3,1,table1[3]);LCD1602_Show_dat(4,1,table1[4]);LCD1602_Show_dat(5,1,table1[5]);LCD1602_Show_dat(6,1,table1[6]);LCD1602_Show_dat(7,1,table1[7]);LCD1602_Show_dat(8,1,table1[8]);LCD1602_Show_dat(9,1,table1[9]);for(j=0;j<i;j++){LCD1602_Write_Dat('*');}for(j=0;j<6-i;j++){LCD1602_Write_Dat(' ');}} void show2(void){LCD1602_Show_dat(0,1,table2[0]);LCD1602_Show_dat(1,1,table2[1]);LCD1602_Show_dat(2,1,table2[2]);LCD1602_Show_dat(3,1,table2[3]);LCD1602_Show_dat(4,1,table2[4]);LCD1602_Show_dat(5,1,table2[5]);LCD1602_Show_dat(6,1,table2[6]);LCD1602_Show_dat(7,1,table2[7]);LCD1602_Show_dat(8,1,table2[8]);LCD1602_Show_dat(9,1,table2[9]);LCD1602_Show_dat(0xa,1,table2[10]);LCD1602_Show_dat(0xb,1,table2[11]);LCD1602_Show_dat(0xc,1,table2[12]);LCD1602_Show_dat(0xd,1,table2[13]);LCD1602_Show_dat(0xe,1,table2[14]);LCD1602_Show_dat(0xf,1,table2[15]);}void show3(void){LCD1602_Show_dat(0,1,table3[0]);LCD1602_Show_dat(1,1,table3[1]);LCD1602_Show_dat(2,1,table3[2]);LCD1602_Show_dat(3,1,table3[3]);LCD1602_Show_dat(4,1,table3[4]);LCD1602_Show_dat(5,1,table3[5]);LCD1602_Show_dat(6,1,table3[6]);LCD1602_Show_dat(7,1,table3[7]);LCD1602_Show_dat(8,1,table3[8]);LCD1602_Show_dat(9,1,table3[9]);LCD1602_Show_dat(0xa,1,table3[10]);LCD1602_Show_dat(0xb,1,table3[11]);if(err3_flag==1){LCD1602_Show_dat(0xc,1,table3[12]);LCD1602_Show_dat(0xd,1,table3[13]);LCD1602_Show_dat(0xe,1,table3[14]);LCD1602_Show_dat(0xf,1,table3[15]);}else if(err3_flag==2){LCD1602_Show_dat(0xc,1,0x30+djtime_flag/2/100);LCD1602_Show_dat(0xd,1,0x30+djtime_flag/2/10%10);LCD1602_Show_dat(0xe,1,0x30+djtime_flag/2%10);LCD1602_Show_dat(0xf,1,'s');}}void show4(void){LCD1602_Show_dat(0,1,table4[0]);LCD1602_Show_dat(1,1,table4[1]);LCD1602_Show_dat(2,1,table4[2]);LCD1602_Show_dat(3,1,table4[3]);LCD1602_Show_dat(4,1,table4[4]);LCD1602_Show_dat(5,1,table4[5]);LCD1602_Show_dat(6,1,table4[6]);LCD1602_Show_dat(7,1,table4[7]);LCD1602_Show_dat(8,1,table4[8]);LCD1602_Show_dat(9,1,table4[9]);LCD1602_Show_dat(0xa,1,table4[10]);LCD1602_Show_dat(0xb,1,table4[11]);LCD1602_Show_dat(0xc,1,table4[12]);LCD1602_Show_dat(0xd,1,table4[13]);LCD1602_Show_dat(0xe,1,table4[14]);LCD1602_Show_dat(0xf,1,table4[15]);}void show5(void){LCD1602_Show_dat(0,1,table5[0]);LCD1602_Show_dat(1,1,table5[1]);LCD1602_Show_dat(2,1,table5[2]);LCD1602_Show_dat(3,1,table5[3]);LCD1602_Show_dat(4,1,table5[4]);LCD1602_Show_dat(5,1,table5[5]);LCD1602_Show_dat(6,1,table5[6]);LCD1602_Show_dat(7,1,table5[7]);LCD1602_Show_dat(8,1,table5[8]);LCD1602_Show_dat(9,1,table5[9]);LCD1602_Show_dat(0xa,1,table5[10]);LCD1602_Show_dat(0xb,1,table5[11]);LCD1602_Show_dat(0xc,1,table5[12]);LCD1602_Show_dat(0xd,1,table5[13]);LCD1602_Show_dat(0xe,1,table5[14]);LCD1602_Show_dat(0xf,1,table5[15]);}void show6(void){LCD1602_Show_dat(0,1,table6[0]);LCD1602_Show_dat(1,1,table6[1]);LCD1602_Show_dat(2,1,table6[2]);LCD1602_Show_dat(3,1,table6[3]);LCD1602_Show_dat(4,1,table6[4]);LCD1602_Show_dat(5,1,table6[5]);LCD1602_Show_dat(6,1,table6[6]);LCD1602_Show_dat(7,1,table6[7]);LCD1602_Show_dat(8,1,table6[8]);LCD1602_Show_dat(9,1,table6[9]);LCD1602_Show_dat(0xa,1,table6[10]);LCD1602_Show_dat(0xb,1,table6[11]);LCD1602_Show_dat(0xc,1,table6[12]);LCD1602_Show_dat(0xd,1,table6[13]);LCD1602_Show_dat(0xe,1,table6[14]);LCD1602_Show_dat(0xf,1,table6[15]);}
void mound(void)
{			if(open_flag==1){show1();}else if(open_flag==2){show2();}else if(open_flag==3){show3();}else if(open_flag==4){show4();}else if(open_flag==5){show5();}else if(open_flag==6){show6();}if(key!=240 &&key_up==1){GPIO_SetBits(GPIOC,GPIO_Pin_13);//delay_ms(20);GPIO_ResetBits(GPIOC,GPIO_Pin_13);//key_up=0;if(key>=0 && key<=9){if(pass_shuru==0){if(i==0){password[0]=1;password[1]=3;password[2]=1;password[3]=4;password[4]=2;password[5]=0;}password[i]=key;		i++;}else if(pass_shuru==1){if(i==0){password[0]=1;password[1]=3;password[2]=1;password[3]=4;password[4]=2;password[5]=0;}open_flag=1;setpassword1[i]=key;i++;}else if(pass_shuru==2){if(i==0){password[0]=1;password[1]=3;password[2]=1;password[3]=4;password[4]=2;password[5]=0;}open_flag=1;setpassword2[i]=key;if(key==setpassword1[i]){ok_flag++;}i++;}}if(key==13){TIM_Cmd(TIM2, DISABLE);//手动关闭继电器GPIO_ResetBits(GPIOB,GPIO_Pin_0);open_flag=1;pass_shuru=0;}if(key==14){		if(i!=0){i--;}}if(key==15){if(i==6){if(pass_shuru==0){if(setpass_flag==1){for(i=0;i<6;i++){if(password[i]==setpassword1[i]){ok_flag++;}}i=0;
//							LCD1602_Show_dat(0,0,0x30+ok_flag/10);
//							LCD1602_Show_dat(1,0,0x30+ok_flag%10);if(ok_flag==6){						open_flag=2;ok_flag=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM2, ENABLE);  //使能TIMxsetopen_flag=2;err_flag=0;}else{ok_flag=0;for(i=0;i<6;i++){if(password[i]==cjpassword[i]){ok_flag++;}}i=0;if(ok_flag==6){open_flag=2;ok_flag=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM2, ENABLE);  //使能TIMxsetopen_flag=2;err_flag=0;}else{open_flag=3;ok_flag=0;err_flag++;if(err_flag<3){GPIO_SetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM4, ENABLE);  //使能TIMx}else if(err_flag==3){TIM_Cmd(TIM4, ENABLE);err3_flag=2;}}}}else{for(i=0;i<6;i++){if(password[i]==cspassword[i]){ok_flag++;}}i=0;//				  LCD1602_Show_dat(0,0,0x30+ok_flag/10);//	        LCD1602_Show_dat(1,0,0x30+ok_flag%10);if(ok_flag==6){open_flag=2;ok_flag=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM2, ENABLE);  //使能TIMxsetopen_flag=2;err_flag=0;  }else{ok_flag=0;for(i=0;i<6;i++){if(password[i]==cjpassword[i]){ok_flag++;}}i=0;if(ok_flag==6){open_flag=2;ok_flag=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM2, ENABLE);  //使能TIMxsetopen_flag=2;err_flag=0;}else{open_flag=3;ok_flag=0;err_flag++;if(err_flag<3){GPIO_ResetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM4, ENABLE);  //使能TIMx}else if(err_flag==3){TIM_Cmd(TIM4, ENABLE);err3_flag=2;}}}}}}else{i=0;open_flag=3;ok_flag=0;err_flag++;if(err_flag<3){GPIO_SetBits(GPIOC,GPIO_Pin_13);//TIM_Cmd(TIM4, ENABLE);  //使能TIMx}else if(err_flag==3){TIM_Cmd(TIM4, ENABLE);err3_flag=2;}}}if(key==16){if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)){			setpass_flag11=2;if(flag16==1){open_flag=4;pass_shuru=1;flag16=2;i=0;}else if(flag16==2){			open_flag=5;pass_shuru=2;flag16=3;i=0;}else if(flag16==3){i=0;if(ok_flag==6){setpass_flag=1;flash1[0]=setpass_flag;STMFLASH_Write(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));for(j=0;j<6;j++){flash2[j]=setpassword1[j];}STMFLASH_Write(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));j=0;open_flag=6;ok_flag=0;TIM_Cmd(TIM2, ENABLE);  //使能TIMx}else{open_flag=3;ok_flag=0;TIM_Cmd(TIM4, ENABLE);  //使能TIMx			}flag16=0;pass_shuru=0;setpass_flag11=1;GPIO_ResetBits(GPIOB,GPIO_Pin_0);}}}}}//void KEY_Scan(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。
{GPIO_ResetBits(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);GPIO_ResetBits(GPIOA,GPIO_Pin_8);if(P5==1 && P6==1 && P7==1&& P8==1){key=240;key_up=1;}else if(key_up==1&&(P5==0 ||  P6==0 || P7==0 || P8==0)){GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_13);if(P5==0 ||  P6==0 || P7==0 || P8==0)  //如果PA8.15.14.13全为0,则没有键按下。此时,返回值为-1.{if(P8==0){key=1;}else if(P7==0){key=2;}else if(P6==0){key=3;}else if(P5==0){key=11;}}GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_15);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_14);if(P5==0 ||  P6==0 || P7==0 || P8==0)  //如果PA8.15.14.13全为0,则没有键按下。此时,返回值为-1.{if(P8==0){key=4;}else if(P7==0){key=5;}else if(P6==0){key=6;}else if(P5==0){key=12;}}GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_15);if(P5==0 ||  P6==0 || P7==0 || P8==0)  //如果PA8.15.14.13全为0,则没有键按下。此时,返回值为-1.{if(P8==0){key=7;}else if(P7==0){key=8;}else if(P6==0){key=9;}else if(P5==0){key=13;}}GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_15);GPIO_ResetBits(GPIOA,GPIO_Pin_8);if(P5==0 ||  P6==0 || P7==0 || P8==0)  //如果PA8.15.14.13全为0,则没有键按下。此时,返回值为-1.{if(P8==0){key=14;}else if(P7==0){key=0;}else if(P6==0){key=15;}else if(P5==0){key=16;}}}}int main(void)
{BEEP_Init();LED_Init();delay_init();  LCD1602_Init();KEY_Init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级TIM2_Int_Init(4999,7199);TIM3_Int_Init(29,35999);TIM4_Int_Init(4999,7199);//每500ms计算一次速度的值,并显示LCD1602_Show_dat(0,0,table0[0]);LCD1602_Show_dat(1,0,table0[1]);LCD1602_Show_dat(2,0,table0[2]);LCD1602_Show_dat(3,0,table0[3]);LCD1602_Show_dat(4,0,table0[4]);LCD1602_Show_dat(5,0,table0[5]);LCD1602_Show_dat(6,0,table0[6]);LCD1602_Show_dat(7,0,table0[7]);LCD1602_Show_dat(8,0,table0[8]);LCD1602_Show_dat(9,0,table0[9]);LCD1602_Show_dat(0xa,0,table0[10]);LCD1602_Show_dat(0xb,0,table0[11]);LCD1602_Show_dat(0xc,0,table0[12]);LCD1602_Show_dat(0xd,0,table0[13]);LCD1602_Show_dat(0xe,0,table0[14]);LCD1602_Show_dat(0xf,0,table0[15]);
//	flash1[0]=100;
//STMFLASH_Write(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));
//STMFLASH_Write(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));TIM_Cmd(TIM3, ENABLE);STMFLASH_Read(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));setpass_flag=flash1[0];STMFLASH_Read(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));for(j=0;j<6;j++){setpassword1[j]=flash2[j];}j=0;open_flag=1;pass_shuru=0;while(1){mound();if(down_flag==2){GPIO_ResetBits(GPIOC,GPIO_Pin_13);}if(down_flag==5){down_flag=0;if(setpass_flag11==2){TIM_Cmd(TIM2, DISABLE);}else{			open_flag=1;pass_shuru=0;GPIO_ResetBits(GPIOC,GPIO_Pin_13);TIM_Cmd(TIM2, DISABLE);GPIO_ResetBits(GPIOB,GPIO_Pin_0);}}if(errtime_flag==2){GPIO_ResetBits(GPIOC,GPIO_Pin_13);}if(errtime_flag==3){GPIO_SetBits(GPIOC,GPIO_Pin_13);}if(errtime_flag==4){GPIO_ResetBits(GPIOC,GPIO_Pin_13);}if(errtime_flag==5){GPIO_SetBits(GPIOC,GPIO_Pin_13);}if(errtime_flag==6){open_flag=1;pass_shuru=0;errtime_flag=0;GPIO_ResetBits(GPIOC,GPIO_Pin_13);TIM_Cmd(TIM4, DISABLE);}}}void TIM2_IRQHandler(void)   //TIM2中断
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中断标志 }down_flag++;}//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 }if(err_flag<3){KEY_Scan();}}
*******//完整资料
****//***微信公众号:木子单片机****///定时器4中断服务程序
void TIM4_IRQHandler(void)   //TIM4中断
{if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志 }if(err3_flag==1){errtime_flag++;}else if(err3_flag==2){TIM_Cmd(TIM3, DISABLE);if(err_flag==3){open_flag=3;djtime_flag--;if(djtime_flag%2==0){GPIO_ResetBits(GPIOC,GPIO_Pin_13);}else{GPIO_SetBits(GPIOC,GPIO_Pin_13);}if(djtime_flag==0){open_flag=1;pass_shuru=0;err_flag=0;djtime_flag=360;TIM_Cmd(TIM4, DISABLE);TIM_Cmd(TIM3, ENABLE);}}}}#include "sys.h"
#include "usart.h"	  
// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif
//	 
/***微信公众号:木子单片机****/
// 	  //
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; }; FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif /*使用microLib的方法*//* 
int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	return ch;
}
int GetKey (void)  { while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));
}
*/#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	  void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE);                    //使能串口1 }void USART1_IRQHandler(void)                	//串口1中断服务程序{u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntEnter();    
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1);	//读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000;	//接收完成了 }else //还没收到0X0D{	if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  }		 }}   		 } 
#if SYSTEM_SUPPORT_OS 	//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntExit();  											 
#endif
} 
#endif	

硬件设计

使用元器件:

单片机:STM32F103C8T6 ;

HRS1H-S-DC5V黄色6腿继电器;

2P蓝色端子;轻触按键;

3mm红色LED;蜂鸣器;

LCD1602液晶屏+16P排座;

8050三极管;3K电阻;

1K电阻;自锁开关;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

02PCB

本系统pcb采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件Keil5 MDK版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

八千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

04设计资料

全部资料包括程序(含注释)、AD原理图、PCB、实物图、任务书、元件清单、结构框图、设计报告、流程图、实物演示视频等。具体内容如下,全网最全! !

添加图片注释,不超过 140 字(可选)

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85986.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端基础知识CSS系列 - 14(CSS提高性能的方法)

一、前言 每一个网页都离不开css&#xff0c;但是很多人又认为&#xff0c;css主要是用来完成页面布局的&#xff0c;像一些细节或者优化&#xff0c;就不需要怎么考虑&#xff0c;实际上这种想法是不正确的 作为页面渲染和内容展现的重要环节&#xff0c;css影响着用户对整个…

判断 NI Package Manager (NIPM) 版本与 LabVIEW 2019 兼容性

​判断依据 1. 查阅 LabVIEW 2019 自述文件 LabVIEW 2019 自述文件中包含系统要求&#xff0c;可通过 NI 官网访问。文件提到使用 NIPM 安装&#xff0c;但未明确最低版本要求&#xff0c;需结合其他信息判断。 2. 参考 NI 官方兼容性文档 NI 官方文档指出 LabVIEW 运行引擎与…

Django 安装指南

Django 安装指南 引言 Django 是一个高级的 Python Web 框架,用于快速开发安全且实用的网站。本文将详细介绍如何在您的计算机上安装 Django,以便您能够开始使用这个强大的工具。 安装前的准备 在开始安装 Django 之前,请确保您的计算机满足以下条件: 操作系统:Django…

Spring MVC参数绑定终极手册:单多参对象集合JSON文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以…

synchronized 做了哪些优化?

Java 中的 synchronized 关键字是保证线程安全的基本机制&#xff0c;随着 JVM 的发展&#xff0c;它经历了多次优化以提高性能。 1. 锁升级机制&#xff08;锁膨胀&#xff09; JDK 1.6 引入了偏向锁→轻量级锁→重量级锁的升级机制&#xff0c;避免了一开始就使用重量级锁&…

三甲医院AI医疗样本数据集分类与收集全流程节点分析(下)

3.3 典型案例分析 —— 以某三甲医院为例 为了更深入地了解三甲医院 AI 医疗样本数据收集的实际情况,本研究选取了具有代表性的某三甲医院作为案例进行详细分析。该医院作为区域医疗中心,在医疗技术、设备和人才方面具有显著优势,同时在医疗信息化建设和 AI 应用方面也进行…

设置程序开机自动启动

在Windows系统中&#xff0c;有几种方法可以将程序设置为开机自动启动。下面我将介绍最常用的三种方法&#xff0c;并提供一个C#实现示例。 方法一&#xff1a;使用启动文件夹&#xff08;最简单&#xff09; 按下 Win R 键打开运行对话框 输入 shell:startup 并回车 将你的…

多源异构数据接入与实时分析:衡石科技的技术突破

在数字化转型的浪潮中&#xff0c;企业每天产生的数据量呈指数级增长。这些数据来自CRM系统、IoT设备、日志文件、社交媒体、交易平台等众多源头&#xff0c;格式各异、结构混乱、流速不一。传统的数据处理方式如同在无数孤立的岛屿间划着小船传递信息&#xff0c;效率低下且无…

JVM——Synchronized:同步锁的原理及应用

引入 在多线程编程的世界里&#xff0c;共享资源的访问控制就像一场精心设计的交通管制&#xff0c;而Synchronized作为Java并发编程的基础同步机制&#xff0c;扮演着"交通警察"的关键角色。 并发编程的核心矛盾 当多个线程同时访问共享资源时&#xff0c;"…

跟着AI学习C# Day26

&#x1f4c5; Day 26&#xff1a;C# 异步编程进阶 ✅ 学习目标&#xff1a; 深入理解 async/await 的底层机制&#xff1b;掌握 ConfigureAwait(false) 的作用与使用场景&#xff1b;避免异步死锁&#xff0c;理解同步上下文&#xff08;Synchronization Context&#xff09…

Scrapy | 通过爬取豆瓣Top250电影信息来学习在中间件中应用随机请求头和代理ip

中间件的使用 1.scrapyl中间件的分类和作用1.1 scrapy中间件的分类1.2 scrapy中间的作用:预处理request和response对象2.下载中间件的使用方法:3.定义实现随机User-Agent的下载中间件3.1 实战:爬取豆瓣Top250电影信息3.2 中间件使用实现随机User-Agent4. 代理ip的使用4.1思路…

【深度学习】深度学习入门:从理论到实践的全面指南

深度学习入门&#xff1a;从理论到实践的全面指南 深度学习&#xff1a;开启人工智能新时代的钥匙一、深度学习的广泛应用场景1.1 改变生活的深度学习应用1.2 行业变革案例深度解析案例一&#xff1a;深度学习检测皮肤癌案例二&#xff1a;移动端OCR技术突破案例三&#xff1a;…

MySQL 数据库操作完整指南

MySQL 数据库操作完整指南 目录 创建数据库 连接数据库 创建表 约束详解 插入数据 查询数据 多表联合查询 连接查询 高级查询 更新数据 删除数据 视图详解 存储过程详解 函数详解 触发器 事务处理 索引优化 安全性管理 备份和恢复 性能优化 删除表和数据库 1. 创建数据库 基…

Java面试复习:面向对象编程、Java 8新特性与Spring

Java面试复习&#xff1a;面向对象编程、Java 8新特性与Spring 面向对象编程 概念解析&#xff1a;面向对象编程&#xff08;OOP&#xff09;是将现实世界中的概念抽象为软件模型的编程范式&#xff0c;包括封装、继承和多态。 核心原理&#xff1a; 封装&#xff1a;通过访…

蓝牙数据通讯,实现内网电脑访问外网电脑

最近突然想到了一个可以绕开单位安全管控软件&#xff0c;让单位内部办公电脑连上外网的方法。大概是这个样子&#xff0c;让单位办公电脑与自己的外网电脑进行蓝牙配对&#xff0c;然后用配对成功的蓝牙进行网络数据交互。这里大家可能会想用一下蓝牙的网络共享功能&#xff0…

硬件面经-具身机器人通用技术要求

目录 简介 场景 技术面试 设计知识点 总结 简介 最近机器人特别的火。所以收集了一些关于机器人的面试及要求 场景 目前具身机器人赛道可谓是十分火热,全国大大小小崛起了几十家具身机器人公司,国外比较出名的有波士顿动力,特斯拉等,国内目前比较火的就是宇树,众擎…

DeepSeek生成HTML5图片拼接工具

让DeepSeek生成一个HTML5图片拼接工具&#xff0c;给的提示词如下 提示词(prompt) 帮我生成一个可以将两张图片拼接到一起的程序 支持横向拼接和竖向拼接&#xff0c;可以用html5实现功能吗&#xff1f; DeepSeek大概20秒左右就做好了&#xff0c;而且像这么简单的功能的话也没…

Java面试复习指南:Java基础、面向对象编程与并发编程

Java面试复习指南&#xff1a;Java基础、面向对象编程与并发编程 1. Java基础 概念解析: Java是一种面向对象的编程语言&#xff0c;具有跨平台的特性。 核心原理: JVM负责Java程序的跨平台运行&#xff0c;通过字节码来实现。 高频面试问题: Java如何实现跨平台&#xff…

LeeCode2566替换一个数字后的最大差值

项目场景&#xff1a; 给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。 请你返回将 num 中 恰好一个 数字进行替换后&#xff0c;得到的最大值和最小值的差为多少。 注意&#xff1a; 当 Danny 将一个数字 d1 替换成另一个数字 …

李宏毅2025《机器学习》第三讲-AI的脑科学

在之前的课程中探讨了如何利用大模型构建AI Agent,本科将暂时放下应用层面的探索,拿起“手术刀”和“显微镜”,深入剖析LLM的“大脑”,带您踏上一场“AI脑神经科学”的旅程。课程不讨论模型的训练过程,而是假设我们拥有一个已经训练好的、功能完备的LLM。我们的目标是:理…