基于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 字(可選)
點贊分享一起學習成長。