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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)密碼鎖報警部分小問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:351936 發(fā)表于 2018-6-15 09:54 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
2黑幣
現(xiàn)在程序可以運(yùn)行,主要就是密碼正確LED亮,密碼錯誤三次報警10S,如果在報警時間內(nèi)按鍵,則重載報警時間,這個不知道怎么改程序,求大佬們幫幫忙。以下是程序代碼:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
                                    0x6d,0x7d,0x07,0x7f,0x6f};     //字模定義
void delay(uint z);                                  //延時函數(shù)
void get_key();                                   // 鍵盤掃描子程序
void fun_key();                                 //按鍵C,D子程序
void init();                                          // 初始化設(shè)置
void exter0();                                //定時器T0中斷服務(wù)
void disp(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f);
                                               //6位數(shù)字顯示子函數(shù)
void rest_cipher();                             // 重置密碼子程序
uchar cou_dis(uchar);                           //數(shù)字右移函數(shù)                       
void display(uchar);                                // 數(shù)碼管顯示程序
void alarm();                                      //報警電路程序
void delay_us(uchar);                             //延時函數(shù)
uchar hang,lie,addres,num,temp,flag,sum,fun,mark,con,N,km;
uint to,aa;
uchar a,b,c,d,e,f;                          //數(shù)碼管顯示位數(shù)
uchar a1,b1,c1,d1,e1,f1;
sbit D0=P3^0;               
sbit K=P3^1;

void main()
{        init();                                       //初始化設(shè)置
        while(1)
                {       
                        get_key();                              //鍵盤掃描子程序
                        if(N<6)
                        cou_dis(num);                         //數(shù)字右移函數(shù)
                        fun_key();                                       //按鍵C,D子程序       
                    display(N);                             // 數(shù)碼管顯示程序
                                  if(to==2000)
                                {
                                        to=0;
                                        D0=1;                    //數(shù)碼管熄滅
                                        TR0=0;
                                        mark=0;

                                }
                                        alarm();                                     // 報警電路程序                       
        if(num=='A')
                                        {         to=0;               
                                             TR0=0;
                                                while(mark)
                                                        {                          
                                                               rest_cipher();      // 重置密碼子程序
                                                                   mark=0;
                                                        }          
                                        }
                }
}


void init()                                      // 初始化設(shè)置
{       
        K=0;                                      // p3.1口置零
        con=1;
        mark=0;
        temp=0xfe;
        flag=0;
        fun=0;
        a1=6;                               //從右往左數(shù)第六位密碼
        b1=5;                             //第五位密碼
        c1=4;                            //第四位密碼
        d1=3;                             //第三位密碼
        e1=2;                                //第二位密碼
        f1=1;                              //第一位密碼
        TMOD=0x01;          
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=0;       
}

void rest_cipher()                                   // 重置密碼子程序
{                a=b=c=d=e=f=0;                     //熄滅數(shù)碼管
                N=0;                                            //輸入密碼個數(shù)清零
                D0=1;                              //熄滅led燈
                while(con)
                        {       
                                get_key();                    //鍵盤掃描子程序
                                if(N<6)                            //判斷輸入密碼的個數(shù)
                            cou_dis(num);          //數(shù)字右移函數(shù)
                                disp(a,b,c,d,e,f);     //數(shù)字顯示函數(shù)
                                 if(num=='D')
                                         {con=0;}         
                                        if(num=='C')
                                                {a=b=c=d=e=f=0;            //熄滅數(shù)碼管
                                                   N=0;}
                                                           a1=a;  
                                                        b1=b;
                                                        c1=c;
                                                        d1=d;
                                                        e1=e;
                                                        f1=f;
                                }
                                          a=b=c=d=e=f=0;
                                          N=0;
                                                       
}

