久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23745|回復: 11
收起左側

STM32密碼鎖設計 功能很全 帶源碼

  [復制鏈接]
ID:194501 發表于 2017-4-28 11:10 | 顯示全部樓層 |閱讀模式
**功能:支持3~20位的密碼設置,初始密碼為123456;若要重設密碼,需先輸入正確密碼開鎖。
** 正常顯示情況下,按下確認鍵上鎖;按下密碼鍵,開始輸入密碼。
**接線:PE[0..3]----4*4鍵盤的行線,均用中斷方式,上拉輸入,下降沿觸發
** PE[4..7]----4*4鍵盤的列線,下拉輸入,在中斷內臨時改為上拉輸入,用于讀鍵值
** PD[0..7]----LCD12864 D0~D7
** PD[13..15]--LCD12864 RS,RW,E
** PA.1 連接繼電器,低電平時合上,高電平時斷開相當于開鎖與上鎖
0.png
完整代碼下載:
電子密碼鎖設計.rar (1.5 MB, 下載次數: 670)



單片機源碼:
  1. /*****************************************************************************
  2. **                          電子密碼鎖設計
  3. **文件名稱:main.c
  4. **by 追夢 2011-5-12
  5. **功能:支持3~20位的密碼設置,初始密碼為123456;若要重設密碼,需先輸入正確密碼開鎖。
  6. **      正常顯示情況下,按下確認鍵上鎖;按下密碼鍵,開始輸入密碼。
  7. **接線:PE[0..3]----4*4鍵盤的行線,均用中斷方式,上拉輸入,下降沿觸發
  8. **      PE[4..7]----4*4鍵盤的列線,下拉輸入,在中斷內臨時改為上拉輸入,用于讀鍵值
  9. **      PD[0..7]----LCD12864  D0~D7
  10. **      PD[13..15]--LCD12864  RS,RW,E
  11. **      PA.1 連接繼電器,低電平時合上,高電平時斷開相當于開鎖與上鎖
  12. *****************************************************************************/

  13. #include "stm32f10x.h"
  14. #include "LCD12864.h"

  15. extern __IO uint16_t keyval;
  16. extern __IO uint16_t keyflag;

  17. uint16_t password[21]={1,2,3,4,5,6,'

  18. [/color]};  //初始密碼為 123456
  19. uint16_t passwordtmp[21];

  20. #define OPEN_DOOR  GPIOA->BRR  = GPIO_Pin_1
  21. #define CLOSE_DOOR GPIOA->BSRR = GPIO_Pin_1

  22. //數組中存放各個備份數據寄存器基于BKP基地址的偏移地址,用于存儲密碼
  23. uint16_t BKPDataReg[21] =
  24.   {
  25.     BKP_DR2,  BKP_DR3,  BKP_DR4,  BKP_DR5,  BKP_DR6,  BKP_DR7, BKP_DR8, BKP_DR9,
  26.         BKP_DR10, BKP_DR11, BKP_DR12, BKP_DR13, BKP_DR14, BKP_DR15,BKP_DR16,BKP_DR17,
  27.         BKP_DR18, BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22
  28.   };
  29. /**
  30.   * 寫密碼到備份寄存器,掉電不丟失,電源復位不丟失
  31.   */
  32. void WritePasswordToBackupReg(uint16_t passwordarray[])
  33. {
  34.   uint32_t index = 0;
  35.   /* 使能寫入BKP */
  36.   PWR_BackupAccessCmd(ENABLE);
  37.   /* 清除事件掛起位 pin Event(TE) */
  38.   BKP_ClearFlag();
  39.   for (index = 0; passwordarray[index]!='

  40. [/color]; index++)
  41.   {                                                         //偏移地址  和   數據
  42.     BKP_WriteBackupRegister(BKPDataReg[index], passwordarray[index]);
  43.   }
  44.   BKP_WriteBackupRegister(BKPDataReg[index], passwordarray[index]); //寫入密碼結尾符  
  45. }
  46. /**
  47.   * 上電或復位后讀出備份區里保存的密碼
  48.   */
  49. void Load_Password(void)
  50. {
  51.     uint32_t index = 0;
  52.    for(index = 0; BKP_ReadBackupRegister(BKPDataReg[index])!='

  53. [/color]; index++)
  54.    {                                                       
  55.       password[index]=BKP_ReadBackupRegister(BKPDataReg[index]);
  56.    }
  57.    password[index]='

  58. [/color];       
  59. }
  60. /*************************************************************
  61. **時鐘配置函數  系統時鐘為72MHz
  62. *************************************************************/
  63. void RCC_Configuration()
  64. {
  65.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\
  66.                            RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);//使能所有GPIO的時鐘
  67. }
  68. //GPIO配置函數
  69. void GPIO_Configuration(void)
  70. {
  71.   GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO的模式設置結構體變量
  72.   // PA1 接繼電器 模擬開鎖功能
  73.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  74.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  75.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  76.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  77.   CLOSE_DOOR; // 初始鎖上
  78. }

  79. // 矩陣鍵盤接口配置
  80. void KeyBoard_Config(void)
  81. {
  82.         GPIO_InitTypeDef GPIO_InitStructure;
  83.         // 行線上拉輸入
  84.         GPIO_InitStructure.GPIO_Pin = 0x000f;
  85.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  86.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  87.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  88.         // 列線下拉輸入
  89.         GPIO_InitStructure.GPIO_Pin = 0x00f0;
  90.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  91.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  92. }
  93. // 列線轉換為浮空輸入
  94. void KeyBoard_Conv(uint16_t GPIO_Pin)
  95. {
  96.     GPIO_InitTypeDef GPIO_InitStructure;
  97.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
  98.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  99.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  100.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  101.         // 列線浮空輸入
  102.         GPIO_InitStructure.GPIO_Pin = 0x00f0;
  103.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  104.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  105.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  106. }
  107. /********************************************************************
  108. *名   稱: EXTI_Configuration
  109. *功   能:外部中斷配置函數
  110. *說   明:PE.0~PE.3 鍵盤中斷
  111. *********************************************************************/
  112. void EXTI_Configuration(void)
  113. {
  114.   EXTI_InitTypeDef EXTI_InitStructure;
  115.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);         //復用功能使能
  116.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
  117.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
  118.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
  119.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);
  120.   EXTI_ClearITPendingBit(EXTI_Line0); //清除掛起/請求標志
  121.   EXTI_ClearITPendingBit(EXTI_Line1); //清除掛起/請求標志
  122.   EXTI_ClearITPendingBit(EXTI_Line2);
  123.   EXTI_ClearITPendingBit(EXTI_Line3);
  124.   // PE.0
  125.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式
  126.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  127.   EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  128.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  129.   EXTI_Init(&EXTI_InitStructure);
  130.   // PE.1
  131.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式
  132.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  133.   EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  134.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  135.   EXTI_Init(&EXTI_InitStructure);
  136.   // PE.2
  137.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式
  138.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  139.   EXTI_InitStructure.EXTI_Line = EXTI_Line2;
  140.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  141.   EXTI_Init(&EXTI_InitStructure);
  142.   // PE.3
  143.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式
  144.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  145.   EXTI_InitStructure.EXTI_Line = EXTI_Line3;
  146.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  147.   EXTI_Init(&EXTI_InitStructure);
  148. }
  149. /********************************************************************
  150. *名   稱: NVIC_Configuration
  151. *功   能:中斷配置
  152. *說   明:PE.0~PE.3 鍵盤中斷,均為下降沿觸發
  153. *********************************************************************/
  154. void NVIC_Configuration(void)
  155. {
  156.   NVIC_InitTypeDef NVIC_InitStructure;
  157.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  158.   // PE.0
  159.   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  160.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  161.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  162.   NVIC_Init(&NVIC_InitStructure);
  163.   // PE.1
  164.   NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  165.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  166.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  167.   NVIC_Init(&NVIC_InitStructure);
  168.   // PE.2
  169.   NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  170.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  171.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  172.   NVIC_Init(&NVIC_InitStructure);
  173.   // PE.3
  174.   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  175.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  176.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  177.   NVIC_Init(&NVIC_InitStructure);
  178. }

  179. //延時n us
  180. void delay_nus(unsigned long n)
  181. {
  182.         unsigned long j;
  183.         while(n--)
  184.         { j=15;
  185.           while(j--);
  186.         }
  187. }
  188. //延時n ms
  189. void delay_nms(unsigned long n)
  190. {
  191.         while(n--)
  192.            delay_nus(1075);
  193. }

  194. /********************************************************************
  195. *名   稱: Change_Password
  196. *功   能:更改密碼
  197. *說   明:直到新密碼設定完成才退出此函數
  198. *********************************************************************/
  199. void Change_Password(void)
  200. {
  201.         uint16_t i,index=0;
  202.         uint16_t flag=0;
  203.         uint16_t passwordtmp2[21]={'

  204. [/color]};
  205.         LCD_Clear();
  206.         delay_nms(2);
  207.         for(i=0;i<21;i++)
  208.            passwordtmp[i] = '

  209. [/color];
  210.         LCD_Setpos_DispString(1,1,"請輸入新密碼:");
  211.         delay_nms(2);
  212.         LCD_Setpos(2,1);
  213.         delay_nms(1);
  214.         while(1)
  215.         {
  216.                 keyflag = 0;
  217.                 while(keyflag < 1)
  218.                 { }
  219.                 keyflag = 0;
  220.                 if(keyval<=9)
  221.                 {
  222.                   LCD_DispChar(keyval+'0');
  223.                   delay_nms(1);
  224.                   if(flag==0)
  225.                      passwordtmp[index++] = keyval;
  226.               else passwordtmp2[index++] = keyval;
  227.                 }
  228.                 else if((keyval == 'e')&&(flag == 0))
  229.                 {
  230.                     passwordtmp[index] = '

  231. [/color];
  232.                         LCD_Clear();
  233.                         delay_nms(1);
  234.                         LCD_Setpos_DispString(1,1,"請再次輸入新密碼");
  235.                         delay_nms(2);
  236.                         LCD_Setpos(2,1);
  237.                 delay_nms(1);
  238.                         flag  = 1;
  239.                         index = 0;
  240.                 }
  241.                 else if((keyval == 'e')&&(flag == 1))
  242.                 {
  243.                         for(i=0;passwordtmp[i]!='

  244. [/color];i++)
  245.                         {
  246.                                 if(passwordtmp[i] != passwordtmp2[i])
  247.                                 {
  248.                                         LCD_Clear();
  249.                                         delay_nms(1);
  250.                                         LCD_Setpos_DispString(1,1,"兩次輸入密碼不同");
  251.                                         delay_nms(2);
  252.                                         LCD_Setpos_DispString(2,1,"請重新設定密碼!");
  253.                                         delay_nms(1000);
  254.                                         LCD_Clear();
  255.                                         delay_nms(1);
  256.                                         LCD_Setpos_DispString(1,1,"請再次輸入新密碼");
  257.                                         delay_nms(2);
  258.                                         LCD_Setpos(2,1);
  259.                                 delay_nms(1);
  260.                                         flag  = 0;
  261.                                         index = 0;
  262.                                         break;
  263.                                 }
  264.                         }
  265.                         if(passwordtmp[i]=='

  266. [/color])
  267.                         {
  268.                                 for(i=0;passwordtmp[i]!='

  269. [/color];i++)
  270.                                 {
  271.                                         password[i] = passwordtmp[i];
  272.                                 }
  273.                                 password[i] = '

  274. [/color];
  275.                                 LCD_Clear();
  276.                                 delay_nms(1);
  277.                                 LCD_Setpos_DispString(2,1,"新密碼設定成功!");
  278.                                 delay_nms(2);
  279.                                 LCD_Setpos_DispString(3,1,"請牢記新密碼!");
  280.                                 delay_nms(1);
  281.                                 WritePasswordToBackupReg(password);        //保存新密碼
  282.                                 delay_nms(3000);
  283.                                 break;
  284.                         }
  285.                 }
  286.         }
  287. }

  288. /********************************************************************
  289. *名   稱: Input_Password()
  290. *功   能:輸入密碼
  291. *說   明:直到密碼輸入正確或新密碼設定完成才退出此函數
  292. *********************************************************************/
  293. void Input_Password()
  294. {
  295.         __IO uint16_t i,index=0;
  296.         __IO uint16_t faultcount = 0;
  297.         LCD_Clear();
  298.         delay_nms(1);
  299.         LCD_Setpos_DispString(1,1,"請輸入密碼:");
  300.         delay_nms(2);
  301.         LCD_Setpos(2,1);
  302.         delay_nms(1);
  303.         while(1)
  304.         {
  305.                 keyflag = 0;
  306.                 while(keyflag < 1)
  307.                 { }
  308.                 keyflag = 0;
  309.                 if(keyval<=9)
  310.                 {
  311.                   LCD_DispChar(keyval+'0');
  312.                   delay_nms(1);
  313.                   passwordtmp[index++] = keyval;
  314.                 }
  315.                 else if(keyval == 'c')                   //按下取消鍵
  316.                 {
  317.                         index--;
  318.                         passwordtmp[index]='

  319. [/color];
  320.                         LCD_Clear();
  321.                         delay_nms(1);
  322.                         LCD_Setpos_DispString(1,1,"請輸入密碼:");
  323.                 delay_nms(2);
  324.                 LCD_Setpos(2,1);
  325.                 delay_nms(1);
  326.                         for(i=0;passwordtmp[i]!='

  327. [/color];i++)
  328.                         {
  329.                                 LCD_DispChar(passwordtmp[i]+'0');
  330.                         }
  331.                         delay_nms(1);
  332.                 }
  333.                 else if(keyval=='e')                   //按下確認鍵
  334.                 {
  335.                     passwordtmp[index] = '

  336. [/color];  //密碼結束標記
  337.                         for(i=0;password[i]!='

  338. [/color];i++)
  339.                         {
  340.                                 if(passwordtmp[i] != password[i])
  341.                                 {
  342.                                         faultcount ++;
  343.                                         break;
  344.                                 }
  345.                         }
  346.                         if(faultcount == 3)
  347.                         {
  348.                                 faultcount = 0;
  349.                                 CLOSE_DOOR;
  350.                                 LCD_Clear();
  351.                                 delay_nms(1);
  352.                                 LCD_Setpos_DispString(2,1,"密碼已經錯誤 3次");
  353.                                 delay_nms(2);
  354.                                 LCD_Setpos_DispString(3,1,"等待 1分鐘后再試");
  355.                             delay_nms(60000); //密碼錯誤3次以后,等待1分鐘才可再次輸入
  356.                                 LCD_Clear();
  357.                                 delay_nms(1);
  358.                                 LCD_Setpos_DispString(1,1,"請再次輸入密碼:");
  359.                     delay_nms(2);
  360.                                 LCD_Setpos(2,1);
  361.                     delay_nms(2);
  362.                                 index = 0;
  363.                         }
  364.                         else if((faultcount >0) && (password[i]!='

  365. [/color]))
  366.                         {
  367.                                 CLOSE_DOOR;
  368.                                 LCD_Clear();
  369.                                 delay_nms(2);
  370.                                 LCD_Setpos_DispString(2,2,"密碼錯誤!");
  371.                                 delay_nms(1000);
  372.                                 LCD_Clear();
  373.                                 delay_nms(1);
  374.                                 LCD_Setpos_DispString(1,1,"請再次輸入密碼:");
  375.                     delay_nms(2);
  376.                                 LCD_Setpos(2,1);
  377.                     delay_nms(2);
  378.                                 index = 0;
  379.                         }
  380.                         if((password[i]=='

  381. [/color])&&(passwordtmp[i]=='

  382. [/color]))//輸入密碼正確
  383.                         {
  384.                           LCD_Clear();
  385.                           delay_nms(1);
  386.                           LCD_Setpos_DispString(2,3,"密碼正確!");
  387.                           delay_nms(2);
  388.                           LCD_Setpos_DispString(3,3,"鎖已打開!");


  389. …………限于本文篇幅 余下代碼請從51黑下載附件…………

復制代碼


回復

使用道具 舉報

ID:285821 發表于 2018-2-26 23:28 | 顯示全部樓層
HAOLIHAO 牛人
回復

使用道具 舉報

ID:285821 發表于 2018-2-27 21:28 | 顯示全部樓層
有用的資料
回復

使用道具 舉報

ID:287002 發表于 2018-3-2 17:00 | 顯示全部樓層
很好   學習了
回復

使用道具 舉報

ID:293829 發表于 2018-3-19 08:23 | 顯示全部樓層
厲害了我的大佬
回復

使用道具 舉報

ID:293829 發表于 2018-3-19 15:36 | 顯示全部樓層
積分被吞了,下載不了
回復

使用道具 舉報

ID:395465 發表于 2018-9-8 20:28 | 顯示全部樓層
厲害啊  大佬
回復

使用道具 舉報

ID:293829 發表于 2018-9-27 17:37 | 顯示全部樓層
下過的資料第二次下也要收黑幣?
回復

使用道具 舉報

ID:421358 發表于 2018-11-6 11:15 | 顯示全部樓層
有原理圖嘛
回復

使用道具 舉報

ID:393816 發表于 2019-5-6 10:09 | 顯示全部樓層
哇,好棒!
回復

使用道具 舉報

ID:528326 發表于 2019-5-6 11:02 | 顯示全部樓層
感謝樓主分享,謝謝大佬
回復

使用道具 舉報

ID:574789 發表于 2019-12-23 07:48 | 顯示全部樓層
用的什么板子
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区三区免费观看 | 黄色欧美大片 | 国产一区二区三区在线看 | 欧美黄 片免费观看 | 国产成人午夜电影网 | 在线精品一区二区 | 国产精品久久久久久久久久免费 | 久久日韩粉嫩一区二区三区 | 天天躁日日躁狠狠的躁天龙影院 | 亚洲视频免费观看 | 日韩网站在线观看 | 91综合在线观看 | av片免费| 日韩一区在线播放 | 玖玖视频网 | 欧美一级精品片在线看 | 蜜桃视频一区二区三区 | 久久久久亚洲av毛片大全 | a级在线免费 | 久草青青草 | 欧美中文字幕一区二区三区亚洲 | 国产中文一区二区三区 | 国产人成在线观看 | 中文字幕在线中文 | 在线一区观看 | 狠狠狠 | 中文字幕成人免费视频 | 日韩欧美精品在线 | 精品视频一区二区 | 三级黄视频在线观看 | 国产 日韩 欧美 中文 在线播放 | 久久久久国产精品人 | 91精品国产综合久久香蕉922 | 国产一区二区久久 | 国产大学生情侣呻吟视频 | 一区二区不卡 | 日韩在线视频播放 | 国产高清免费视频 | 国产区在线观看 | 免费视频99| 91在线播 |