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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機設計的電子密碼鎖仿真代碼 有注釋說明

[復制鏈接]
跳轉到指定樓層
樓主
該程序是基于51單片機設計的電子密碼鎖,功能較為簡單,目前僅有修改密碼和檢測這一功能,以下是操作過程
運行仿真的初始界面
左邊矩陣按鍵從左邊第一行第一列起為0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
按下按鍵后界面如下,當四位數碼管都顯示后,按下矩陣鍵盤上任意按鍵確認密碼
密碼錯誤D1紅燈亮起,密碼正確D2綠燈亮起
當按下獨立按鍵時,中斷觸發,進入密碼修改,此時界面如同初始界面,輸入原始密碼,原始密碼正確,綠燈亮起,等待輸入新密碼,此時界面顯示原始密碼。原始密碼錯誤紅燈亮起,退出修改,返回初始狀態。
新密碼輸入會將原始密碼覆蓋,輸入完成紅綠燈同時亮起。
1s后返回初始界面,密碼修改完成。

單片機源程序如下:
  1. #include "reg51.h"          //包含頭文件

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #define DIG P0
  5. #define keys P1

  6. sbit LSA=P2^1;
  7. sbit LSB=P2^2;
  8. sbit LED_Green=P2^3;
  9. sbit LED_Red=P2^4;

  10. uchar time=0,state;
  11. uchar disp[4]={0xbf,0xbf,0xbf,0xbf};
  12. uchar smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};        //數碼管段選表,共陽數碼管
  13. uchar password[4]={0xf9,0xf9,0xa4,0x90};  //初始密碼1129

  14. void delay_ms(uint t);                //函數聲明
  15. void keys_scan();
  16. void digdisp();
  17. void Init();

  18. void delay_ms(uint t)                 //延時函數
  19. {
  20.         uchar i;
  21.         for(;t>0;t--)
  22.         {
  23.                 for(i=0;i<125;i++);
  24.         }
  25. }

  26. void keys_scan()                   //矩陣按鍵掃描
  27. {
  28.         uchar i,k;
  29.         keys=0xf0;
  30.         if(keys!=0xf0)
  31.         {
  32.                 delay_ms(2);
  33.                 if(keys!=0xf0)
  34.                 {
  35.                         switch(keys)                         //確定行
  36.                         {
  37.                                 case(0x70):
  38.                                         k=0;break;
  39.                                 case(0xb0):
  40.                                         k=4;break;
  41.                                 case(0xd0):
  42.                                         k=8;break;
  43.                                 case(0xe0):
  44.                                         k=12;break;
  45.                         }
  46.                         keys=0x0f;
  47.                         if(keys!=0x0f)                        
  48.                         {
  49.                                 switch(keys)                //確定列
  50.                                 {
  51.                                         case(0x07):
  52.                                                          ;break;
  53.                                         case(0x0b):
  54.                                                 k=k+1;break;
  55.                                         case(0x0d):
  56.                                                 k=k+2;break;
  57.                                         case(0x0e):
  58.                                                 k=k+3;break;
  59.                                 }
  60.                         }
  61.                         while(keys!=0x0f);                       //松手檢測
  62.                         disp[time]=smgduan[k];                //將鍵值對應的段選碼送入顯示數組
  63.                         time++;                                               //按鍵次數檢測
  64.                         if((time>4)&&(state!=1))           //檢測四位密碼是否全部輸入
  65.                         {
  66.                                 time=0;
  67.                                 for(i=0;i<4;i++)
  68.                                 {
  69.                                         if(disp[i]!=password[i])        //逐位檢測輸入密碼是否正確
  70.                                         {
  71.                                                 LED_Green=1;                        //輸入密碼不正確,紅燈點亮
  72.                                                 LED_Red=0;
  73.                                                 break;
  74.                                         }
  75.                                         if(i==3)                                        //輸入密碼正確綠燈點亮
  76.                                         {
  77.                                                 LED_Green=0;
  78.                                                 LED_Red=1;
  79.                                         }
  80.                                 }
  81.                                 delay_ms(1000);                                        //延時1s
  82.                         }
  83.                 }
  84.         }
  85.         digdisp();                                                                        //調用顯示函數
  86. }

  87. void digdisp()                                                                        //數碼管顯示函數
  88. {
  89.         uchar i;
  90.         for(i=0;i<4;i++)
  91.         {
  92.                 switch(i)                                                                //采用24譯碼器,位選數碼管
  93.                 {
  94.                         case(0):
  95.                                 LSA=0;LSB=0;break;
  96.                         case(1):
  97.                                 LSA=1;LSB=0;break;
  98.                         case(2):
  99.                                 LSA=0;LSB=1;break;
  100.                         case(3):
  101.                                 LSA=1;LSB=1;break;
  102.                 }
  103.                 DIG=disp[i];                                                        //將顯示數組的段選值送入數碼管
  104.                 delay_ms(2);                                                        //延時
  105.         }
  106. }

  107. void main()                                                                                //主函數
  108. {
  109.         uchar i;
  110.         EA=1;
  111.         EX0=1;
  112.         IT0=1;          //打開外部中斷0,設置觸發方式為下降沿觸發
  113.         while(1)
  114.         {
  115.                 if((time==0)&&(state!=1))                  //檢測輸入位數,確定是否要進行初始化
  116.                 {
  117.                         LED_Green=1;
  118.                         LED_Red=1;                                          //紅、綠燈熄滅
  119.                         for(i=0;i<4;i++)                          
  120.                         {
  121.                                 disp[i]=0xbf;                          //初始化段選數組
  122.                         }
  123.                 }
  124.                 keys_scan();                                         //調用按鍵掃描函數
  125.         }
  126. }

  127. void INI0() interrupt 0                                         //外部中斷0
  128. {
  129.         uchar i;
  130.         state=1;                                                         //設置狀態變量state,告訴程序正在執行中斷過程,即設置密碼過程
  131.         for(i=0;i<4;i++)
  132.         {
  133.                 disp[i]=0xbf;                                         
  134.         }
  135.         digdisp();
  136.         time=0;
  137.         while((time<4)&&(state==1))                         //修改密碼前請先輸入原密碼
  138.         {
  139.                 keys_scan();                                         //對原密碼的按鍵掃描
  140.         }
  141.         for(i=0;i<4;i++)                                         
  142.         {
  143.                 if(disp[i]!=password[i])                 //檢測所輸入的原密碼是否正確
  144.                 {
  145.                         LED_Green=1;                                 //不正確結束for循環,紅燈點亮
  146.                         LED_Red=0;
  147.                         delay_ms(1000);
  148.                         break;
  149.                 }
  150.                 if(i==3)                                                 //正確,綠燈點亮
  151.                 {
  152.                         time=0;
  153.                         LED_Green=0;
  154.                         LED_Red=1;
  155.                         delay_ms(1000);
  156.                         while(time<4)                                
  157.                         {
  158.                                 keys_scan();                         //進行按鍵掃描檢測輸入的新密碼
  159.                         }
  160.                         for(i=0;i<4;i++)
  161.                         {
  162.                                 password[i]=disp[i];         //將輸入的新密碼送入密碼數組
  163.                         }
  164.                         LED_Green=0;
  165.                         LED_Red=0;                                         //密碼修改完成,紅綠燈同時點亮
  166.                         delay_ms(3000);
  167.                 }
  168.         }
  169.         state=0;                                                         //結束中斷
  170.         time=0;                                                                 //按鍵次數初始化
  171. }
