找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3709|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于普中51A2單片機開發(fā)板的電子鎖程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:952422 發(fā)表于 2021-7-20 10:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用矩陣按鍵 蜂鳴器 數(shù)碼管 定時器制作的一款電子鎖
輸入密碼時顯示為8.
密碼正確顯示-------------
密碼錯誤顯示ERROR
每次正確和錯誤蜂鳴器都會有不同的響聲
錯誤達到三次鍵盤會被鎖定20秒
在鎖定中如果還有按鍵按下 則鎖定時間重置

源代碼如下:
  1. #include <reg52.h>
  2. #include <stdlib.h>

  3. #define GPIO_KEY P1
  4. #define num 8  //密碼位數(shù)

  5. sbit bee=P1^5;

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. unsigned int answer[8]={1,2,3,4,5,6,7,8};  //已設(shè)置密碼
  10. unsigned int int_answer[8]={0,0,0,0,0,0,0,0};                                                //鍵盤輸入的密碼
  11. int key=-1;                                                                        //鍵值
  12. unsigned int error_times=0;                                                                //已錯誤次數(shù)
  13. unsigned char key_flag=0,a_flag=-1;
  14. unsigned int wei[8]={0};
  15. unsigned int T0Count=0;
  16. int *as;
  17. bit timer_flag=0;
  18. bit stop_flag=0;
  19. unsigned int code smgduan[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};

  20. /*0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d
  21.    0              1              2           3        4     5
  22. 0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c
  23.    6           7             8             9      A     B
  24. 0x39 , 0x5e , 0x79 , 0x71 , 0x00
  25.    C    D        E      F             NULL
  26. */

  27. void Timer0Init(void)                //10毫秒@11.0592MHz
  28. {
  29.         TMOD &= 0xF0;                //設(shè)置定時器模式
  30.         TMOD |= 0x01;                //設(shè)置定時器模式
  31.         TL0 = 0x00;                //設(shè)置定時初值
  32.         TH0 = 0xDC;                //設(shè)置定時初值
  33.         TF0 = 0;                //清除TF0標志
  34.         TR0 = 1;                //定時器0開始計時
  35.         ET0=1;
  36.         EA=1;
  37.         
  38. }

  39. void delay(unsigned int a)
  40. {
  41.         while(a--);
  42. }

  43. int keyDown()
  44. {
  45.         unsigned int a=0;
  46.                 GPIO_KEY=0x0f;
  47.         if(GPIO_KEY!=0x0f)
  48.         {
  49.                 delay(1000);
  50.                
  51.                 if(GPIO_KEY!=0x0f)
  52.                 {
  53.                         GPIO_KEY=0x0f;
  54.                         switch(GPIO_KEY)
  55.                         {
  56.                                 case 0x07:key=0;break;
  57.                                 case 0x0b:key=1;break;
  58.                                 case 0x0d:key=2;break;
  59.                                 case 0x0e:key=3;break;
  60.                         }
  61.                         GPIO_KEY=0xf0;
  62.                         switch(GPIO_KEY)
  63.                         {
  64.                                 case 0x70:key=key;break;
  65.                                 case 0xb0:key=key+4;break;
  66.                                 case 0xd0:key=key+8;break;
  67.                                 case 0xe0:key=key+12;break;
  68.                         }
  69.                         while((a<50)&&(GPIO_KEY!=0xf0))
  70.                         {
  71.                                 delay(1000);
  72.                                 a++;
  73.                         }
  74.                         key_flag=1;
  75.                 }
  76.         }
  77.                 return key;
  78. }

  79. void display() //數(shù)碼管顯示
  80. {
  81.                          LSA=0;LSB=0;LSC=0;P0=smgduan[wei[7]];delay(10);P0=0x00;
  82.                          LSA=1;LSB=0;LSC=0;P0=smgduan[wei[6]];delay(10);P0=0x00;
  83.                          LSA=0;LSB=1;LSC=0;P0=smgduan[wei[5]];delay(10);P0=0x00;
  84.                          LSA=1;LSB=1;LSC=0;P0=smgduan[wei[4]];delay(10);P0=0x00;
  85.                          LSA=0;LSB=0;LSC=1;P0=smgduan[wei[3]];delay(10);P0=0x00;
  86.                          LSA=1;LSB=0;LSC=1;P0=smgduan[wei[2]];delay(10);P0=0x00;
  87.                          LSA=0;LSB=1;LSC=1;P0=smgduan[wei[1]];delay(10);P0=0x00;
  88.                          LSA=1;LSB=1;LSC=1;P0=smgduan[wei[0]];delay(10);P0=0x00;
  89. }

  90. void display_no()
  91. {
  92.         wei[0]=15;
  93.         wei[1]=11;
  94.         wei[2]=11;
  95.         wei[3]=1;
  96.         wei[4]=11;
  97.         wei[5]=0;
  98.         wei[6]=0;
  99.         wei[7]=0;
  100.         display();
  101. }

  102. void display_yes()
  103. {
  104.         int i;
  105.         for(i=0;i<8;i++)
  106.         {
  107.                 wei[i]=17;
  108.         }
  109.         display();
  110. }

  111. /*void display_ans()
  112. {
  113.         
  114.         wei[7]=int_answer[0];
  115.         wei[6]=int_answer[1];
  116.         wei[5]=int_answer[2];
  117.         wei[4]=int_answer[3];
  118.         wei[3]=int_answer[4];
  119.         wei[2]=int_answer[5];
  120.         wei[1]=int_answer[6];
  121.         wei[0]=int_answer[7];
  122.         
  123.         display();
  124. }*/

  125. void beep(unsigned int mode)
  126. {
  127.         int k=0;
  128.         if(mode==1) //錯誤提示音
  129.         {
  130.                 do
  131.                 {
  132.                                 bee=~bee;
  133.                         delay(200);
  134.                         k++;
  135.                 }while(k<=1000);
  136.                 k=0;
  137.         }
  138.         else if(mode==2) //正確提示音
  139.         {
  140.                 do
  141.                 {
  142.                         bee=~bee;
  143.                         delay(100);
  144.                         k++;
  145.                 }while(k<=1000);
  146.                 k=0;
  147.         }
  148. }

  149. void stop() //暫停鍵盤三秒
  150. {
  151.                 stop_flag=1;
  152.          do
  153.          {
  154.                  key=-1;
  155.                         keyDown();
  156.                  if(key!=-1)
  157.                          T0Count=0;
  158.                  wei[0]=10;
  159.                  display();
  160.          }while(timer_flag==0);
  161. }

  162. /*void convert()
  163. {
  164.         switch(key)
  165.         {
  166.                 case 0:key_flag=0;break;
  167.                 case 1:key=0;key_flag=1;break;
  168.                 case 2:key_flag=0;break;
  169.                 case 3:key_flag=0;break;
  170.                 case 4:key=1;key_flag=1;break;
  171.                 case 5:key=2;key_flag=1;break;
  172.                 case 6:key=3;key_flag=1;break;
  173.                 case 7:key_flag=0;break;
  174.                 case 8:key=4;key_flag=1;break;
  175.                 case 9:key=5;key_flag=1;break;
  176.                 case 10:key=6;key_flag=1;break;
  177.                 case 11:key=10;key_flag=0;break;
  178.                 case 12:key=7;key_flag=1;break;
  179.                 case 13:key=8;key_flag=1;break;
  180.                 case 14:key=9;key_flag=1;break;
  181.                 case 15:key_flag=0;break;
  182.         }
  183. }*/

  184. void no()
  185. {
  186.         int j=0;
  187.         error_times++;   //錯誤次數(shù)+1
  188.         display_no();
  189.         beep(1);
  190.         for(j=0;j<num;j++)
  191.         {
  192.                 int_answer[j]=0;
  193.         }
  194. }

  195. void yes()
  196. {
  197.   beep(2);
  198.         while(1)
  199.         {
  200.                 display_yes();
  201.                 keyDown();
  202.                 if(key==3)
  203.                 {
  204.                         break;
  205.                 }
  206.         }
  207.         
  208. }

  209. void main()
  210. {
  211.         Timer0Init();
  212.         while(1)
  213.         {
  214.                 if(error_times<3)
  215.                 {
  216.                         
  217.                                 unsigned int i;
  218.                           i=0;
  219.                         wei[0]=16;
  220.                         do
  221.                         {
  222.                                 key=-1;
  223.                                 if((int_answer[i]=keyDown())!=-1)
  224.                                         i++;
  225.                         }while(key!=15);        
  226.                                 if(key==15)
  227.                                 {
  228.                                         for(i=0;i<num;i++)
  229.                                         {
  230.                                                 if(answer[i]!=int_answer[i])
  231.                                                 {
  232.                                                         a_flag=1;
  233.                                                         break;
  234.                                                 }
  235.                                                 else
  236.                                                         a_flag=0;
  237.                                         }
  238.                                 }
  239.                         if(a_flag==1)
  240.                         {
  241.                                 no();
  242.                         }
  243.                         else
  244.                         {
  245.                                 yes();
  246.                         }
  247.                 }
  248.                 else
  249.                 {
  250.                         stop();
  251.                         error_times=0;
  252.                 }
  253.                
  254.         }
  255. }

  256. void Timer0_Routine() interrupt 1 //10ms溢出一次
  257. {
  258.         TL0 = 0x00;                //設(shè)置定時初值
  259.         TH0 = 0xDC;
  260.         T0Count++;
  261.         display();
  262.         if(stop_flag==1)
  263.         {
  264.                 T0Count=0;
  265.                 if(T0Count==2000)
  266.                 {
  267.                         T0Count=0;
  268.                         timer_flag=1;
  269.                         stop_flag=0;
  270.                 }
  271.         }
  272.         
  273. }
