找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2013|回复: 0
收起左侧

基于新唐M453 MCU的智能家居程序源码-集成语音播报,指纹识别,射频识别技术

[复制链接]
ID:1026694 发表于 2022-5-16 00:15 | 显示全部楼层 |阅读模式
基于M453的智能家居系统设计概要:
       使用先进新唐M453MCU为主控制器,集成了语音播报,生物识别技术,以及RFID(射频识别技术)设计的一款高端智能家居终端Demo,让用户可以以指纹识别和RFID两种高效安全的技术使生活更加便捷。同时3.2寸彩色触摸液晶及友好的人机交互带给用户更加完美的体验。语音及灯控,电机控制等外设模块设计的锁具终端
基于M453的智能家居设计详细说明:
       本设计使用新唐提供的M451-Tiny作为基础,然后在上面进行扩展,连接了各种外设模块,如人机交互的带触摸3.2寸彩色液晶屏,成都方程式的生物识别传感器(光学指纹传感器),DC控制的继电器,电机驱动芯片+电机,RC522 RFID读卡器,SPI_Flash(W25X16)芯片等。产品的特点是操作便捷,安全性高。以指纹为例,将本套系统安装后,门锁外面只有传感器与用户接触,除了对应的注册手指外不能进行功能性操作,这款指纹传感器带有唯一的身份识别ID,可防止不法份子更换指纹传感器来开门;并且安装类类似指纹锁后,用户回家就不用带钥匙了,而且这个可比钥匙方便多了不是吗?为了进一步提高门锁的安全性,我们可以使用IC卡和指纹识别组合开门的方式……

制作出来的实物图如下:
51hei.png 51hei.png 51hei.png 51hei.png

