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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2348|回復: 3
收起左側

51單片機密碼鎖程序設計

[復制鏈接]
ID:764847 發表于 2020-5-30 10:46 | 顯示全部樓層 |閱讀模式
這是簡單密碼鎖設計,設計的
04RI)$WTN8V_14Z2Y4_$QP9.png
  1. //定義IO口
  2. sbit Beep=P3^6;
  3. sbit LED1=P3^7;
  4. //定義全局變量
  5. int count=-1;
  6. int count1=0;//用于記錄輸入密碼錯誤的次數
  7. int counter;//用于計數是定時器能夠定時1分鐘
  8. int counter1=0;
  9. int temp=99,signal=0;
  10. //初始化密碼
  11. int key_word[4]={99,99,99,99};
  12. //用于接收按鍵接收的值
  13. int get_word[4]={0,0,0,0};
  14. char key_buf[]={0xee,0xde,0xbe,0x7e,
  15.                                 0xed,0xdd,0xbd,0x7d,
  16.                                 0xeb,0xdb,0xbb,0x7b,
  17.                 0xe7,0xd7,0xb7,0x77};//鍵模
  18. //LED字模
  19. char led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
  20. //函數聲明
  21. void set_key();
  22. void show1(int);
  23. void open_key();
  24. void input_key();
  25. void show2(int);
  26. void show3();
  27. void show4();
  28. int get_key();
  29. //延時函數
  30. void delay(int x)
  31. {
  32.         int j=0;
  33.         for(;x>0;x--)
  34.                 for(j=0;j<125;j++);
  35. }

  36. //設定密碼功能
  37. void set_key()
  38. {
  39.         int i;
  40.         for(i=0;i<4;i++)
  41.         {        
  42.                 while(get_key()==-1)//等待按鍵按下
  43.                 {
  44.                         if(count!=0&&count!=-1)
  45.                         {
  46.                                 show1(count);//顯示設置的密碼
  47.                         }
  48.                 }
  49.                 if(signal==1)//將按鍵的值保存
  50.                 {
  51.                         key_word[i]=get_key();
  52.                         count++;
  53.                         show1(count);
  54.                         signal=0;
  55.                         temp=99;
  56.                 }
  57.                 while(temp==get_key())//一旦長時間按按鍵,就一直顯示密碼
  58.                 {        
  59.                         show1(count);
  60.                 }
  61.         }
  62. }

  63. //輸入密碼
  64. void input_key()
  65. {
  66.         int i;
  67.         for(i=0;i<4;i++)
  68.         {        
  69.                 while(get_key()==-1)//等待按鍵按下
  70.                 {
  71.                         if(count!=0&&count!=-1)
  72.                         {
  73.                                 show2(count);//顯示設置的密碼
  74.                         }
  75.                 }
  76.                 if(signal==1)//將按鍵的值保存
  77.                 {
  78.                         get_word[i]=get_key();
  79.                         count++;
  80.                         show2(count);
  81.                         signal=0;
  82.                         //temp=99;
  83.                 }
  84.                 while(temp==get_key())//一旦長時間按按鍵,就一直顯示密碼
  85.                 {        
  86.                         show2(count);
  87.                 }
  88.         }
  89. }
  90. //顯示輸入的密碼
  91. void show2(int count)
  92. {
  93.         if(count==0)//顯示1位數據
  94.         {
  95.                 P1=0x0e;
  96.                 P0=led[get_word[0]];
  97.         }
  98.         if(count==1)//顯示2位數據
  99.         {
  100.                 P1=0x0e;
  101.                 P0=led[get_word[0]];
  102.                 delay(10);
  103.                 P1=0x0d;
  104.                 P0=led[get_word[1]];
  105.                 delay(10);
  106.         }
  107.         
  108.         if(count==2)//顯示3位數據
  109.         {
  110.                 P1=0x0e;
  111.                 P0=led[get_word[0]];
  112.                 delay(10);
  113.                 P1=0x0d;
  114.                 P0=led[get_word[1]];
  115.                 delay(10);
  116.                 P1=0x0b;
  117.                 P0=led[get_word[2]];
  118.                 delay(10);
  119.         }
  120.         if(count==3)//顯示4位數據
  121.         {
  122.                         P1=0x0e;
  123.                         P0=led[get_word[0]];
  124.                         delay(10);
  125.                         P1=0x0d;
  126.                         P0=led[get_word[1]];
  127.                         delay(10);
  128.                         P1=0x0b;
  129.                         P0=led[get_word[2]];
  130.                         delay(10);
  131.                         P1=0x07;
  132.                         P0=led[get_word[3]];
  133.                         delay(10);
  134.                         P0=0;
  135.                         //count=-1;
  136.                         signal=0;
  137.         }
  138. }
  139. //顯示設置的密碼
  140. void show1(int count)
  141. {
  142.         int i;
  143.         if(count==0)//顯示一位數據
  144.         {
  145.                 P1=0x0e;
  146.                 i=key_word[0];
  147.                 P0=led[i];
  148.         }
  149.         if(count==1)//顯示兩位數據
  150.         {
  151.                 P1=0x0e;
  152.                 P0=led[key_word[0]];
  153.                 delay(10);
  154.                 P1=0x0d;
  155.                 P0=led[key_word[1]];
  156.                 delay(10);
  157.         }
  158.         
  159.         if(count==2)//顯示三位數據
  160.         {
  161.                 P1=0x0e;
  162.                 P0=led[key_word[0]];
  163.                 delay(10);
  164.                 P1=0x0d;
  165.                 P0=led[key_word[1]];
  166.                 delay(10);
  167.                 P1=0x0b;
  168.                 P0=led[key_word[2]];
  169.                 delay(10);
  170.         }
  171.         if(count==3)//顯示四位數據
  172.         {
  173.                 P1=0x0e;
  174.                 P0=led[key_word[0]];
  175.                 delay(10);
  176.                 P1=0x0d;
  177.                 P0=led[key_word[1]];
  178.                 delay(10);
  179.                 P1=0x0b;
  180.                 P0=led[key_word[2]];
  181.                 delay(10);
  182.                 P1=0x07;
  183.                 P0=led[key_word[3]];
  184.                 delay(10);
  185.                 P0=0;
  186.                 count=-1;
  187.                 signal=0;
  188.         }
  189. }


  190. //主函數
  191. void main()
  192. {
  193.         int op;
  194.         LED1=0;
  195.         Beep=1;
  196.         while(1)
  197.         {
  198.                 op=get_key();
  199.                 switch(op)
  200.                 {
  201.                         case 13:
  202.                                         while(temp==get_key());//等待選擇功能按鍵釋放后再進行設置密碼
  203.                                         count=-1;//在使用標志位時將標志位進行初始化
  204.                                         signal=1;
  205.                                         set_key();
  206.                                         break;
  207.                         
  208.                         case 14:
  209.                                         while(temp==get_key());
  210.                                         count=-1;//初始化標志位
  211.                                         signal=1;
  212.                                         input_key();
  213.                                         while(get_key()!=15)//當按下登陸鍵,輸入的密碼不再顯示
  214.                                         {
  215.                                                 show2(count);
  216.                                         }
  217.                                         if(compare()==-1)
  218.                                         {
  219.                                                 count1++;
  220.                                                 while(get_key()!=14&&count1!=3)
  221.                                                 {
  222.                                                         show3();//密碼錯誤,顯示ERR
  223.                                                 }
  224.                                                 P0=0;//按下輸入密碼鍵后,清屏
  225.                                                 if(count1==3)
  226.                                                 {
  227.                                                         //開啟定時器中斷
  228.                                                         TMOD=0x01;
  229.                                                         TH0=0x9E;//裝載初值25ms
  230.                                                         TL0=0x58;
  231.                                                         EA=1; //開總中斷
  232.                                                         ET0=1;//開定時器0
  233.                                                         TR0=1;  //開啟定時器0
  234.                                                         while(counter1<60);//只有當蜂鳴器響完一分鐘之后,才能退出循環
  235.                                                         TR0=0;//關閉定時器
  236.                                              }
  237.                                         }
  238.                                         else
  239.                                         {        
  240.                                                 LED1=1;//當輸入密碼正確時,開啟LED燈
  241.                                                 while(get_key()!=12)//直到按下退出鍵,屏幕一直顯示on
  242.                                                 {
  243.                                                         show4();
  244.                                                 }
  245.                                                 LED1=0;//退出后關閉LED燈
  246.                                                 P0=0;//清屏
  247.                                         }
  248.                                         break;
  249.                         default:break;               
  250.                 }
  251.         }

  252. }

  253. //獲取鍵值
  254. int get_key()
  255. {
  256.         char key_scan[]={0xef,0xdf,0xbf,0x7f};
  257.         int i=0;
  258.         int j=0;
  259.         for(i=0;i<4;i++)//判斷
  260.         {
  261.                 P2=key_scan[i];
  262.                 if((P2&0x0f)!=0x0f)
  263.                 {
  264.                         for(j=0;j<16;j++)
  265.                         {
  266.                                 if(key_buf[j]==P2)
  267.                                 {
  268.                                         if(temp!=key_buf[j])//一旦長時間按鍵,將只會讀取一次按鍵的值
  269.                                         {
  270.                                                 signal=1;
  271.                                                 temp=j;
  272.                                                 return j;
  273.                                         }
  274.                                         else signal=0;
  275.                                 }
  276.                         }
  277.                 }
  278.         }
  279.         return -1;
  280. }




  281. //輸入的密碼和設定的密碼比較
  282. int compare()
  283. {
  284.         int i;
  285.         for(i=0;i<4;i++)
  286.         {
  287.                 if(get_word[i]!=key_word[i])
  288.                         return -1;//輸入密碼不等于設定的密碼返回-1
  289.         }
  290.         return 1;//輸入的密碼等于設定密碼返回1
  291. }

  292. void show3()//顯示ERR
  293. {
  294.         P1=0x0e;
  295.         P0=0x79;
  296.         delay(10);
  297.         P1=0x0d;
  298.         P0=0x77;
  299.         delay(10);
  300.         P1=0x0b;
  301.         delay(10);
  302. }
  303. void show4()//顯示on
  304. {
  305.         P1=0x0e;
  306.         P0=0x5c;
  307.         delay(10);
  308.         P1=0x0d;
  309.         P0=0x54;
  310.         delay(10);
  311. }

  312. //定時器中斷函數,定時1分鐘
  313. call_police() interrupt 1
  314. {
  315.         counter++;
  316.         if(counter==39)
  317.         {        
  318.                 counter=0;
  319.                 Beep=~Beep;
  320.                 counter1++;
  321.                 if(counter1==60)//定時一分鐘
  322.                 {
  323.                         count1=0;
  324.                         Beep=1;//關閉定時器
  325.                 }
  326.         }
  327.         else
  328.         {
  329.                 TH0=0x9E;
  330.                 TL0=0x58;
  331.         }
  332. }
