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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4515|回復: 5
打印 上一主題 下一主題
收起左側

單片機實現簡單的密碼鎖設計思路與代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:758442 發表于 2020-5-22 16:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.     能設定一組4位的數字開啟密碼(設定密碼功能)
2.     用LED小燈代替鎖開啟顯示,輸入密碼正確,則小燈亮起(開鎖功能)
3.     如果3次密碼錯誤,則進行鳴叫報警,并在1分鐘之內不能再次輸入(報警功能)
4.     密碼輸入顯示在數碼管上,輸入正確顯示on,輸入錯誤顯示err(顯示功能)
5.     可在以上功能上擴展。

整體要做的事情有:
1.初始化硬件
2.函數功能的實現
2.1按鍵掃描實現
2.2按鍵處理
2.3時間處理函數

設計思路為:先進行各種變量的初始化,然后循環執行三個子函數,其中在初始化函數里打開定時器,定時器裝載初值溢出時間為2ms,進入中斷執行一次數碼管顯示函數,由于人眼的余暉效應,人眼看到的是8個數碼管持續同時亮,當有按鍵按下時則會進入按鍵掃描函數,繼而得到鍵值進入按鍵服務函數,繼而進入時間服務函數,由于定時器每2ms顯示一次數碼管,所以有按鍵按下時,可以及時的顯示按鍵對應的操作

總結:做了一個簡單的密碼鎖,主要的顯示功能是用過定時中斷進行操作的,其余的函數都是為了服務中斷函數而設置的,對于最后的結果分析,達到了設計要求的基本功能,即設定密碼功能、開鎖功能、報警功能、顯示功能。除此之外還增加了撤銷功能,關閉和打開屏幕功能,確認功能修改密碼功能以及其他小的細節功能。