復(fù)制代碼
Keil代碼工程51hei附件下載:
電子鎖.7z (21.11 KB, 下載次數(shù): 40)

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1032582 發(fā)表于 2022-6-14 19:21 | 只看該作者
能分享一下怎么使用嗎?
回復(fù)

使用道具 舉報

板凳
ID:496636 發(fā)表于 2022-6-15 21:30 | 只看該作者
延時程序最好是采用中斷來做,這樣省下來的CPU資源可以做其它的事。對于實際工程開發(fā)很有用。
回復(fù)

使用道具 舉報

地板
ID:1083402 發(fā)表于 2023-6-20 02:01 來自手機 | 只看該作者
實物開發(fā)板需要連線嗎
回復(fù)

使用道具 舉報

5#
ID:1086745 發(fā)表于 2023-7-1 10:36 | 只看該作者
(QAQ) 發(fā)表于 2022-6-14 19:21
能分享一下怎么使用嗎?

兄弟你現(xiàn)在會了么,我現(xiàn)在用起來有點問題
回復(fù)

使用道具 舉報

6#
ID:161164 發(fā)表于 2023-7-3 13:31 | 只看該作者
Sakiyaaa 發(fā)表于 2023-7-1 10:36
兄弟你現(xiàn)在會了么,我現(xiàn)在用起來有點問題

有啥問題?
回復(fù)

使用道具 舉報

7#
ID:1087034 發(fā)表于 2023-7-3 15:55 | 只看該作者
如何連線呢
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表