找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3445|回复: 9
打印 上一主题 下一主题
收起左侧

密码锁源代码

  [复制链接]
跳转到指定楼层
楼主
ID:78027 发表于 2015-4-25 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                                                 
#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;        //LAALBBLCCLDD
sbit LC=P3^2;
sbit LD=P3^3;
sbit key2=P3^5;//定义按键3
sbit key1=P3^4;//定义按键4
/********函数声明*****/
void right(unsigned int Speed,unsigned int road);//正转
void left(unsigned int Speed,unsigned int road); //反转
void mDelay(unsigned int DelayTime);//延时函数
int MotorStep=0;//步进索引
/*****正转,两个参数代表转速和步进量**********/
void right(unsigned int Speed,unsigned int road)
{                       //步进节拍: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);//这里的延时即控制转速
  road--;//完成一步
  }
P2&=0XF0;//将四个脚复位0,停止
}
/********反转,两个参数代表转速和步进量********/
void left(unsigned int Speed,unsigned int road)
{//步进节拍: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);//这里的延时即控制转速
  road--;//完成一步
  }
  P2&=0XF0;//将四个脚复位0
  }
/***********延时函数***************/
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)                  //读出函数是否处于忙状态
{
   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)                        //写指令函数
{
    while(busy());
        rs=0;        //选择指令寄存器
        rw=0;          //选择写操作
        en=0;
        delay();       
        P0=com;
        delay();
        en=1;
        delay();
        en=0;
}
void write_data(uchar date)                 //写数据函数
{
    while(busy());    //
        rs=1;                //选择数据寄存器
        rw=0;//选择读操作
        en=0;
        delay();
        P0=date;
        delay();
        en=1;
        delay();
        en=0;
}
void l1602_init()                                        //        初始化函数
{
        write_com(0x38);           //显示模式设置
        delay_1ms(5);                   //延时5ms
        write_com(0x08);           //开显示
        write_com(0x0f);           //开光标显示且闪烁
        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)                 //键盘函数
  {
  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直接驱动,初始时为低电平
                while(1)                         //循环
         {
                 if(((k==1)||(k==2))&&key1==0) //1键按下正转
               {  k=3;
                   if(k==4)
                   {P2=0X00;
                           while(1){}
                   }
                    right(10,200);//两个参数代表转速和步进量,以10的速度进200         
                                 P2=0X00;
                                 k=4;
                        }
                 if(((k==3)||(k==4))&&(key2==0))//2键按下反转
                            { 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();
      }
        }
   }
  }
  

评分

参与人数 2黑币 +53 收起 理由
gsgsg + 3 共享资料的黑币奖励!
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:44267 发表于 2015-9-7 08:20 | 只看该作者
没有原理图啊
回复

使用道具 举报

板凳
ID:120850 发表于 2016-5-15 22:17 | 只看该作者
原理图不给一下吗?谢谢啊
回复

使用道具 举报

地板
ID:122508 发表于 2016-5-22 10:27 | 只看该作者
看不懂这原理啊
回复

使用道具 举报

5#
ID:115515 发表于 2016-5-22 12:49 | 只看该作者
能给出原理图和功能说明么不然直接这个程序也看不出所以然来
回复

使用道具 举报

6#
ID:122571 发表于 2016-5-22 14:44 | 只看该作者
有程序就好
回复

使用道具 举报

7#
ID:146689 发表于 2016-11-7 22:19 | 只看该作者
很不错的,有帮助
回复

使用道具 举报

8#
ID:146882 发表于 2016-11-8 21:16 | 只看该作者
有图就好了
回复

使用道具 举报

9#
ID:158952 发表于 2016-12-30 19:55 | 只看该作者
可以的不错
回复

使用道具 举报

10#
ID:152650 发表于 2017-1-1 16:37 | 只看该作者
怎么看着像步进电机的,,,不像密码锁的呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表