復制代碼

所有資料51hei提供下載:
電子密碼鎖.zip (340.33 KB, 下載次數: 76)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:140183 發表于 2020-11-27 05:58 | 只看該作者
多謝分享!好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:669246 發表于 2020-11-27 09:30 | 只看該作者
高手啊,如果有全套就更好了
回復

使用道具 舉報

地板
ID:1127365 發表于 2024-6-28 11:14 | 只看該作者
lcd太難搞了,數碼管看著方便多了,贊!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品美女 | 成人国产精品久久 | 亚洲精品一区中文字幕乱码 | 91精品国产一区二区三区 | 亚洲精品美女在线观看 | 视频一区二区在线观看 | 成人免费视频网站在线看 | 美女黄18岁以下禁止观看 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产精品a免费一区久久电影 | 天天影视综合 | 国产一级视频在线播放 | 久久久久久国产精品免费免费狐狸 | 国产精品久久久久久久久大全 | 久久国产精品久久久久久久久久 | 午夜视频一区 | 日韩亚洲视频在线 | 久久不卡日韩美女 | 午夜色播| 亚洲午夜网 | 国产精品毛片一区二区三区 | 欧美成人精品一区二区男人看 | 亚洲一区二区网站 | 国产在线精品一区二区 | a在线观看免费 | 91大神xh98xh系列全部 | 亚洲一区二区三区在线观看免费 | 国产一区二区三区四区三区四 | 亚洲精品一区二区三区在线 | 国产精品九九九 | av网站在线看 | 日韩午夜精品 | 国产69精品久久99不卡免费版 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 欧美国产日韩在线观看 | 精品免费 | 成人小视频在线免费观看 | 中文字幕国产视频 | 欧美h | 久草精品视频 | 午夜精品久久久久久久久久久久久 |