void delay(uint z)                                  // 延時函數(shù)
{
        uint x,y;
        for(x=100;x>0;x--)
                for(y=z;y>0;y--);
}
uchar  cou_dis(uchar num)                  //數(shù)字右移函數(shù)
{                 
                if((num==0)||(num==1)||(num==2)||(num==3)||(num==4)||(num==5)
                ||(num==6)||(num==7)||(num==8)||(num==9))
                                    //判斷是否輸入的是其中一個數(shù)字
                        {           //N=1;                   //輸入密碼個數(shù)為1
                                        if(flag!=0)                //說明有數(shù)輸入
                                {    N++;                  //輸入密碼個數(shù)加1
                                        flag=0;                        
                                        f=e;
                                        e=d;
                                        d=c;
                                        c=b;
                                        b=a;
                                        a=num;                                      //輸入密碼右移                       
                                }
       
                        }
}
void get_key()                                 //鍵盤掃描子程序
{
                P1=0xf0;   
                lie=P1;
                P1=0x0f;
                hang=P1;
                addres=hang|lie;                    //行列寄存器中的值相或得到按鍵值
                        while(addres!=0xff)
//判斷是否有鍵按下,若adres的值不為0xff則有鍵按下
                          {
                                                   delay(5);                                // 延時消抖
                                                P1=0xf0;
                                                lie=P1;
                                                P1=0x0f;
                                                hang=P1;
                                        addres=hang|lie;
                                                if(addres!=0xff)
                                         {                        flag++;
                                                                                  switch(addres)       // 讀取鍵值      
                                                {       
                                                        case 0xee:num=1;break; //按鍵1動作,設(shè)num=1
                                                        case 0xde:num=2;break; //按鍵2動作,設(shè)num=2
                                                        case 0xbe:num=3;break; //按鍵3動作,設(shè)num=3
                                                case 0x7e:num='A';break; // 按鍵A動作,設(shè)num=A
                                                        case 0xed:num=4;break; //按鍵4動作,設(shè)num=4
                                                        case 0xdd:num=5;break; //按鍵5動作,設(shè)num=5
                                                        case 0xbd:num=6;break; // 按鍵6動作,設(shè)num=6
                                                case 0x7d:num='B';break; // 按鍵B動作,設(shè)num=B
                                                        case 0xeb:num=7;break; //按鍵7動作,設(shè)num=7
                                                        case 0xdb:num=8;break; // 按鍵8動作,設(shè)num=8
                                                        case 0xbb:num=9;break; //按鍵9動作,設(shè)num=9
                                                case 0x7b:num='C';break; // 按鍵C動作,設(shè)num=C
                                                        case 0xd7:num=0;break; //按鍵0動作,設(shè)num=0
                                                case 0x77:num='D';break; // 按鍵D動作,設(shè)num=D
                                                                                                }
                                                         }

                          }
                               


}

void fun_key()                                  //按鍵C,D子程序
{          
        if(num=='C')                    //判斷按鍵是否為C
                {
                        a=b=c=d=e=f=0;              //按鍵為C熄滅數(shù)碼管
                        N=0;                       //輸入密碼個數(shù)為0
                }
        if(num=='D')                             //按鍵是否為D
                {        num=0xff;
                                if((a1==a)&&(b1==b)&&(c1==c)&&(d1==d)&&(e1==e)&&(f1==f))
                                                //比較密碼是否正確
                                        {                 mark=1;
                                                         TR0=1;
                                                         to=0;     
                                                         D0=0;                 //led燈點亮
                                                         a=b=c=d=e=f=0;       //數(shù)碼管熄滅
                                                         N=0;                 //輸入密碼個數(shù)為0
                                                         km=0;                 //輸入密碼錯誤次數(shù)為0
                                        }
                                if((a1!=a)||(b1!=b)||(c1!=c)||(d1!=d)||(e1!=e)||(f1=!f))
                                                     //密碼錯誤
                                        {         if(D0!=0)               //led燈不亮
                                        {        km++;                       //錯誤次數(shù)累加
                                                N=0;                       //輸入密碼個數(shù)為0
                                                a=b=c=d=e=f=0;              //數(shù)碼管熄滅
                                        } }
                }
}

void display(uchar N)                       // 數(shù)碼管顯示程序
{
           if(N==1)                           //判斷輸入密碼個數(shù)是否為1
                {   temp=0xfe;
                        P0=0x40;                       //點亮g段使顯示為“—”
                        P2=temp;
                        delay(1);
                        P2=0xff;                     //點亮數(shù)碼管右邊N位使顯示“—”
                }
                 if(N==2)                          //判斷輸入密碼個數(shù)是否為2
                 {          temp=0xfe;
                           P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);                    //帶循環(huán),使其挨個點亮
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);

                 }
                 if(N==3)                       // 判斷輸入密碼個數(shù)是否為3
                 {           temp=0xfe;
                           P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);

                 }
                  if(N==4)                      // 判斷輸入密碼個數(shù)是否為4
                 {         temp=0xfe;
                          P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                 }

                if(N==5)                          //判斷輸入密碼個數(shù)是否為5
                 {         temp=0xfe;
                          P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        }

                  if(N==6)                          //判斷輸入密碼個數(shù)是否為6
                 {         temp=0xfe;
                          P0=0x40;
                        P2=temp;
                        delay(1);
                         P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        P0=0x40;
                        P2=temp;
                        delay(1);
                        P2=0xff;
                        temp=_crol_(temp,1);
                        }


}

void exter0() interrupt 1                       //定時器T0中斷服務(wù)
{
                   TH0=(65536-10000)/256;
                TL0=(65536-10000)%256;
                to++;                       
}

