基于M453的智能家居系統設計概要:
使用先進新唐M453MCU為主控制器,集成了語音播報,生物識別技術,以及RFID(射頻識別技術)設計的一款高端智能家居終端Demo,讓用戶可以以指紋識別和RFID兩種高效安全的技術使生活更加便捷。同時3.2寸彩色觸摸液晶及友好的人機交互帶給用戶更加完美的體驗。語音及燈控,電機控制等外設模塊設計的鎖具終端
基于M453的智能家居設計詳細說明:
本設計使用新唐提供的M451-Tiny作為基礎,然后在上面進行擴展,連接了各種外設模塊,如人機交互的帶觸摸3.2寸彩色液晶屏,成都方程式的生物識別傳感器(光學指紋傳感器),DC控制的繼電器,電機驅動芯片+電機,RC522 RFID讀卡器,SPI_Flash(W25X16)芯片等。產品的特點是操作便捷,安全性高。以指紋為例,將本套系統安裝后,門鎖外面只有傳感器與用戶接觸,除了對應的注冊手指外不能進行功能性操作,這款指紋傳感器帶有唯一的身份識別ID,可防止不法份子更換指紋傳感器來開門;并且安裝類類似指紋鎖后,用戶回家就不用帶鑰匙了,而且這個可比鑰匙方便多了不是嗎?為了進一步提高門鎖的安全性,我們可以使用IC卡和指紋識別組合開門的方式……
制作出來的實物圖如下:
51hei.png (443.9 KB, 下載次數: 83)
下載附件
2022-5-16 05:14 上傳
51hei.png (467.83 KB, 下載次數: 81)
下載附件
2022-5-16 05:14 上傳
51hei.png (337.71 KB, 下載次數: 95)
下載附件
2022-5-16 05:15 上傳
51hei.png (120.77 KB, 下載次數: 71)
下載附件
2022-5-16 05:15 上傳
單片機源程序如下:
- #include "main.h"
- #include "mpr121_bsp.h"
- #include "stdio.h"
- #include "stdlib.h"
- #include "esp8266_bsp.h"
- #include "uart_tft_bsp.h"
- #include "w25x16_bsp.h"
- #include "timer_delay.h"
- #include "motor_bsp.h"
- #include "lamp_bsp.h"
- #include "oled_bsp.h"
- #include "dht11_bsp.h" /* 溫濕度傳感器 */
- #include "rc522_bsp.h"
- #include "fp_uart_bsp.h"
- #include "voice_bsp.h"
- uint8_t IC_Card[4][5]; /* 可存4張IC卡卡號,且第二維數組每個每一個字節為有效標志0x3A時表示該號有效 */
- /****************************************************************************************************************
- *函數名稱:main
- *函數功能:主函數
- *函數參數:None
- *函數返回:None
- *使用示例:None
- *CreateBy:Veiko
- *Time:2015-5-1
- ****************************************************************************************************************/
- int main(void)
- {
- uint8_t Key;
- uint8_t LED_Stu;
- unsigned int TmpID;
- unsigned int err;
- unsigned int MidDid;
- uint8_t DHT11_data[4];
- uint8_t i;
-
- SYS_Init();
- CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_HXT); /* Select SysTick clock source as HXT */
-
- LED_GPIO_Initize();
- motor_Pin_initize(); /* 初始化電機控制引腳 */
- LAMP_Pin_Initize(); /* 初始化燈控制引腳 */
- Open_SPI_Flash();
- TIMER0_Init_Period(0);
- TIMER1_Init_Period(1);
- OLED_Init();
- InitRc522();
- BLH3001_Initize();
- Voice_SetVoice(30);
- Voice_BusyPinInitize();
- while(1)
- {
- TFT_Function();
-
- if(USER_MatchIC() == true)
- {
- Voice_playMusic(5); /* 驗證成功 */
- Motor_Door_ZhengZhuan();
- TIMER0_DelayNPeriod(150000); /* 開門 */
- Motor_Door_TingZhi();
- Voice_playMusic(3); /* 門已打開請轉動把手開門 */
- TIMER0_DelayNPeriod(500000); /* 開門延時 */
- Motor_Door_FanZhuan();
- TIMER0_DelayNPeriod(150000); /* 開門 */
- Motor_Door_TingZhi();
- }
-
- if(UserGetBLH_INT() == true)
- {
- if(Fp_match_D(0,99 ,&TmpID, &err) == FPR_OK)
- {
- Voice_playMusic(5); /* 驗證成功 */
- Motor_Door_ZhengZhuan();
- TIMER0_DelayNPeriod(150000); /* 開門 */
- Motor_Door_TingZhi();
- Voice_playMusic(3); /* 門已打開請轉動把手開門 */
- TIMER0_DelayNPeriod(500000); /* 開門延時 */
- Motor_Door_FanZhuan();
- TIMER0_DelayNPeriod(150000); /* 開門 */
- Motor_Door_TingZhi();
- }
- else
- {
- Voice_playMusic(4); /* 驗證失敗 */
- TIMER0_DelayNPeriod(300000); /* 延時 */
- }
- }
- }
- }
- void USER_DelFP(void)
- {
- unsigned int IDTmp,err;
-
- Voice_playMusic(24); /* 請按手指刪除指紋 */
-
- if(Fp_match_D(0, 99 ,&IDTmp, &err)==FPR_OK)
- {
- if(Fp_Delete(IDTmp, IDTmp,&err)== FPR_OK)
- {
- Voice_playMusic(27); /* 操作成功 */
- }
- else
- {
- Voice_playMusic(28); /* 操作失敗 */
- }
- }
- else
- {
- Voice_playMusic(28); /* 操作失敗 */
-
- }
- TIMER0_DelayNPeriod(300000); /* 延時 */
- }
- void USER_AddFP(void)
- {
- unsigned int IDTmp,err;
-
- Voice_playMusic(7); /* 請錄入指紋 */
-
- if(FP_Enroll_D(0,99,&IDTmp,&err) == FPR_OK)
- {
- Voice_playMusic(14); /* 指紋錄入成功 */
- }
- else
- {
- Voice_playMusic(15); /* 指紋錄入失敗 */
- }
- }
- void TFT_Function(void)
- {
- if(TFT_Command != 0) /* 表示有命令 */
- {
- switch(TFT_Command)
- {
- case TFT_CommandKaiMen:
- Voice_playMusic(5); /* 驗證成功 */
- Motor_Door_ZhengZhuan();
- TIMER0_DelayNPeriod(150000); /* 開門 */
- Motor_Door_TingZhi();
- Voice_playMusic(3); /* 門已打開請轉動把手開門 */
- TIMER0_DelayNPeriod(500000); /* 開門延時 */
- Motor_Door_FanZhuan();
- TIMER0_DelayNPeriod(150000); /* 開門 */
- Motor_Door_TingZhi();
-
- break;
- case TFT_CommandAddFP:
- USER_AddFP();
- break;
- case TFT_CommandDelFP:
- USER_DelFP();
- break;
- case TFT_CommandAddIC:
- USER_AddIC_Card();
- break;
- case TFT_CommandDelIC:
- USER_DeleteIC_Card();
- break;
- case TFT_CommandSWDT_LED:
- if(LAMP1_Stu() == 1)
- {
- LAMP1_ON();
- }
- else
- {
- LAMP1_OFF();
- }
- break;
- case TFT_CommandSWZL_LED:
- if(LAMP2_Stu() == 1)
- {
- LAMP2_ON();
- }
- else
- {
- LAMP2_OFF();
- }
- break;
- default:break;
- }
- TFT_Command = 0;
- }
- }
- bool USER_MatchIC(void)
- {
- uint8_t ArrayTmp[4];
- uint8_t i,j;
-
- if(USER_GetRFID_ID(ArrayTmp) == true)
- {
- for(i=0;i<4;i++)
- {
- if(IC_Card[i][0] != 0x3A)
- continue;
- for(j=0;j<4;j++)
- {
- if(ArrayTmp[j] != IC_Card[i][j+1])
- break;
- }
- if(j==4)
- {
- return 1;
- }
- }
- if(i==4)
- {
- Voice_playMusic(4); /* 驗證失敗 */
- TIMER0_DelayNPeriod(300000); /* 延時 */
- return 0;
- }
- }
- return 0;
- }
- void USER_DeleteIC_Card(void)
- {
- uint8_t ArrayTmp[4];
- uint8_t i,j;
- Voice_playMusic(25); /* 請刷將要刪除的IC卡 */
- while(USER_GetRFID_ID(ArrayTmp) == false);
-
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- if(ArrayTmp[j] != IC_Card[i][j+1])
- break;
- }
- if(j==4)
- {
- IC_Card[i][0] = 0xff; /* 清除有效標志 */
- Voice_playMusic(27); /* 操作成功 */
- break;
- }
- }
- if(i==4)
- {
- Voice_playMusic(28); /* 操作失敗 */
- }
- TIMER0_DelayNPeriod(300000); /* 延時 */
- }
- void USER_AddIC_Card(void)
- {
- unsigned char CT[2];//卡類型
- unsigned char status;
- uint8_t i,j;
- for(i=0;i<4;i++)
- {
- if(IC_Card[i][0] != 0x3A)
- break;
- }
- if(i<4)
- {
- Voice_playMusic(26); /* 請刷IC卡 */
- while(USER_GetRFID_ID(&IC_Card[i][1]) == false);
- IC_Card[i][0] = 0x3A; /* 標志有效 */
- }
- Voice_playMusic(18); /* 添加IC卡成功 */
- TIMER0_DelayNPeriod(300000); /* 延時 */
- }
- /****************************************************************************************************************
- *函數名稱:SYS_Init
- *函數功能:配置系統時鐘樹
- *函數參數:None
- *函數返回:None
- *使用示例:SYS_Init();
- *CreateBy:Veiko
- *Time:2015-5-1
- ****************************************************************************************************************/
- uint8_t USER_GetRFID_ID(uint8_t *ID_Array)
- {
- unsigned char CT[2];//卡類型
- unsigned char SN[4]; //卡號
- unsigned char status;
-
- status = PcdRequest(PICC_REQALL,CT);/*掃描卡*/
- status = PcdAnticoll(SN);/*防沖撞*/
- if (status==MI_OK)
- {
- *(ID_Array) = SN[0];
- *(ID_Array+1) = SN[1];
- *(ID_Array+2) = SN[2];
- *(ID_Array+3) = SN[3];
- return 1;
- }
- return 0;
- }
- /****************************************************************************************************************
- *函數名稱:SYS_Init
- *函數功能:配置系統時鐘樹
- *函數參數:None
- *函數返回:None
- *使用示例:SYS_Init();
- *CreateBy:Veiko
- *Time:2015-5-1
- ****************************************************************************************************************/
- void SYS_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init System Clock */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Enable HIRC clock (Internal RC 22.1184MHz) */
- CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
- /* Wait for HIRC clock ready */
- CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
- /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
- /* Enable HXT clock (external XTAL 12MHz) */
- CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
- /* Wait for HXT clock ready */
- CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
- /* Set core clock as HCLK_CLOCK */
- CLK_SetCoreClock(HCLK_CLOCK);
-
- /* Select UART module clock source as HXT and UART module clock divider as 1 */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
- CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
- CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
-
- /* Update System Core Clock */
- /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
- SystemCoreClockUpdate();
-
- CLK_EnableModuleClock(I2C1_MODULE); /* Enable peripheral clock */
- CLK_EnableModuleClock(UART1_MODULE);
- CLK_EnableModuleClock(UART0_MODULE);
- CLK_EnableModuleClock(UART2_MODULE);
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init I/O Multi-function */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Set PD multi-function pins for UART0 RXD and TXD */
- SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
- SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
-
- /* Set PA multi-function pins for UART1 RXD and TXD */
- SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA0MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
- SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA0MFP_UART1_TXD | SYS_GPA_MFPL_PA1MFP_UART1_RXD |SYS_GPA_MFPL_PA2MFP_GPIO
- |SYS_GPA_MFPL_PA3MFP_GPIO);
-
- /* I2C1: GPE0=SDA, GPC4=SCL*/
- SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE0MFP_Msk);
- SYS->GPE_MFPL |= SYS_GPE_MFPL_PE0MFP_I2C1_SDA;
- SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC4MFP_Msk);
- SYS->GPC_MFPL |= SYS_GPC_MFPL_PC4MFP_I2C1_SCL;
-
- /* UART2:PC2 PC3 */
- SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC2MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk);
- SYS->GPC_MFPL |= (SYS_GPC_MFPL_PC2MFP_UART2_TXD| SYS_GPC_MFPL_PC3MFP_UART2_RXD);
-
- /* PB1-WakePin */
- SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB1MFP_Msk);
- SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB1MFP_GPIO);
-
- /* PB8-語音的BUSY檢測引腳
- PB9 and PB10為澆花電機控制引腳
- */
- SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB8MFP_Msk| SYS_GPB_MFPH_PB9MFP_Msk | SYS_GPB_MFPH_PB10MFP_Msk);
- SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB8MFP_GPIO | SYS_GPB_MFPH_PB9MFP_GPIO | SYS_GPB_MFPH_PB10MFP_GPIO);
-
- /* Lock protected registers */
- SYS_LockReg();
-
- UART_Open(UART0, 9600);
-
- UART_Open(UART1, 9600);
- UART_EnableInt(UART1, UART_INTEN_RDAIEN_Msk); /* 使能UART1的接收中斷功能 */
-
- UART_Open(UART2, 115200);
- UART_EnableInt(UART2, UART_INTEN_RDAIEN_Msk); /* 使能UART1的接收中斷功能 */
-
- UART_Open(UART3, 115200);
- UART_EnableInt(UART3, UART_INTEN_RDAIEN_Msk); /* 使能UART1的接收中斷功能 */
- }
- /******************************************************End*******************************************************/
-
復制代碼
Keil代碼下載(需要安裝相應芯片的庫才能打開):
MDK工程文件(程序源文件)--請合用MDK 5.15打開.7z
(3.48 MB, 下載次數: 19)
2022-5-16 05:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|