標(biāo)題: 密碼鎖源代碼 [打印本頁(yè)]

作者: 北極星18    時(shí)間: 2015-4-25 15:35
標(biāo)題: 密碼鎖源代碼
                                                 
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define ulong unsigned long
#define uint  unsigned  int
sbit en=P2^6;
sbit rs=P2^4;
sbit rw=P2^5;
sbit  fmq=P2^0;
sbit   qd=P2^1;
sbit LA=P3^0;  //定義兩相,選擇P2口的低四位輸
sbit LB=P3^1;        //LAA,LBB,LCCLDD
sbit LC=P3^2;
sbit LD=P3^3;
sbit key2=P3^5;//定義按鍵3
sbit key1=P3^4;//定義按鍵4
/********函數(shù)聲明*****/
void right(unsigned int Speed,unsigned int road);//正轉(zhuǎn)
void left(unsigned int Speed,unsigned int road); //反轉(zhuǎn)
void mDelay(unsigned int DelayTime);//延時(shí)函數(shù)
int MotorStep=0;//步進(jìn)索引
/*****正轉(zhuǎn),兩個(gè)參數(shù)代表轉(zhuǎn)速和步進(jìn)量**********/
void right(unsigned int Speed,unsigned int road)
{                       //步進(jìn)節(jié)拍:A-B-C-D
while(road)
{
  switch(MotorStep)
  {
  case 0:LB=0;
         LC=0;
         LD=0;
         LA=1;//A
         MotorStep=1;break;
case 1:LA=0;
       LC=0;
           LD=0;
       LB=1;//B
           MotorStep=2;break;
case 2:LA=0;
       LB=0;
           LD=0;
       LC=1;//C
           MotorStep=3;break;
case 3:LA=0;
        LB=0;
                LC=0;
        LD=1;//D
                MotorStep=0;break;
                }
  mDelay(Speed);//這里的延時(shí)即控制轉(zhuǎn)速
  road--;//完成一步
  }
P2&=0XF0;//將四個(gè)腳復(fù)位0,停止
}
/********反轉(zhuǎn),兩個(gè)參數(shù)代表轉(zhuǎn)速和步進(jìn)量********/
void left(unsigned int Speed,unsigned int road)
{//步進(jìn)節(jié)拍:D-C-B-A
while(road)
{
switch(MotorStep)
{
  case 3:LA=0;LC=0;LD=0;LB=1;//B
  MotorStep=2;break;
  case 2:LB=0;LC=0;LD=0;LA=1; //A
  MotorStep=1;break;
  case 1:LA=0;LB=0;LC=0;LD=1; //D
  MotorStep=0; break;
  case 0:LA=0;LB=0;LD=0;LC=1;//C
  MotorStep=3;break;
  }
mDelay(Speed);//這里的延時(shí)即控制轉(zhuǎn)速
  road--;//完成一步
  }
  P2&=0XF0;//將四個(gè)腳復(fù)位0
  }
/***********延時(shí)函數(shù)***************/
void mDelay(unsigned int DelayTime)
{
unsigned char j=0;
while(DelayTime--)
{
for(j=0;j<100;j++)
{}
}
}
void delay_1ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void delay()
{
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
}
bit busy(void)                  //讀出函數(shù)是否處于忙狀態(tài)
{
   bit busy_flag=0;
   rs=0;
   rw=1;
   en=1;
   delay();
   busy_flag=(bit)(P0&0x80);
   en=0;
   return busy_flag;
   }