void alarm()                                  //報警電路子程序
{
                if(km==3)                       //判斷輸入錯誤密碼的次數(shù)
                        {        uchar n,m;
                                km=0;
                                for(m=50;m>0;m--)
                                 {
                                                 for(n=200;n>0;n--)
                                        {
                                                K=~K;                 //p3.1口取反
                                                delay_us(1000);             // 調(diào)用延時函數(shù)
                                        }
                                        K=0;                       //p3.1口置零
                                        delay(100);                  // 調(diào)用延時函數(shù)
                                        }       
                               
                        }
}

void disp(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) //數(shù)字顯示
{
                P0=table[a];                       //輸入從左往右第一個數(shù)
                P2=temp;                  
                delay(1);
                P2=0xff;                        //打開數(shù)碼管所有位
                temp=_crol_(temp,1);
                P0=table[b];                       //輸入從左往右第一個數(shù)

           P2=temp;
                delay(1);
                P2=0xff;
                temp=_crol_(temp,1);
                P0=table[c];                      //輸入從左往右第一個數(shù)
                P2=temp;
                delay(1);
                P2=0xff;
                temp=_crol_(temp,1);
                P0=table[d];                      //輸入從左往右第一個數(shù)
                P2=temp;
                delay(1);
                P2=0xff;
                temp=_crol_(temp,1);
                P0=table[e];                         //輸入從左往右第一個數(shù)
                P2=temp;
                delay(1);
                P2=0xff;
                temp=_crol_(temp,1);
                P0=table[f];                      //輸入從左往右第一個數(shù)
                P2=temp;
                delay(1);
                P2=0xff;
                if(temp=0xef)
                        temp=0xfe;
}

void delay_us(uchar z)                     //延時子函數(shù)
{
        while(--z);       
}



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

使用道具 舉報

沙發(fā)
ID:111634 發(fā)表于 2018-6-15 22:45 | 只看該作者
本帖最后由 zl2168 于 2018-6-15 22:50 編輯

功能齊全的電子密碼鎖
⑴ 電路設(shè)計    …

⑵ 功能設(shè)計    …


⑶ 程序設(shè)計    …

⑷ Proteus仿真    …

Proteus仿真一下,確認(rèn)有效,驗證上述功能。
我的電子密碼鎖功能比網(wǎng)上的好多了,你可以Proteus仿真核查,但程序在書中。
電子密碼鎖1.rar (1.13 MB, 下載次數(shù): 7)


以上摘自張志良編著《80C51單片機(jī)實用教程》ISBN 978-7-04-044532-9,高教社出版。書中電路和程序設(shè)計有詳細(xì)說明,程序語句條條有注解。
回復(fù)

使用道具 舉報

樓主
ID:351936 發(fā)表于 2018-6-15 14:46 | 只看該作者
void alarm()                                  //報警電路子程序
{
                if(km==3)                       //判斷輸入錯誤密碼的次數(shù)
                        {        uchar n,m;
                                km=0;
                                for(m=50;m>0;m--)
                                 {
                                                 for(n=200;n>0;n--)
                                               
                                        {                 get_key();
                                       if(num!='F')
                                        {if(num=='C')
                                        { n=0;
                                        m=0;}
                                        else if((num==0)||(num==1)||(num==2)||(num==3)||(num==4)||(num==5)
                ||(num==6)||(num==7)||(num==8)||(num==9))

                                        {n=200;
                                        m=50;}
                                        }
                                       
                                          
                                                K=~K;                 //p3.1口取反
                                                delay_us(1000);             // 調(diào)用延時函數(shù)
                                                num='F';
                                        }
                                        K=0;                       //p3.1口置零
                                        delay(100);                  // 調(diào)用延時函數(shù)
                                        }                                       
                               
                               
                        }
}

經(jīng)由大佬幫忙,改出來了。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩av免费在线观看 | 2019天天操| 日韩羞羞| 亚洲视频国产视频 | 成人无遮挡毛片免费看 | 免费一级毛片 | 欧美久久久久久久久 | 精品久久久精品 | 五月天国产在线 | 91国产精品 | 日本不卡一区 | 亚洲另类春色偷拍在线观看 | 正在播放国产精品 | 免费高清av | 99re视频在线 | 久久国产美女视频 | 国产一区二区三区免费视频 | 久久99精品久久久久子伦 | 欧美激情在线精品一区二区三区 | 黄色av网站在线免费观看 | 国产一区二区三区四区 | 涩涩视频网站在线观看 | 日韩三级在线观看 | 亚洲二区在线 | 午夜在线影院 | 精品一区视频 | 亚洲欧美成人影院 | 欧美成年人视频在线观看 | 欧美天堂一区 | 在线观看中文字幕av | 91精品国产欧美一区二区成人 | 日韩精品一区二区三区四区 | 精品一区二区三区91 | 中文字幕高清在线 | 亚洲欧美在线视频 | 黄色三级在线播放 | 成人精品国产免费网站 | 久久精品小视频 | 精品入口麻豆88视频 | 色综合久久天天综合网 | 国产精品毛片一区二区三区 |