单片机源程序如下:
  1. #include "main.h"
  2. #include "mpr121_bsp.h"
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #include "esp8266_bsp.h"
  6. #include "uart_tft_bsp.h"
  7. #include "w25x16_bsp.h"
  8. #include "timer_delay.h"
  9. #include "motor_bsp.h"
  10. #include "lamp_bsp.h"
  11. #include "oled_bsp.h"
  12. #include "dht11_bsp.h"    /* 温湿度传感器 */
  13. #include "rc522_bsp.h"
  14. #include "fp_uart_bsp.h"
  15. #include "voice_bsp.h"

  16. uint8_t IC_Card[4][5];  /* 可存4张IC卡卡号,且第二维数组每个每一个字节为有效标志0x3A时表示该号有效 */


  17. /****************************************************************************************************************
  18. *函数名称:main
  19. *函数功能:主函数
  20. *函数参数:None
  21. *函数返回:None
  22. *使用示例:None
  23. *CreateBy:Veiko
  24. *Time:2015-5-1
  25. ****************************************************************************************************************/
  26. int main(void)
  27. {
  28.         uint8_t Key;
  29.         uint8_t LED_Stu;
  30.         unsigned int TmpID;
  31.         unsigned int err;
  32.         unsigned int MidDid;
  33.         uint8_t DHT11_data[4];
  34.         uint8_t i;
  35.         
  36.         SYS_Init();
  37.         CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_HXT); /* Select SysTick clock source as HXT */
  38.         
  39.         LED_GPIO_Initize();
  40.         motor_Pin_initize();   /* 初始化电机控制引脚 */
  41.         LAMP_Pin_Initize();    /* 初始化灯控制引脚 */
  42.         Open_SPI_Flash();
  43.         TIMER0_Init_Period(0);
  44.         TIMER1_Init_Period(1);
  45.         OLED_Init();
  46.         InitRc522();
  47.         BLH3001_Initize();
  48.         Voice_SetVoice(30);
  49.         Voice_BusyPinInitize();

  50.         while(1)
  51.         {
  52.                 TFT_Function();
  53.                
  54.                 if(USER_MatchIC() == true)
  55.                 {
  56.                         Voice_playMusic(5);  /* 验证成功 */
  57.                         Motor_Door_ZhengZhuan();
  58.                         TIMER0_DelayNPeriod(150000);  /* 开门 */
  59.                         Motor_Door_TingZhi();
  60.                         Voice_playMusic(3);  /* 门已打开请转动把手开门 */
  61.                         TIMER0_DelayNPeriod(500000);  /* 开门延时 */
  62.                         Motor_Door_FanZhuan();
  63.                         TIMER0_DelayNPeriod(150000);  /* 开门 */
  64.                         Motor_Door_TingZhi();
  65.                 }
  66.                
  67.                 if(UserGetBLH_INT() == true)
  68.                 {
  69.                         if(Fp_match_D(0,99 ,&TmpID, &err) == FPR_OK)
  70.                         {
  71.                                 Voice_playMusic(5);  /* 验证成功 */
  72.                                 Motor_Door_ZhengZhuan();
  73.                                 TIMER0_DelayNPeriod(150000);  /* 开门 */
  74.                                 Motor_Door_TingZhi();
  75.                                 Voice_playMusic(3);  /* 门已打开请转动把手开门 */
  76.                                 TIMER0_DelayNPeriod(500000);  /* 开门延时 */
  77.                                 Motor_Door_FanZhuan();
  78.                                 TIMER0_DelayNPeriod(150000);  /* 开门 */
  79.                                 Motor_Door_TingZhi();
  80.                         }
  81.                         else
  82.                         {
  83.                                 Voice_playMusic(4);  /* 验证失败 */
  84.                                 TIMER0_DelayNPeriod(300000);  /* 延时 */
  85.                         }
  86.                 }
  87.         }
  88. }
  89. void USER_DelFP(void)
  90. {
  91.         unsigned int IDTmp,err;
  92.         
  93.         Voice_playMusic(24);  /* 请按手指删除指纹 */
  94.         
  95.         if(Fp_match_D(0, 99 ,&IDTmp, &err)==FPR_OK)
  96.         {
  97.                 if(Fp_Delete(IDTmp, IDTmp,&err)== FPR_OK)
  98.                 {
  99.                         Voice_playMusic(27);  /* 操作成功 */
  100.                 }
  101.                 else
  102.                 {
  103.                         Voice_playMusic(28);  /* 操作失败 */
  104.                 }
  105.         }
  106.         else
  107.         {
  108.                 Voice_playMusic(28);  /* 操作失败 */
  109.                                 
  110.         }
  111.         TIMER0_DelayNPeriod(300000);  /* 延时 */
  112. }
  113. void USER_AddFP(void)
  114. {
  115.         unsigned int IDTmp,err;
  116.         
  117.         Voice_playMusic(7);  /* 请录入指纹 */
  118.         
  119.         if(FP_Enroll_D(0,99,&IDTmp,&err) == FPR_OK)
  120.         {
  121.                 Voice_playMusic(14);  /* 指纹录入成功 */
  122.         }
  123.         else
  124.         {
  125.                 Voice_playMusic(15);  /* 指纹录入失败 */
  126.         }
  127. }
  128. void TFT_Function(void)
  129. {
  130.         if(TFT_Command != 0) /* 表示有命令 */
  131.         {
  132.                 switch(TFT_Command)
  133.                 {
  134.                         case TFT_CommandKaiMen:
  135.                                 Voice_playMusic(5);  /* 验证成功 */
  136.                                 Motor_Door_ZhengZhuan();
  137.                                 TIMER0_DelayNPeriod(150000);  /* 开门 */
  138.                                 Motor_Door_TingZhi();
  139.                                 Voice_playMusic(3);  /* 门已打开请转动把手开门 */
  140.                                 TIMER0_DelayNPeriod(500000);  /* 开门延时 */
  141.                                 Motor_Door_FanZhuan();
  142.                                 TIMER0_DelayNPeriod(150000);  /* 开门 */
  143.                                 Motor_Door_TingZhi();
  144.                         
  145.                                 break;
  146.                         case TFT_CommandAddFP:
  147.                                 USER_AddFP();
  148.                                 break;
  149.                         case TFT_CommandDelFP:
  150.                                 USER_DelFP();
  151.                                 break;
  152.                         case TFT_CommandAddIC:
  153.                                 USER_AddIC_Card();
  154.                                 break;
  155.                         case TFT_CommandDelIC:
  156.                                 USER_DeleteIC_Card();
  157.                                 break;
  158.                         case TFT_CommandSWDT_LED:
  159.                                         if(LAMP1_Stu() == 1)
  160.                                         {
  161.                                                 LAMP1_ON();
  162.                                         }
  163.                                         else
  164.                                         {
  165.                                                 LAMP1_OFF();
  166.                                         }
  167.                                         break;
  168.                         case TFT_CommandSWZL_LED:
  169.                                 if(LAMP2_Stu() == 1)
  170.                                         {
  171.                                                 LAMP2_ON();
  172.                                         }
  173.                                         else
  174.                                         {
  175.                                                 LAMP2_OFF();
  176.                                         }
  177.                                         break;
  178.                         default:break;
  179.                 }
  180.                 TFT_Command = 0;
  181.         }
  182. }

  183. bool USER_MatchIC(void)
  184. {
  185.         uint8_t ArrayTmp[4];
  186.         uint8_t i,j;
  187.         
  188.         if(USER_GetRFID_ID(ArrayTmp) == true)
  189.         {
  190.                 for(i=0;i<4;i++)
  191.                 {
  192.                         if(IC_Card[i][0] != 0x3A)
  193.                                 continue;
  194.                         for(j=0;j<4;j++)
  195.                         {
  196.                                 if(ArrayTmp[j] != IC_Card[i][j+1])
  197.                                         break;
  198.                         }
  199.                         if(j==4)
  200.                         {
  201.                                 return 1;
  202.                         }
  203.                 }
  204.                 if(i==4)
  205.                 {
  206.                         Voice_playMusic(4);  /* 验证失败 */
  207.                         TIMER0_DelayNPeriod(300000);  /* 延时 */
  208.                         return 0;
  209.                 }
  210.         }
  211.         return 0;
  212. }
  213. void USER_DeleteIC_Card(void)
  214. {
  215.         uint8_t ArrayTmp[4];
  216.         uint8_t i,j;
  217.         Voice_playMusic(25);  /* 请刷将要删除的IC卡 */
  218.         while(USER_GetRFID_ID(ArrayTmp) == false);
  219.         
  220.         for(i=0;i<4;i++)
  221.         {
  222.                 for(j=0;j<4;j++)
  223.                 {
  224.                         if(ArrayTmp[j] != IC_Card[i][j+1])
  225.                                 break;
  226.                 }
  227.                 if(j==4)
  228.                 {
  229.                         IC_Card[i][0] = 0xff;  /* 清除有效标志 */
  230.                         Voice_playMusic(27);  /* 操作成功 */
  231.                         break;
  232.                 }
  233.         }
  234.         if(i==4)
  235.         {
  236.                 Voice_playMusic(28);  /* 操作失败 */
  237.         }
  238.         TIMER0_DelayNPeriod(300000);  /* 延时 */
  239. }

  240. void USER_AddIC_Card(void)
  241. {
  242.         unsigned char CT[2];//卡类型
  243.         unsigned char status;
  244.         uint8_t i,j;
  245.         for(i=0;i<4;i++)
  246.         {
  247.                 if(IC_Card[i][0] != 0x3A)
  248.                         break;
  249.         }
  250.         if(i<4)
  251.         {
  252.                 Voice_playMusic(26);  /* 请刷IC卡 */
  253.                 while(USER_GetRFID_ID(&IC_Card[i][1]) == false);
  254.                 IC_Card[i][0] = 0x3A;  /* 标志有效 */
  255.         }
  256.         Voice_playMusic(18);  /* 添加IC卡成功 */
  257.         TIMER0_DelayNPeriod(300000);  /* 延时 */
  258. }
  259. /****************************************************************************************************************
  260. *函数名称:SYS_Init
  261. *函数功能:配置系统时钟树
  262. *函数参数:None
  263. *函数返回:None
  264. *使用示例:SYS_Init();
  265. *CreateBy:Veiko
  266. *Time:2015-5-1
  267. ****************************************************************************************************************/
  268. uint8_t USER_GetRFID_ID(uint8_t *ID_Array)
  269. {
  270.         unsigned char CT[2];//卡类型
  271.         unsigned char SN[4]; //卡号
  272.         unsigned char status;
  273.         
  274.         status = PcdRequest(PICC_REQALL,CT);/*扫描卡*/
  275.         status = PcdAnticoll(SN);/*防冲撞*/
  276.         if (status==MI_OK)
  277.         {
  278.                 *(ID_Array) = SN[0];
  279.                 *(ID_Array+1) = SN[1];
  280.                 *(ID_Array+2) = SN[2];
  281.                 *(ID_Array+3) = SN[3];
  282.                 return 1;
  283.         }
  284.         return 0;
  285. }

  286. /****************************************************************************************************************
  287. *函数名称:SYS_Init
  288. *函数功能:配置系统时钟树
  289. *函数参数:None
  290. *函数返回:None
  291. *使用示例:SYS_Init();
  292. *CreateBy:Veiko
  293. *Time:2015-5-1
  294. ****************************************************************************************************************/
  295. void SYS_Init(void)
  296. {
  297.     /*---------------------------------------------------------------------------------------------------------*/
  298.     /* Init System Clock                                                                                       */
  299.     /*---------------------------------------------------------------------------------------------------------*/
  300.     /* Unlock protected registers */
  301.     SYS_UnlockReg();

  302.     /* Enable HIRC clock (Internal RC 22.1184MHz) */
  303.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  304.     /* Wait for HIRC clock ready */
  305.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  306.     /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
  307.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  308.     /* Enable HXT clock (external XTAL 12MHz) */
  309.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  310.     /* Wait for HXT clock ready */
  311.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

  312.     /* Set core clock as HCLK_CLOCK */
  313.     CLK_SetCoreClock(HCLK_CLOCK);
  314.                
  315.                 /* Select UART module clock source as HXT and UART module clock divider as 1 */
  316.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
  317.                 CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
  318.                 CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
  319.                
  320.     /* Update System Core Clock */
  321.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
  322.     SystemCoreClockUpdate();
  323.                
  324.                 CLK_EnableModuleClock(I2C1_MODULE);    /* Enable peripheral clock */
  325.                 CLK_EnableModuleClock(UART1_MODULE);
  326.     CLK_EnableModuleClock(UART0_MODULE);
  327.                 CLK_EnableModuleClock(UART2_MODULE);


  328.     /*---------------------------------------------------------------------------------------------------------*/
  329.     /* Init I/O Multi-function                                                                                 */
  330.     /*---------------------------------------------------------------------------------------------------------*/
  331.     /* Set PD multi-function pins for UART0 RXD and TXD */
  332.     SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
  333.     SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
  334.                
  335.                 /* Set PA multi-function pins for UART1 RXD and TXD */
  336.     SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA0MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);   
  337.     SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA0MFP_UART1_TXD | SYS_GPA_MFPL_PA1MFP_UART1_RXD |SYS_GPA_MFPL_PA2MFP_GPIO
  338.                                   |SYS_GPA_MFPL_PA3MFP_GPIO);
  339.                
  340.                 /* I2C1: GPE0=SDA, GPC4=SCL*/
  341.                 SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE0MFP_Msk);
  342.     SYS->GPE_MFPL |= SYS_GPE_MFPL_PE0MFP_I2C1_SDA;
  343.                 SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC4MFP_Msk);
  344.     SYS->GPC_MFPL |= SYS_GPC_MFPL_PC4MFP_I2C1_SCL;
  345.                
  346.                 /* UART2:PC2  PC3 */
  347.                 SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC2MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk);
  348.                 SYS->GPC_MFPL |=  (SYS_GPC_MFPL_PC2MFP_UART2_TXD| SYS_GPC_MFPL_PC3MFP_UART2_RXD);
  349.                
  350.                 /* PB1-WakePin */
  351.                 SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB1MFP_Msk);
  352.                 SYS->GPB_MFPL |=  (SYS_GPB_MFPL_PB1MFP_GPIO);
  353.                
  354.                 /* PB8-语音的BUSY检测引脚
  355.                    PB9 and PB10为浇花电机控制引脚
  356.                 */
  357.                 SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB8MFP_Msk| SYS_GPB_MFPH_PB9MFP_Msk | SYS_GPB_MFPH_PB10MFP_Msk);
  358.                 SYS->GPB_MFPH |=  (SYS_GPB_MFPH_PB8MFP_GPIO | SYS_GPB_MFPH_PB9MFP_GPIO | SYS_GPB_MFPH_PB10MFP_GPIO);
  359.                
  360.     /* Lock protected registers */
  361.     SYS_LockReg();
  362.                
  363.                 UART_Open(UART0, 9600);
  364.                
  365.                 UART_Open(UART1, 9600);
  366.                 UART_EnableInt(UART1, UART_INTEN_RDAIEN_Msk);  /* 使能UART1的接收中断功能 */
  367.                
  368.                 UART_Open(UART2, 115200);
  369.                 UART_EnableInt(UART2, UART_INTEN_RDAIEN_Msk);  /* 使能UART1的接收中断功能 */
  370.                
  371.                 UART_Open(UART3, 115200);
  372.                 UART_EnableInt(UART3, UART_INTEN_RDAIEN_Msk);  /* 使能UART1的接收中断功能 */
  373. }




  374. /******************************************************End*******************************************************/


  375.         
复制代码

Keil代码下载(需要安装相应芯片的库才能打开):
MDK工程文件(程序源文件)--请合用MDK 5.15打开.7z (3.48 MB, 下载次数: 19)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表