單片機源程序如下:
  1. #include "reg52.H"
  2. #include "stdio.h"
  3. #include "intrins.h"

  4. unsigned char key_value;

  5. #define  DIG_SEG   P0//段選
  6. #define  DIG_PLA   P2//位選
  7. unsigned char code dig_tab[24] =//共陰數碼管碼表
  8. {
  9.                 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0、1、2、3、4、5、6、7、
  10.                 0x7f,0x6f,0x77,0x00,0x39,0x5e,0x79,0x71,//8、9、A、B、C、D、E、F、
  11.                 0x40,0x00,0x30,0x37,0x73,0x79,0x70//-,關,I,N,P,E,R
  12. };
  13. unsigned char dis_code[8] = 0;//顯示數組
  14. unsigned char dig_show_tmp = 0;//顯示臨時變量

  15. unsigned char now_window;//當前顯示窗口
  16. #define  inputpassword  10;//輸入密碼狀態
  17. unsigned char password_now[7]={2,2,3,4,5,6};//輸入當前密碼保存數組
  18. unsigned char password[7]={1,2,3,1,2,3};//密碼保存
  19. signed          char curr_bit;//輸入當前位
  20. unsigned char curr_bit_tmp;//輸入當前位備份
  21. unsigned char i;//臨時計數變量
  22. unsigned char cnt_50ms;//中斷50ms計數
  23. unsigned char time_50ms_flag;//50ms標志
  24. unsigned char open_del;//開鎖成功延時計數
  25. unsigned char open_flag;//鎖狀態標志
  26. sbit relay = P1^0;//繼電器
  27. /*******************************************************************************
  28. * 函 數 名         : delay_ms
  29. * 函數功能                   : 延時函數,延時1ms
  30. * 輸    入         : cnt
  31. * 輸    出         : 無
  32. * 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
  33. *******************************************************************************/
  34. void delay_ms(unsigned int cnt)   //
  35. {
  36.         unsigned int x;
  37.         for( ; cnt>0; cnt--)
  38.         {
  39.                 for(x=110; x>0; x--);//軟件延時為1MS
  40.         }
  41. }
  42. /******************************************************
  43. ** 函數名:time_init
  44. ** 描述  :定時器初始化
  45. ** 輸入  :無
  46. ** 輸出  :無
  47. ******************************************************/
  48. void time_init(void)
  49. {
  50.           TMOD |= 0x01;//time0 工作方式為1
  51.           TH0 = 0xf8;//裝載初值
  52.           TL0 = 0x2f;//裝載初值,為2ms(65535-63535)
  53.       TR0 = 1;//開啟定時器
  54.           ET0 = 1;//打開中斷
  55.           EA=1;
  56. }
  57. /******************************************************
  58. ** 函數名:key_scan
  59. ** 描述  :按鍵掃描
  60. ** 輸入  :無
  61. ** 輸出  :無
  62. ******************************************************/
  63. void key_scan(void)
  64. {
  65.         static unsigned char key_in_flag = 0;//按鍵按下標志
  66.         unsigned char key_l,key_h;//存儲掃描到行列值。
  67.         key_value = 20;//按鍵值清除
  68.         P3 = 0xf0;
  69.         if((P3 & 0xf0) != 0xf0)//按鍵按下
  70.         {
  71.                 delay_ms(5);//按鍵消抖動
  72.                 if(((P3 & 0xf0) != 0xf0) && (key_in_flag == 1))
  73.                 {
  74.                         key_in_flag = 0;//松手檢測防止一直觸發
  75.                         key_l = P3;//掃描得到行值
  76.                         P3 = 0x0f;
  77.                         key_h= P3;////掃描得到列值
  78.                         switch(key_l|key_h)
  79.                         {
  80.                                 //獲取按鍵值
  81.                                 case 0xee:  key_value = 1;break;
  82.                                 case 0xed:  key_value = 2;break;
  83.                                 case 0xeb:  key_value = 3;break;
  84.                                 case 0xe7:  key_value = 10;break;

  85.                                 case 0xde:  key_value = 4;break;
  86.                                 case 0xdd:  key_value = 5;break;
  87.                                 case 0xdb:  key_value = 6;break;
  88.                                 case 0xd7:  key_value = 11;break;

  89.                                 case 0xbe:  key_value = 7;break;
  90.                                 case 0xbd:  key_value = 8;break;
  91.                                 case 0xbb:  key_value = 9;break;
  92.                                 case 0xb7:  key_value = 12;break;

  93.                                 case 0x7e:  key_value = 13;break;
  94.                                 case 0x7d:  key_value = 0;break;
  95.                                 case 0x7b:  key_value = 14;break;
  96.                                 case 0x77:  key_value = 15;break;
  97.                         }
  98.                 }
  99.         }
  100.         else
  101.         {
  102.                 key_in_flag = 1;//(按鍵松開標志)
  103.         }
  104. }
  105. void dis_dri(void)
  106. {

  107.                            static unsigned char dis_step = 1;
  108.                            DIG_SEG = 0x00;
  109.                            switch(dis_step)
  110.                            {
  111.                                   case 1:  //顯示第1位
  112.                                   {
  113.                                            dig_show_tmp=dig_tab[dis_code[0]];

  114.                                                    DIG_SEG = dig_show_tmp;
  115.                                                    DIG_PLA = 0xfe;
  116.                                   }
  117.                                   break;
  118.                                   case 2:  //顯示第2位
  119.                                   {
  120.                                            dig_show_tmp=dig_tab[dis_code[1]];

  121.                                                    DIG_SEG = dig_show_tmp;
  122.                                                    DIG_PLA = 0xfd;
  123.                                   }
  124.                                   break;
  125.                   case 3:  //顯示第3位
  126.                                   {
  127.                                            dig_show_tmp=dig_tab[dis_code[2]];

  128.                                                    DIG_SEG = dig_show_tmp;
  129.                                                    DIG_PLA = 0xfb;
  130.                                   }
  131.                                   break;
  132.                   case 4:  //顯示第4位
  133.                                   {
  134.                                            dig_show_tmp=dig_tab[dis_code[3]];

  135.                                                    DIG_SEG = dig_show_tmp;
  136.                                                    DIG_PLA = 0xf7;
  137.                                   }
  138.                                   break;
  139.                   case 5:  //顯示第5位
  140.                                   {
  141.                                            dig_show_tmp=dig_tab[dis_code[4]];

  142.                                                    DIG_SEG = dig_show_tmp;
  143.                                                    DIG_PLA = 0xef;
  144.                                   }
  145.                                   break;
  146.                   case 6:  //顯示第6位
  147.                                   {
  148.                                            dig_show_tmp=dig_tab[dis_code[5]];

  149.                                                    DIG_SEG = dig_show_tmp;
  150.                                                    DIG_PLA = 0xdf;
  151.                                   }
  152.                                   break;
  153.                   case 7:  //顯示第7位
  154.                                   {
  155.                                            dig_show_tmp=dig_tab[dis_code[6]];

  156.                                                    DIG_SEG = dig_show_tmp;
  157.                                                    DIG_PLA = 0xbf;
  158.                                   }
  159.                                   break;
  160.                   case 8:  //顯示第8位
  161.                                   {
  162.                                            dig_show_tmp=dig_tab[dis_code[7]];

  163.                                                    DIG_SEG = dig_show_tmp;
  164.                                                    DIG_PLA = 0x7f;
  165.                                   }
  166.                                   break;

  167.                            }
  168.                            dis_step++;
  169.                            if(dis_step>8)        //掃描完8個數碼管后,重新從第一個開始掃描
  170.                            {
  171.                                   dis_step=1;
  172.                            }
  173. }
  174. /******************************************************
  175. ** 函數名:alm
  176. ** 描述  :定時閃爍函數
  177. ** 輸入  : 無
  178. ** 輸出  :無
  179. ** 調用  :中斷調用
  180. ******************************************************/
  181. void time_service(void)
  182. {
  183.                 if(time_50ms_flag)//50ms時間到標志
  184.                 {
  185.                         time_50ms_flag = 0;//50ms時間到標志清零
  186.                         if (relay==0)//開鎖后延時關鎖
  187.                         {
  188.                                 open_del++;
  189.                                 if(open_del >= 20 * 5)        //5秒
  190.                                 {
  191.                                         open_del = 0;
  192.                                     relay = 1;   //關閉密碼鎖
  193.                                     dis_code[0] = 17;
  194.                                         dis_code[1] = 17;
  195.                                         dis_code[2] = 17;
  196.                                         dis_code[3] = 17;
  197.                                         dis_code[4] = 17;
  198.                                         dis_code[5] = 17;
  199.                                         dis_code[6] = 19;
  200.                                         dis_code[7] = 18;
  201.                                 }
  202.                         }
  203.                         if (open_flag)//輸入錯誤顯示
  204.                         {
  205.                                 open_del++;
  206.                                 if(open_del >= 20 * 2)
  207.                                 {
  208.                                         open_del = 0;
  209.                                         open_flag = 0;
  210.                                     relay = 1;   //關閉密碼鎖
  211.                                     dis_code[0] = 17;
  212.                                         dis_code[1] = 17;
  213.                                         dis_code[2] = 17;
  214.                                         dis_code[3] = 17;
  215.                                         dis_code[4] = 17;
  216.                                         dis_code[5] = 17;
  217.                                         dis_code[6] = 19;
  218.                                         dis_code[7] = 18;
  219.                                 }
  220.                         }
  221.                 }
  222. }
  223. /******************************************************
  224. ** 函數名:key_service
  225. ** 描述  :按鍵服務函數
  226. ** 輸入  :無
  227. ** 輸出  :無
  228. ** 調用  :主程序
  229. ******************************************************/
  230. void key_service(void)
  231. {
  232.                 switch (key_value)
  233.                 {
  234.                         case 1: case 2:case 3:
  235.                         case 4: case 5:case 6:
  236.                         case 7: case 8:case 9:case 0:
  237.                         {
  238.                                 password_now[curr_bit] = key_value;
  239.                                 if (++curr_bit>6)//輸入6位密碼
  240.                                 {
  241.                                         curr_bit = 6;
  242.                                 }
  243.                                 curr_bit_tmp = curr_bit;
  244.                                 for(i=0;i<curr_bit_tmp;i++)//顯示
  245.                                 dis_code[i] = 16;//顯示一桿
  246.                         }
  247.                         break;
  248.                         case 14://退格鍵#
  249.                         {
  250.                                 password_now[curr_bit] = 20;
  251.                                 if (--curr_bit<0)
  252.                                         curr_bit = 0;
  253.                                 dis_code[curr_bit] = 17;//不顯示
  254.                         }
  255.                         break;
  256.                         case 15://按下確認鍵D
  257.                         {
  258.                                 if(
  259.                                         password_now[0] == password[0]&&
  260.                                     password_now[1] == password[1]&&
  261.                                         password_now[2] == password[2]&&
  262.                                         password_now[3] == password[3]&&
  263.                                         password_now[4] == password[4]&&
  264.                                         password_now[5] == password[5]
  265.                                   )//密碼比較
  266.                                 {
  267.                                         dis_code[0] = 17;//輸入正確open
  268.                                         dis_code[1] = 17;
  269.                                         dis_code[2] = 19;
  270.                                         dis_code[3] = 21;
  271.                                         dis_code[4] = 20;
  272.                                         dis_code[5] = 0;
  273.                                         dis_code[6] = 17;
  274.                                         dis_code[7] = 17;
  275.                                         relay = 0;
  276.                                 }
  277.                                 else//輸入錯誤顯示ERR
  278.                                 {
  279.                                         dis_code[0] = 17;
  280.                                         dis_code[1] = 17;
  281.                                         dis_code[2] = 22;
  282.                                         dis_code[3] = 22;
  283.                                         dis_code[4] = 21;
  284.                                         dis_code[5] = 17;
  285.                                         dis_code[6] = 17;
  286.                                         dis_code[7] = 17;
  287.                                         open_flag = 1;
  288.                                 }
  289.                                 for(i = 0;i < 6;i++)
  290.                                 {
  291.                                   password_now[i] = 0;
  292.                                   curr_bit = 0;
  293.                                   curr_bit_tmp = 0;
  294.                                 }
  295.                         }
  296.                         break;
  297.                         case 10://A設置密碼
  298.                         {
  299.                                         password[0] = 2;
  300.                                         password[1] = 2;
  301.                                         password[2] = 2;
  302.                                         password[3] = 2;
  303.                                         password[4] = 2;
  304.                                         password[5] = 2;
  305.                         }
  306.                         break;
  307.                         case 11://B設置密碼
  308.                         {
  309.                                         password[0] = 3;
  310.                                         password[1] = 3;
  311.                                         password[2] = 3;
  312.                                         password[3] = 3;
  313.                                         password[4] = 3;
  314.                                         password[5] = 3;
  315.                         }
  316.                         break;
  317.                         case 12://C設置密碼
  318.                         {
  319.                                         password[0] = 4;
  320.                                         password[1] = 4;
  321.                                         password[2] = 4;
  322.                                         password[3] = 4;
  323.                                         password[4] = 4;
  324.                                         password[5] = 4;
  325.                         }
  326.                         break;

  327.                 }
  328. }
  329. /******************************************************
  330. ** 函數名:init_all_hardware
  331. ** 描述  :初始化所有硬件,及其變量參數。
  332. ** 輸入  :無
  333. ** 輸出  :無
  334. ** 調用  :主程序
  335. ******************************************************/
  336. void init_all_hardware(void)
  337. {
  338.                    delay_ms(100);
  339.                 time_init();//定時器初始化
  340.                 key_value = 20;
  341.         dis_code[0] = 17;
  342.                 dis_code[1] = 17;
  343.                 dis_code[2] = 17;
  344.                 dis_code[3] = 17;
  345.                 dis_code[4] = 17;
  346.                 dis_code[5] = 17;
  347.                 dis_code[6] = 19;
  348.                 dis_code[7] = 18;//顯示IN
  349.                 now_window = inputpassword;//跳入輸入密碼
  350.                 cnt_50ms = 0;
  351.                 time_50ms_flag = 0;
  352.                 open_del = 0;
  353.                 relay = 1;
  354.                 curr_bit = 0;
  355.                 open_flag = 0;
  356. }
  357. void main(void)
  358. {
  359.          init_all_hardware();//初始化硬件,IO和定時器
  360.          while(1)
  361.          {
  362.                  key_scan();//按鍵掃描
  363.                  key_service();//按鍵服務處理函數
  364.                  time_service();//時間處理函數
  365.          }
  366. }
  367. /******************************************************
  368. ** 函數名:time0_interrupt
  369. ** 描述  :按鍵掃描函數
  370. ** 輸入  :無
  371. ** 輸出  :無
  372. ******************************************************/
  373. void time0_interrupt() interrupt 1
  374. {
  375.            TF0 = 0;//清除標志
  376.            TR0 = 0;
  377.            dis_dri();//動態掃描數碼管
  378.            if (++cnt_50ms>25)
  379.            {
  380.                         cnt_50ms = 0;
  381.                         time_50ms_flag = 1;
  382.            }
  383.            TR0 = 1;
  384.            TH0 = 0xf8;
  385.            TL0 = 0x2f;//裝載初值2ms(65535-63535)
  386. }
