資料鏈接:待更新~
嗶哩嗶哩視頻鏈接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_source=e5082ef80535e952b2a4301746491be0(bilibili:化作塵my)
資料鏈接:https://pan.baidu.com/s/1qObK7KBl50RmFrAtoX12kw
提取碼:iih4
實物鏈接:https://m.tb.cn/h.5h5mDXI?tk=MdxLWYHgKnz CZ0001
一、項目功能概述
1、OLED顯示當前樓層、目標樓層等信息
2、可以刷卡到達指定樓層
3、可以刷指紋到達指定樓層
4、可以輸入密碼進入管理員模式,進行錄入卡片與對應樓層信息,錄入指紋與對應樓層信息,并可以修改刪除指紋與卡片信息
5、用步進電機驅(qū)動上下樓層
6、用舵機控制開門關門(本工程未實現(xiàn))
7、有報警功能,當密碼錯誤、指紋錯誤、卡片錯誤,都會進行報警
8、外觀用木板搭建
二、項目材料選擇
1、顯示選擇0.96寸SPIOLED
2、刷卡模塊選擇RF522
3、指紋模塊選擇AS608
4、報警模塊選擇蜂鳴器
5、輸入密碼選擇矩陣按鍵
6、電源電路選擇USB接口輸入,AMS1117降壓芯片轉(zhuǎn)3.3V給單片機供電
7、主控芯片選擇STM32F103C8T6
主控芯片需要能夠驅(qū)動OLED,刷卡模塊、指紋模塊、矩陣按鍵,理論上51單片機就可以滿足要求,但是代碼量大,內(nèi)存會有比較高得要求,所以選擇熟悉的stm32f103c8t6,64K FLASH內(nèi)存足夠存儲代碼與顯示大量漢字。
三、原理圖設計
1、單片機最小系統(tǒng)設計
2、電源部分設計
3、單片機供電與下載接口設計
4、指紋、按鍵、RFID、蜂鳴器、步進電機等電路設計
四、PCB板設計
五、主程序設計
(一)程序設計思想:
1、尋找指紋模塊代碼并移植調(diào)試使用
2、商家或者網(wǎng)絡獲取RFID驅(qū)動、OLED驅(qū)動
3、自己編寫原理比較簡單的矩陣按鍵驅(qū)動、步進電機驅(qū)動
4、寫一個系統(tǒng)需要參數(shù)結構體方便管理
typedef struct
{
u32 HZCFlag; //化作塵保存標志 上電會初始化參數(shù),后保存參數(shù)到單片機FLASH
u8 passwd1[7]; //管理員密碼1
u8 passwd2[7]; //管理員密碼2
u8 cardid[10][6]; //可以存儲10張卡片ID
u8 cardFloor[10];//卡片對應樓層保存數(shù)組
u8 CurrFloor;//當前樓層
u8 TgtFloor; //目標樓層
u8 errCnt;//錯誤計數(shù)
u8 errTime;//等待錯誤時間
u8 fingerFloor[100];//指紋ID對應樓層
u16 fingNum;//指紋個數(shù)
u16 cardNum;//RFID個數(shù)
}SysTemPat;
5、增刪改查都基于結構體操作,要保證數(shù)據(jù)實時同步文章來源:http://www.zghlxwxcb.cn/news/detail-435976.html
#include "main.h"
#include <string.h>
SysTemPat sys;
#define MAXERRTIMES 5
#define usart2_baund 57600//串口2波特率,根據(jù)指紋模塊波特率更改
//要寫入到STM32 FLASH的字符串數(shù)組
const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0};
#define TEXT_LENTH sizeof(TEXT_Buffer) //數(shù)組長度
#define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0)
#define FLASH_SAVE_ADDR 0X0802C124 //設置FLASH 保存地址(必須為偶數(shù),且所在扇區(qū),要大于本代碼所占用到的扇區(qū).
//否則,寫操作的時候,可能會導致擦除整個扇區(qū),從而引起部分程序丟失.引起死機.
SysPara AS608Para;//指紋模塊AS608參數(shù)
u16 ValidN;//模塊內(nèi)有效指紋個數(shù)
u8** kbd_tbl;
void Display_Data(void);//顯示時間
void Add_FR(void); //錄指紋
void Del_FR(void); //刪除指紋
int press_FR(void);//刷指紋
void ShowErrMessage(u8 ensure);//顯示確認碼錯誤信息
int password(void);//密碼鎖
void SetPassworld(void);//修改密碼
void starting(void);//開機界面信息
u8 MFRC522_lock(void);//刷卡解鎖
u8 Add_Rfid(void); //錄入
void Set_Time(void);
void Massige(void);
void SysPartInit(void ); //系統(tǒng)參數(shù)初始化
//u8 Pwd[7]=" "; //解鎖密碼1
//u8 Pwd2[7]=" "; //解鎖密碼2
//u8 cardid[6]={0,0,0,0,0,0}; //卡號1
int Error; //密碼驗證信息
u8 DisFlag = 1,ArrowDisFlag=1;
//數(shù)字的ASCII碼
uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//顯示緩沖區(qū)
u8 dispnumber5buf[6];
u8 dispnumber3buf[4];
u8 dispnumber2buf[3];
//MFRC522數(shù)據(jù)區(qū)
u8 mfrc552pidbuf[18];
u8 card_pydebuf[2];
u8 card_numberbuf[5];
u8 card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8 card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
u8 card_readbuf[18];
//SM05-S數(shù)據(jù)區(qū)
u8 sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21};
//extern聲明變量已在外部的C文件里定義,可以在主文件中使用
extern u8 sm05receivebuf[16]; //在中斷C文件里定義
extern u8 sm05_OK; //在中斷C文件里定義
//u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
u8 * week[7]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
u8 * setup[7]={"1、錄入指紋","2、刪除指紋","3、修改密碼","4、修改時間","5、錄入卡片","6、查看信息"};
int main(void)
{
// u16 set=0;
// u8 err=0;
// int key_num;
int time1;
// int time2; //鎖屏時間
char arrow=0; //箭頭位子
//SysHSI_Init();
delay_init(); //延時函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
uart_init(115200); //串口初始化為9600
printf("串口功能正常\r\n");
Button4_4_Init(); //初始化與按鍵連接的硬件接口
OLED_Init(); //顯示初始化
Walkmotor_Init(); //步進電機初始化
BEEP_Init(); //蜂鳴器初始化
usart2_init(usart2_baund); //初始化指紋模塊
PS_StaGPIO_Init();
OLED_Clear();
starting();//開機信息 logo
// err = RTC_Init(); //RTC初始化
// if(err)
// {
// OLED_Clear();
// Show_Str(12,13,128,20,"RTC CRY ERR!",12,0);
// OLED_Refresh_Gram();//更新顯示
// delay_ms(3000);
// }
SysPartInit(); //系統(tǒng)參數(shù)初始化
while(1)
{
time1++;
if(DisFlag == 1)
{
OLED_ShowNum(58,20,sys.CurrFloor,1,24);//顯示當前樓層
}
if(ArrowDisFlag == 1)
{
}
if(sys.TgtFloor != sys.CurrFloor)//需要到達目標樓層
{
if(sys.TgtFloor > sys.CurrFloor)
for(; sys.CurrFloor<sys.TgtFloor; )//上樓
{
sys.CurrFloor++;
Walkmotor_ON();
OLED_ShowNum(58,20,sys.CurrFloor,1,24);//顯示當前樓層
}else if(sys.TgtFloor < sys.CurrFloor)
for(; sys.CurrFloor>sys.TgtFloor;)//下樓
{
sys.CurrFloor--;
Walkmotor_OFF();
OLED_ShowNum(58,20,sys.CurrFloor,1,24);//顯示當前樓層
}
}
if(sys.TgtFloor == sys.CurrFloor && sys.CurrFloor!=1)//如果電梯不在1樓停下,返回1樓
{
for(; sys.CurrFloor>1; )//下樓
{
sys.CurrFloor--;
Walkmotor_OFF();
OLED_ShowNum(58,20,sys.CurrFloor,1,24);//顯示當前樓層
}
}
/******************檢測刷卡與指紋********************/
if((time1%100)==1)
{
//MFRC522解鎖
time1=0;
MFRC522_Initializtion();
Error=MFRC522_lock();
if(Error==0)
{
}
}
//指紋解鎖
if(PS_Sta) //檢測PS_Sta狀態(tài),如果有手指按下
{
while(PS_Sta){
Error=press_FR();//刷指紋
if(Error==0)
{
//DisUnLock();
//跳到解鎖界面
}
}
}
}
}
六、成品展示
文章來源地址http://www.zghlxwxcb.cn/news/detail-435976.html
到了這里,關于STM32項目設計:基于stm32f103c8t6智能電梯系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!