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

標(biāo)題: 簡易數(shù)字密碼鎖proteus仿真+單片機(jī)源代碼 [打印本頁]

作者: 我心II永恒    時間: 2017-12-14 11:42
標(biāo)題: 簡易數(shù)字密碼鎖proteus仿真+單片機(jī)源代碼
如感興趣,請指教!
1、設(shè)計(jì)一個簡易電子密碼鎖。
2、用矩陣鍵盤組成0~9數(shù)字鍵、確認(rèn)鍵、刪除鍵;用8位共陽數(shù)碼管組成顯示電路提示信息。
3、輸入密碼,在數(shù)碼管上顯示,當(dāng)6位密碼輸入完時按下確認(rèn)鍵,對輸入密碼與設(shè)定密碼
   進(jìn)行比對,若正確,則開鎖,此處用LED發(fā)光二極管一秒作為提示,若密碼不正確,則
   發(fā)出“嘀嘀”聲。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. u8 which,buff[6];
  5. u8 s_1,s_2,s_3,s_4,s_5,s_6;
  6. sbit DI=P3^6;
  7. sbit LED=P3^7;
  8. u8 code right[]={1,2,3,4,5,6};
  9. u8 code distab[]={
  10. 0xc0,0xF9,0xA4,0xB0,0x99,                                 
  11. 0x92,0x82,0xF8,0x80,0x90,                       
  12. 0x88,0x83,0xC6,0xA1,0x86,                       
  13. 0x8E,0xFF,0x0C,0x89,0x7F,0xBF};
  14. void delayms(u8 xms)
  15. {
  16.         u16 i,j;
  17.         for(i=xms;i>0;i--)
  18.                 for(j=110;j>0;j--);
  19. }
  20. void di()
  21. {
  22.         DI=0;
  23.         delayms(500);
  24.         DI=1;
  25.         delayms(500);
  26. }

  27. u8 conn()
  28. {
  29.         if((buff[0]==right[0])&&(buff[1]==right[1])&&(buff[2]==right[2])&&
  30.                 (buff[3]==right[3])&&(buff[4]==right[4])&&(buff[5]==right[5]))
  31.         return 1;
  32.         else return 0;
  33. }
  34. void display(u8 num)
  35. {
  36.         if(which>0)
  37.         switch(which)
  38.                 {
  39.                         case 1:if(num==21)which=0;s_1=num;if(num==20)which=0;buff[0]=s_1;         break;
  40.                         case 2:if(num==21)which=1;s_2=num;if(num==20)which=1;buff[1]=s_2;         break;
  41.                         case 3:if(num==21)which=2;s_3=num;if(num==20)which=2;buff[2]=s_3;         break;
  42.                         case 4:if(num==21)which=3;s_4=num;if(num==20)which=3;buff[3]=s_4;    break;
  43.                         case 5:if(num==21)which=4;s_5=num;if(num==20)which=4;buff[4]=s_5;    break;
  44.                         case 6:if(num==21)which=5;s_6=num;if(num==20)which=5;buff[5]=s_6;         break;
  45.                         case 7:                which=6;
  46.                                                 if(num==21)
  47.                                                 {
  48.                                                         if(conn()==0)
  49.                                                         {
  50.                                                                 di();di();di();
  51.                                                                 LED=1;
  52.                                                         }
  53.                                                         else
  54.                                                         {
  55.                                                                 LED=0;delayms(500);delayms(500);LED=1;
  56.                                                         }
  57.                                                         which=0;
  58.                                                 }
  59.                                                 break;
  60.                         default:        which=6;                                                 break;
  61.                 }
  62.                 else di();
  63. }
  64. void dis()
  65. {
  66.         switch(which)
  67.         {
  68.          case 1:P0=distab[s_1];        P2=0x80;delayms(5);        P0=0xff;  P2=0x00;         break;
  69.          case 2:P0=distab[s_1];        P2=0x40;delayms(5);        P0=0xff;
  70.                          P0=distab[s_2];        P2=0x80;delayms(5);        P0=0xff;  P2=0x00;         break;
  71.          case 3:P0=distab[s_1];        P2=0x20;delayms(5);        P0=0xff;
  72.                          P0=distab[s_2];        P2=0x40;delayms(5);        P0=0xff;  
  73.                         P0=distab[s_3];        P2=0x80;delayms(5);        P0=0xff;  P2=0x00;         break;
  74.          case 4:P0=distab[s_1];        P2=0x10;delayms(5);        P0=0xff;
  75.                          P0=distab[s_2];        P2=0x20;delayms(5);        P0=0xff;  
  76.                         P0=distab[s_3];        P2=0x40;delayms(5);        P0=0xff;  
  77.                          P0=distab[s_4];        P2=0x80;delayms(5);        P0=0xff;  P2=0x00;         break;
  78.          case 5:P0=distab[s_1];        P2=0x08;delayms(5);        P0=0xff;
  79.                          P0=distab[s_2];        P2=0x10;delayms(5);        P0=0xff;  
  80.                         P0=distab[s_3];        P2=0x20;delayms(5);        P0=0xff;  
  81.                          P0=distab[s_4];        P2=0x40;delayms(5);        P0=0xff;  
  82.                         P0=distab[s_5];        P2=0x80;delayms(5);        P0=0xff;  P2=0x00;         break;
  83.          case 6:P0=distab[s_1];        P2=0x04;delayms(5);        P0=0xff;
  84.                          P0=distab[s_2];        P2=0x08;delayms(5);        P0=0xff;  
  85.                         P0=distab[s_3];        P2=0x10;delayms(5);        P0=0xff;  
  86.                          P0=distab[s_4];        P2=0x20;delayms(5);        P0=0xff;  
  87.                         P0=distab[s_5];        P2=0x40;delayms(5);        P0=0xff;  
  88.                         P0=distab[s_6];        P2=0x80;delayms(5);        P0=0xff;  P2=0x00;         break;
  89.         }
  90. }
  91. void matrixkeyscan()                                           //matrix矩陣
  92. {
  93.         u8 temp,key;                                                   //temp臨時變量
  94.         P1=0xfe;                                                           //將第一行電平置低,其余行全為高
  95.         temp=P1;                                                           //讀取P3口當(dāng)前狀態(tài)的置賦予臨時變量temp,用于后面計(jì)算
  96.         temp=temp&0xf0;                                                   //判斷temp的高四位是否有0,如果temp的高四位有0,那么與運(yùn)算后
  97.                                                                                     //結(jié)果必然不等于0xf0;temp的高四位實(shí)際上是矩陣鍵盤的4個列線
  98.                                                                                     //從而通過temp與0xf0"&"運(yùn)算后的結(jié)果是否為0xf0來判斷第一行是否
  99.                                                                                     //有按鍵按下
  100.         if(temp!=0xf0)                                                //“temp&0xf0”的結(jié)果,如果temp不等于0xf0,說明有鍵被按下
  101.         {
  102.                 delayms(10);                                       
  103.                 temp=P1;                                           //重新讀一次P3口數(shù)據(jù)
  104.                 temp=temp&0xf0;                                   //重新進(jìn)行一次與運(yùn)算
  105.                 if(temp!=0xf0)
  106.                 {
  107.                         temp=P1;
  108.                         switch(temp)
  109.                         {
  110.                                 case 0xee:        key=0;        which+=1;        break;
  111.                                 case 0xde:        key=1;        which+=1;        break;
  112.                                 case 0xbe:        key=2;        which+=1;        break;
  113.                                 case 0x7e:        key=3;        which+=1;        break;
  114.                         }
  115.                         while(temp!=0xf0)                           //等待按鍵釋放
  116.                         {
  117.                                 temp=P1;
  118.                                 temp=temp&0xf0;
  119.                         }
  120.                         display(key);
  121.                 }
  122.         }
  123.         P1=0xfd;
  124.         temp=P1;
  125.         temp=temp&0xf0;
  126.         if(temp!=0xf0)
  127.         {
  128.                 delayms(10);
  129.                 temp=P1;
  130.                 temp=temp&0xf0;
  131.                 if(temp!=0xf0)
  132.                 {
  133.                         temp=P1;
  134.                         switch(temp)
  135.                         {
  136.                                 case 0xed:        key=4;        which+=1;break;
  137.                                 case 0xdd:        key=5;        which+=1;break;
  138.                                 case 0xbd:        key=6;        which+=1;break;
  139.                                 case 0x7d:        key=7;        which+=1;break;
  140.                         }
  141.                         while(temp!=0xf0)
  142.                         {
  143.                                 temp=P1;
  144.                                 temp=temp&0xf0;
  145.                         }
  146.                         display(key);
  147.                 }
  148.         }
  149.         P1=0xfb;
  150.         temp=P1;
  151.         temp=temp&0xf0;
  152.         if(temp!=0xf0)
  153.         {
  154.                 delayms(10);
  155.                 temp=P1;
  156.                 temp=temp&0xf0;
  157.                 if(temp!=0xf0)
  158.                 {
  159.                         temp=P1;
  160.                         switch(temp)
  161.                         {
  162.                                 case 0xeb:        key=8;        which+=1;break;
  163.                                 case 0xdb:        key=9;        which+=1;break;
  164. //                                case 0xbb:        key=10;        which+=1;break;
  165. //                                case 0x7b:        key=11;        which+=1;break;
  166.                         }
  167.                         while(temp!=0xf0)
  168.                         {
  169.                                 temp=P1;
  170.                                 temp=temp&0xf0;
  171.                         }
  172.                         display(key);
  173.                 }
  174.         }
  175.         P1=0xf7;
  176.         temp=P1;
  177.         temp=temp&0xf0;
  178.         if(temp!=0xf0)
  179.         {
  180.                 delayms(10);
  181.                 temp=P1;
  182.                 temp=temp&0xf0;
  183.                 if(temp!=0xf0)
  184.                 {
  185.                         temp=P1;
  186.                         switch(temp)
  187.                         {
  188.                                 case 0xe7:        key=20;        break;
  189.                                 case 0xd7:        key=21; which+=1;        break;
  190. //                                case 0xb7:        key=14;        which+=1;break;
  191. //                                case 0x77:        key=15;        which+=1;break;
  192. ……………………

  193. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
mimasuo.rar (210.87 KB, 下載次數(shù): 186)





作者: 丨Star    時間: 2017-12-14 23:09
我是新手,不太明白為什么那些按鍵可以不用和別的元件連接起來?
作者: 我心II永恒    時間: 2017-12-15 15:30
丨Star 發(fā)表于 2017-12-14 23:09
我是新手,不太明白為什么那些按鍵可以不用和別的元件連接起來?

按鍵是和單片機(jī)連接的,用連接線標(biāo)號模式連的,這樣看起來能夠簡潔一點(diǎn)。
作者: sukichang    時間: 2019-11-28 22:35
打不開啊
作者: jamtio    時間: 2019-12-8 12:48
66666厲害了
作者: 李總不    時間: 2019-12-11 10:55
sukichang 發(fā)表于 2019-11-28 22:35
打不開啊

能不能發(fā)一份資料
作者: 113265    時間: 2019-12-16 15:58
好想做一個試試
作者: Rainson    時間: 2020-6-19 13:19
作者 你好 你這個仿真是在幾點(diǎn)幾版本上畫的啊?
作者: RHQL    時間: 2020-6-22 07:50
這個打不開啊,proteus和keil版本是不是太低了
作者: chenandli    時間: 2023-6-7 11:00
這個怎么改密碼欸




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产欧美精品在线 | 欧美视频偷拍 | 日韩综合在线视频 | 浮生影院免费观看中文版 | 免费观看一级特黄欧美大片 | 日韩视频一区二区在线 | 精品国产不卡一区二区三区 | 成人欧美日韩一区二区三区 | 亚洲午夜视频在线观看 | 日韩精品免费在线观看 | www国产亚洲精品久久网站 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲在线一区 | 欧美高清hd | 亚洲欧美在线视频 | 精品欧美一区二区精品久久久 | 欧美精品欧美精品系列 | 四虎最新视频 | 一区在线播放 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 成人免费看电影 | 国产伦精品一区二区三区视频金莲 | 99福利视频 | 亚洲精品久久嫩草网站秘色 | 国产美女自拍视频 | 亚洲天堂男人的天堂 | 国产高清一区二区 | 久久精品国产一区二区电影 | 中文字幕在线中文 | 日韩成人在线观看 | 久久久久久高潮国产精品视 | 91精品久久久久久久久99蜜臂 | 亚洲日本乱码在线观看 | 91久久久久久久久久久久久 | 亚洲最大的黄色网址 | 九九热精品视频 | 成人精品一区亚洲午夜久久久 | 亚州av在线| 秋霞a级毛片在线看 | 日本三级在线 | 亚洲一区免费在线 |