欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

    標題: 單片機電子密碼鎖保險箱設計 [打印本頁]

    作者: AF'v'xv    時間: 2018-7-17 10:23
    標題: 單片機電子密碼鎖保險箱設計
    密碼箱的設計


    單片機源程序如下:
    1. #include<AT89x52.h>

    2. unsigned int num=10;        //開始讓數碼管什么都顯示
    3. bit set=0;                //定義設置密碼的位
    4. char count=-1;        //開始讓COUNT=-1,方便后面顯示數碼管
    5. sbit Beep=P1^2; //蜂鳴器
    6. unsigned char temp;
    7. unsigned char pws[6]={1,2,3,4,5,6};        //原始密碼
    8. unsigned char pwx[6];                        //按下的數字存儲區
    9. bit rightflag;                        //密碼正確標志位
    10. unsigned char workbuf[6];
    11. unsigned char code tabledu[]={
    12. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
    13. };                        //段選碼,共陰極
    14. unsigned char code tablewe[]={
    15. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf
    16. };                        //位選碼
    17. unsigned int keyscan();
    18. void delay(unsigned char z)                //延時,ms級       
    19. {
    20.         unsigned char y;
    21.         for(;z>0;z--)
    22.                 for(y=120;y>0;y--);
    23. }
    24. void setpw()                //設置密碼函數
    25. {
    26.         keyscan();
    27. }
    28. unsigned int keyscan()                //鍵盤掃描函數
    29. {
    30.         P3=0xfe;
    31.         temp=P3;
    32.         temp=temp&0xf0;
    33.         if(temp!=0xf0)
    34.         {
    35.                 delay(5);        //鍵盤去抖,最好20ms以上,這里用了5ms
    36.                 temp=P3;
    37.                 temp=temp&0xf0;
    38.                 if(temp!=0xf0)
    39.                 {
    40.                         count++;//按鍵計數加1
    41.                         temp=P3;
    42.                         switch(temp)
    43.                         {
    44.                                 case 0xee:
    45.                                 {       
    46.                                         num=7;
    47.                                         if(count<6)        //六位密碼,所以COUNT<6
    48.                                         {       
    49.                                                 if(set==0)        //設置密碼鍵沒有按下時
    50.                                                 pwx[count]=num; //存儲按下的數字
    51.                                                 else
    52.                                                 pws[count]=num; //設置密碼鍵按下時,設置新密碼
    53.                                                 workbuf[count]=tabledu[11]; //相應位的數碼管顯示"--",不顯示相應的數字,密碼是保密的
    54.                                         }
    55.                                 }
    56.                                 break;
    57.                                 case 0xde:
    58.                                 {       
    59.                                         num=8;
    60.                                         if(count<6)                //以下掃描鍵盤的原理差不多同上
    61.                                         {
    62.                                                 if(set==0)
    63.                                                 pwx[count]=num;
    64.                                                 else
    65.                                                 pws[count]=num;
    66.                                                 workbuf[count]=tabledu[11];
    67.                                         }
    68.                                 }
    69.                                 break;
    70.                                 case 0xbe:
    71.                                 {       
    72.                                         num=9;
    73.                                         {
    74.                                                 if(count<6)
    75.                                                 {
    76.                                                         if(set==0)
    77.                                                         pwx[count]=num;
    78.                                                         else
    79.                                                         pws[count]=num;
    80.                                                         workbuf[count]=tabledu[11];
    81.                                                 }
    82.                                         }
    83.                                 }
    84.                                 break;
    85.                                 case 0x7e:        //設置密碼鍵按下
    86.                                 {
    87.                                         set=1;        //設置密碼標志位置1
    88.                                         P1_3=0;        //設置密碼指示燈亮
    89.                                         workbuf[0]=0x00;//數碼管第一位不顯示
    90.                                         workbuf[1]=0x00;//......
    91.                                         workbuf[2]=0x00;//......
    92.                                         workbuf[3]=0x00;
    93.                                         workbuf[4]=0x00;
    94.                                         workbuf[5]=0x00;//......
    95.                                         count=-1;        //按鍵計數復位為-1
    96.                                         if(count<6)        //密碼沒有設置完,繼續設置密碼
    97.                                         {
    98.                                                 setpw();        //設置密碼
    99.                                         }
    100.                                 }               
    101.                                 break;
    102.                         }
    103.                         while(temp!=0xf0)  //按鍵抬起檢測
    104.                         {
    105.                                 temp=P3;
    106.                                 temp=temp&0xf0;
    107.                         }       
    108.                 }
    109.         }
    110.         P3=0xfd;
    111.         temp=P3;
    112.         temp=temp&0xf0;
    113.         if(temp!=0xf0)
    114.         {
    115.                 delay(5);
    116.                 temp=P3;
    117.                 temp=temp&0xf0;
    118.                 if(temp!=0xf0)
    119.                 {
    120.                         count++;
    121.                         temp=P3;
    122.                         switch(temp)
    123.                         {
    124.                                 case 0xed:
    125.                                 {       
    126.                                         num=4;
    127.                                         if(count<6)
    128.                                         {
    129.                                                 if(set==0)
    130.                                                 pwx[count]=num;
    131.                                                 else
    132.                                                 pws[count]=num;
    133.                                                 workbuf[count]=tabledu[11];
    134.                                         }
    135.                                 }
    136.                                 break;
    137.                                 case 0xdd:
    138.                                 {       
    139.                                         num=5;
    140.                                         if(count<6)
    141.                                         {
    142.                                                 if(set==0)
    143.                                                 pwx[count]=num;
    144.                                                 else
    145.                                                 pws[count]=num;
    146.                                                 workbuf[count]=tabledu[11];
    147.                                         }
    148.                                 }
    149.                                 break;
    150.                                 case 0xbd:
    151.                                 {
    152.                                         num=6;
    153.                                         if(count<6)
    154.                                         {
    155.                                                 if(set==0)
    156.                                                 pwx[count]=num;
    157.                                                 else
    158.                                                 pws[count]=num;
    159.                                                 workbuf[count]=tabledu[11];
    160.                                         }
    161.                                 }
    162.                                 break;
    163.                         }
    164.                         while(temp!=0xf0)
    165.                         {
    166.                                 temp=P3;
    167.                                 temp=temp&0xf0;
    168.                         }
    169.                 }
    170.         }
    171.         P3=0xfb;
    172.         temp=P3;
    173.         temp=temp&0xf0;
    174.         if(temp!=0xf0)
    175.         {
    176.                 delay(5);
    177.                 temp=P3;
    178.                 temp=temp&0xf0;
    179.                 if(temp!=0xf0)
    180.                 {       
    181.                         count++;
    182.                         temp=P3;
    183.                         switch(temp)
    184.                         {
    185.                                 case 0xeb:
    186.                                 {
    187.                                         num=1;
    188.                                         if(count<6)
    189.                                         {
    190.                                                 if(set==0)
    191.                                                 pwx[count]=num;
    192.                                                 else
    193.                                                 pws[count]=num;
    194.                                                 workbuf[count]=tabledu[11];
    195.                                         }
    196.                                 }
    197.                                 break;
    198.                                 case 0xdb:
    199.                                 {       
    200.                                         num=2;
    201.                                         if(count<6)
    202.                                         {
    203.                                                 if(set==0)
    204.                                                 pwx[count]=num;
    205.                                                 else
    206.                                                 pws[count]=num;
    207.                                                 workbuf[count]=tabledu[11];
    208.                                         }
    209.                                 }
    210.                                 break;
    211.                                 case 0xbb:
    212.                                 {
    213.                                         num=3;
    214.                                         if(count<6)
    215.                                         {
    216.                                                 if(set==0)
    217.                                                 pwx[count]=num;
    218.                                                 else
    219.                                                 pws[count]=num;
    220.                                                 workbuf[count]=tabledu[11];
    221.                                         }
    222.                                 }
    223.                                 break;
    224.                         }
    225.                         while(temp!=0xf0)
    226.                         {
    227.                                 temp=P3;
    228.                                 temp=temp&0xf0;
    229.                         }
    230.                 }
    231.         }
    232.         P3=0xf7;
    233.         temp=P3;
    234.         temp=temp&0xf0;
    235.         if(temp!=0xf0)
    236.         {
    237.                 delay(5);
    238.                 temp=P3;
    239.                 temp=temp&0xf0;
    240.                 if(temp!=0xf0)
    241.                 {
    242.                         count++;
    243.                         temp=P3;
    244.                         switch(temp)
    245.                         {
    246.                                 case 0xd7:
    247.                                 {       
    248.                                         num=0;
    249.                                         if(count<6)
    250.                                         {
    251.                                                 if(set==0)
    252.                                                 pwx[count]=num;
    253.                                                 else
    254.                                                 pws[count]=num;
    255.                                                 workbuf[count]=tabledu[11];
    256.                                         }
    257.                                 }
    258.                                 break;
    259.                                 case 0xe7: num=20;break;        //確定鍵按下檢測
    260.                                 case 0x77:                 //復位鍵或者輸入密碼全部一次刪除
    261.                                 {       
    262.                                         P1_1=0;                //鎖關
    263.                                         P1_3=1;                //密碼設置指示燈滅
    264.                                         set=0;                //不設置密碼
    265.                                         num=10;                //num復位
    266.                                         count=-1;        //COUNT復位
    267.                                         workbuf[0]=tabledu[10];                //第一位數碼管不顯示
    268.                                         workbuf[1]=tabledu[10];                //第二位數碼管不顯示
    269.                                         workbuf[2]=tabledu[10];               
    270.                                         workbuf[3]=tabledu[10];
    271.                                         workbuf[4]=tabledu[10];
    272.                                         workbuf[5]=tabledu[10];                //......
    273.                                         P1_0=1;                                                //鎖關
    274.                                 }
    275.                                 break;
    276.                                 case 0xb7:        //輸入密碼刪除鍵(一位一位刪除)
    277.                                 {
    278.                                         count--;       
    279.                                         workbuf[count]=0x00;        //因確定鍵按下時,COUNT也會加1,而確定鍵不是密碼,所以這里是COUNT,而不是COUNT+1
    280.                                         count--;        //因確定鍵按下時,確定鍵不是密碼,COUNT也會加1,這里COUNT再自減1
    281.                                         if(count<=-1)
    282.                                         count=-1;
    283.                                 }
    284.                                 break;
    285.                         }
    286.                         while(temp!=0xf0)
    287.                         {
    288.                                 temp=P3;
    289.                                 temp=temp&0xf0;
    290.                         }
    291.                 }
    292.         }
    293.         return(num);
    294. }
    295. void init()                //利用定時顯示數碼管
    296. {
    297.         TMOD=0x01;
    298.         TH0=(65536-500)/200;
    299.         TL0=(65536-500)%200;
    300.         ET0=1;
    301.         EA=1;
    302.         TR0=1;
    303. }
    304. bit compare()        //密碼比較函數
    305. {
    306.         if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pwx[5]==pws[5]))
    307.         rightflag=1;
    308.         else
    309.         rightflag=0;
    310.         return(rightflag);
    311. }
    312. void main()
    313. {
    314.         unsigned int i,j;
    315.         init();
    316.         P0=0;
    317.         P1_1=0;        //鎖關
    318.         while(1)
    319.         {
    320.                 keyscan();
    321.                 if(num==20)        //如果確定鍵按下(修改密碼和輸入密碼共用的確定鍵)
    322.                 {
    323.                         if(count==6)
    324.                         {
    325.                                 if(set==1)        //修改密碼確定
    326.                                 {       
    327.                                         P1_3=1;
    328.                                         workbuf[0]=0;       
    329.                                         workbuf[1]=0;
    330.                                         workbuf[2]=0;
    331.                                         workbuf[3]=0;
    332.                                         workbuf[4]=0;
    333.                                         workbuf[5]=0;
    334.                                 }
    335.                                 else        //輸入密碼確定
    336.                                 {
    337.                                         set=0;
    338.                                         compare();
    339.                                         if(rightflag==1)        //如果密碼正確
    340.                                         {
    341.                                                 P1_0=0;        //鎖開
    342.                                                 P1_1=1;
    343.                                                 workbuf[0]=tabledu[8];        //數碼管第一位顯示"8"
    344.                                                 workbuf[1]=tabledu[8];        //數碼管第二位顯示"8"
    345.                                                 workbuf[2]=tabledu[8];       
    346.                                                 workbuf[3]=tabledu[8];
    347.                                                 workbuf[4]=tabledu[8];
    348.                                                 workbuf[5]=tabledu[8];        //......
    349.                                         }
    350.                                         else
    351.                                         {
    352.                                                 P1_1=0;        //鎖仍然是關
    353.                                                 workbuf[0]=0X71;        //數碼管第一位顯示"F"
    354.                                                 workbuf[1]=0X71;
    355.                                                 workbuf[2]=0X71;
    356.                                                 workbuf[3]=0X71;
    357.                                                 workbuf[4]=0X71;
    358. ……………………

    359. …………限于本文篇幅 余下代碼請從51黑下載附件…………
    復制代碼

    所有資料51hei提供下載:
    應用實例20 密碼保險箱.zip (94.61 KB, 下載次數: 23)







    歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1