復制代碼

所有資料51hei提供下載:
密碼鎖代碼.rar (31.78 KB, 下載次數: 22)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:758442 發表于 2020-5-22 16:20 | 只看該作者
只是一個小設計,做的很水,算是達到了基本的要求,另外加了一些功能
回復

使用道具 舉報

板凳
ID:663741 發表于 2020-5-27 11:32 | 只看該作者
有沒有原理圖?
回復

使用道具 舉報

地板
ID:773272 發表于 2020-6-9 18:38 | 只看該作者
你這代碼和你寫的要求是一致的嗎
回復

使用道具 舉報

5#
ID:773272 發表于 2020-6-9 18:46 | 只看該作者
求和你的要求一致的仿真圖和源代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品 | 午夜视频在线观看视频 | 日本欧美在线观看视频 | 免费精品在线视频 | 日韩av成人在线观看 | 在线免费观看毛片 | 欧美一区二区三区在线播放 | 国产欧美日韩精品一区 | 久久久久久久久久性 | 国产精品视频播放 | 在线观看日韩av | 国产九九九九 | av av在线| 亚洲精品一区二区在线 | av免费入口| 成人久久久久 | 久久久久久久久久久高潮一区二区 | 蜜桃av鲁一鲁一鲁一鲁 | 国产精品国产精品国产专区不片 | 久草.com| 国产黄色大片在线免费观看 | 欧美日韩网站 | 在线色网 | 成人av高清 | 欧美成人高清 | 亚洲综合一区二区三区 | 亚洲综合天堂网 | 久久国内精品 | 精品一区二区久久久久久久网站 | 精精国产xxxx视频在线播放7 | 欧美日韩1区2区3区 欧美久久一区 | 国产精品久久久久久久久免费相片 | 亚洲va欧美va人人爽午夜 | 久久久久亚洲av毛片大全 | 中文字幕 欧美 日韩 | 干干天天 | 国产福利在线小视频 | 成人免费网站视频 | 久久亚洲一区二区三区四区 | 亚洲a视频 | 精品日韩在线 |