復制代碼
比較簡單
回復

使用道具 舉報

ID:773272 發表于 2020-6-9 16:28 | 顯示全部樓層
為什么我的沒反應?
回復

使用道具 舉報

ID:613116 發表于 2020-6-12 19:35 | 顯示全部樓層
邏輯應該清晰一點,功能都比較完善了,代碼結構能清晰點就好了
回復

使用道具 舉報

ID:613116 發表于 2020-6-12 19:46 | 顯示全部樓層
其實用數碼管顯示讓整個代碼顯得很冗長,可以嘗試用下1602液晶
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操夜夜爽 | 在线欧美一区 | 午夜成人在线视频 | 精品一区二区三区av | 最新高清无码专区 | 久久精品二区亚洲w码 | 免费能直接在线观看黄的视频 | 毛片软件 | 91国内精精品久久久久久婷婷 | 亚洲电影在线播放 | 久久久女女女女999久久 | 在线观看h视频 | 国产 欧美 日韩 一区 | 久久精品日产第一区二区三区 | 嫩草国产| 精产国产伦理一二三区 | 亚洲一区二区三区免费在线观看 | 国产精品中文字幕在线 | 看av网址| 欧美中文字幕一区二区三区亚洲 | 欧美午夜一区 | 神马影院一区二区三区 | 中国美女av | 黄色大片在线 | 久久综合激情 | 伊人电影院av| 免费一级黄| 欧美成年人视频在线观看 | 亚洲欧美日韩精品久久亚洲区 | 成人3d动漫一区二区三区91 | 伊人网综合 | 一区二区三区观看视频 | 成人在线一区二区 | 日日夜夜草 | 91免费在线 | 国产亚洲精品精品国产亚洲综合 | 国产精品久久久久久久久免费软件 | 一区二区高清 | 国产一区二区视频在线 | 国产日韩欧美 | 国产午夜精品一区二区三区四区 |