void write_com(uchar com)                        //寫(xiě)指令函數(shù)
{
    while(busy());
        rs=0;        //選擇指令寄存器
        rw=0;          //選擇寫(xiě)操作
        en=0;
        delay();       
        P0=com;
        delay();
        en=1;
        delay();
        en=0;
}
void write_data(uchar date)                 //寫(xiě)數(shù)據(jù)函數(shù)
{
    while(busy());    //
        rs=1;                //選擇數(shù)據(jù)寄存器
        rw=0;//選擇讀操作
        en=0;
        delay();
        P0=date;
        delay();
        en=1;
        delay();
        en=0;
}
void l1602_init()                                        //        初始化函數(shù)
{
        write_com(0x38);           //顯示模式設(shè)置
        delay_1ms(5);                   //延時(shí)5ms
        write_com(0x08);           //開(kāi)顯示
        write_com(0x0f);           //開(kāi)光標(biāo)顯示且閃爍
        write_com(0x01);                //清屏
}
void  l1602_char(uchar hang,uchar lie,char sign)
{
  uchar a;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
  a=a+lie-1;
  write_com(a);
  write_data(sign);
}
void  l1602_string(uchar hang,uchar lie,uchar *p)
{
  uchar a,b=0;
  if(hang==1)a=0x80;
  if(hang==2)a=0xc0;
  a=a+lie-1;
  while(1)
  {write_com(a++);
   b++;
   if((*p=='\0')||(b==16))break;
    write_data(*p);
        p++;
        }
}
uchar keyscan(void)                 //鍵盤(pán)函數(shù)
  {
  uchar i,j,temp,buffer[4]={0xfe,0xfd,0xfb,0xf7} ;
   
  for(j=0;j<4;j++)
   {
    P1=buffer[j];
     temp=0x10;
     for(i=0;i<4;i++)
     {
      if(!(P1&temp))
       {   
         return(i+j*4);
        }
      temp<<=1;
      }
    }
  return 10;
  }
  void main(void)
  { uint k=1;
  uchar i=6 ,j=0;
    uchar SLED[6]={0};
    ulong key_value;
    ulong code6wei=0x123456;
    ulong  codebijiao=0;
    l1602_init();
    l1602_string(1,1,"The code is:");
        fmq=0;
        qd=1;
  while(1)
    {        key_value=10;
      P1=0xf0;
     if(P1!=0Xf0)
      {delay_1ms(70);
     if(P1!=0xf0)
     {delay_1ms(70);
       if(P1!=0Xf0)
           {
         key_value=keyscan();
                }
      }
    }
        if(key_value<10)
        {
        l1602_char(2,i,key_value+48);
        codebijiao=codebijiao|(key_value<<((5-j)*4));
        i++;
        j++;
        delay_1ms(200);
        }
        if(j==6)
        {
           if(codebijiao==code6wei)
           { qd=0;
           write_com(0x01);
            l1602_string(1,1,"right!");
            l1602_string(2,1,"welcome back!");
                   P2&=0XF0;//ULN2003A直接驅(qū)動(dòng),初始時(shí)為低電平
                while(1)                         //循環(huán)
         {
                 if(((k==1)||(k==2))&&key1==0) //1鍵按下正轉(zhuǎn)
               {  k=3;
                   if(k==4)
                   {P2=0X00;
                           while(1){}
                   }
                    right(10,200);//兩個(gè)參數(shù)代表轉(zhuǎn)速和步進(jìn)量,以10的速度進(jìn)200         
                                 P2=0X00;
                                 k=4;
                        }
                 if(((k==3)||(k==4))&&(key2==0))//2鍵按下反轉(zhuǎn)
                            { k=1;
                                if(k==2)
                                {P2=0X00;
                             while(1){}
                        }
                                left(10,200);
                                P2=0X00;
                                k=2;                                    
                                }
                  }
                   }
       else
             { fmq=1;
          delay_1ms(2000);
                  write_com(0x01);
              l1602_string(1,1,"wrong!");
              l1602_string(2,1,"Input again!");
              delay_1ms(1000);
                j=0;
                i=6;
                write_com(0x01);
               l1602_string(1,1,"The code is:");
                   main();
      }
        }
   }
  }
  


作者: ludaijin    時(shí)間: 2015-9-7 08:20
沒(méi)有原理圖啊
作者: 譚雅Ayom    時(shí)間: 2016-5-15 22:17
原理圖不給一下嗎?謝謝啊
作者: 神秘人    時(shí)間: 2016-5-22 10:27
看不懂這原理啊
作者: zxc5230    時(shí)間: 2016-5-22 12:49
能給出原理圖和功能說(shuō)明么不然直接這個(gè)程序也看不出所以然來(lái)
作者: sg116116    時(shí)間: 2016-5-22 14:44
有程序就好
作者: USA    時(shí)間: 2016-11-7 22:19
很不錯(cuò)的,有幫助
作者: 小邱y13    時(shí)間: 2016-11-8 21:16
有圖就好了
作者: llllmmm    時(shí)間: 2016-12-30 19:55
可以的不錯(cuò)
作者: Mr_zhang    時(shí)間: 2017-1-1 16:37
怎么看著像步進(jìn)電機(jī)的,,,不像密碼鎖的呢




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