基于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
英文地址,請注明出處:http://en.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。我們的目標是:理…