找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3178|回复: 4
收起左侧

51单片机密码锁课程设计

[复制链接]
ID:412827 发表于 2018-10-22 17:15 | 显示全部楼层 |阅读模式
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit rs=P1^0; //      LCD1602数据命令选择输入
sbit rw=P1^1; //      LCD1602读写数据端
sbit en=P1^2; //      LCD1602使能信号端
sbit ledg=P2^0;          //  绿色二极管
sbit ledr=P2^7;                                    //红色二极管
sbit relay=P1^5;
sbit buzz=P1^4;
char table0[]="error";                           //提示输入错误
char table1[]="open";                          //提示输入正确
char table2[]="password:****"; //          //提示输入密码
int temp,ch,m0,m1,p=0,n0,n1,n2,n3,a=0;//,n4,n5;
  sbit led=P2^1;
  sbit BF = P0^7;  //定义读忙
  uchar busytest();  //读忙函数

void delay(int z)    //延时程序
{
int x,c;
for(x=z;x>0;x--)
for(c=100;c>0;c--);
}


      keyscan()           // 扫描输入的键值
{

     temp=P3&0xf0;  
     P3=0xfe;
     delay(1);
     temp=P3&0xf0;
        //led=0;                  
  while(temp!=0xf0)
{
  switch(temp)
  {
     case 0xe0:ch='7';
     break;
     case 0xd0:ch='8';
     break;
     case 0xb0:ch='9';
     break;
     default:ch=p;
     break;
         //led=0;
  }                          
          //led=0;
while(temp!=0xf0)
{
     temp=P3;
     temp=temp&0xf0;
}
}

     P3=0xfd;
     delay(1);
     temp=P3&0xf0;

   while(temp!=0xf0)
{
    switch(temp)
    {
       case 0xe0:ch='4';
       break;
       case 0xd0:ch='5';
       break;
       case 0xb0:ch='6';
       break;
       default:ch=p;
           break;
         }

   while(temp!=0xf0)
    {
      temp=P3;
      temp=temp&0xf0;
    }
}


   P3=0xfb;
   delay(1);
   temp=P3&0xf0;
   while(temp!=0xf0)
{
   switch(temp)

   {
   case 0xe0:ch='1';
   break;
   case 0xd0:ch='2';
   break;
   case 0xb0:ch='3';
   break;
   default:ch=p;
   break;
   }
  while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
}


     P3=0xf7;
     delay(1);
     temp=P3&0xf0;
     while(temp!=0xf0)
{
     switch(temp)
     {
     case 0xe0: ch='A';
         break;
     case 0xd0:ch='0';
         break;
     case 0xb0:ch='B';
         break;
     default: ch=p;
         break;
     }
    while(temp!=0xf0)
   {
   temp=P3;
   temp=temp&0xf0;
   }
}

//led=0;
return ch;
//led=0;
}




void wcom(uchar com)  //LCD写指令
   {
   busytest();
    en=0;
    rs=0;
        rw = 0;           //选择写入
        en=1;
    P0=com;
    //delay(1); //延时程序
    en=0;
    delay(1); //延时程序
   // en=0;
    }

   uchar busytest(void)// 读忙        1为忙  0为不忙
{
   // bit result;// 位定义,一字节
//        en = 1;       
        rs = 0;       
        rw = 1;       
        en = 1;
        en = 0;       
        while(P0 & 0x80)
        {
                en = 0;
        en = 1;
        }
    delay(1);
//        result=BF; //确定是否等于忙碌状态
//        en=0;
//        return result;
  }



void wdat(uchar dat)  //LCD中写入数据

     {
        busytest();//判断是否读忙
          en=0;
      rs=1;
          rw=0;
          en=1;
      P0=dat;
     // delay(1);  
      en=0;
      delay(4);
     // en=0;
     }



void init()          //LCD1602初始化
   {
   //en=0;
   //led=0;
    wcom(0x38);
   wcom(0x00);
   wcom(0x0e);
   wcom(0x14);
                          
   /*wcom(0x38);
   wcom(0x06);
           wcom(0x01);
   wcom(0x80); */
   //led=0;
   }



void error()          //    提示错误
{
     char m2;
     wcom(0xc6);
  for(m2=0;m2<5;m2++)
  {
   wdat(table0[m2]);

  }
}



void open()         //提示输入正确   
{
      char m2;
      wcom(0xc6);
     for(m2=0;m2<4;m2++)
      {
      wdat(table1[m2]);
      }
}




  void pass()                         //提示输入密码
   {
     //char m5=1;
     char m2;
     wcom(0x80);           //有问题
        // led=0;
     for(m2=0;m2<13;m2++)
     {
     wdat(table2[m2]);           //有问题
                //led=0;
     }

   }
  change(int m)
  {
    delay(500);
    wcom(m);
    wdat('*');
  }


    void main()                                  //主函数
{

   rw=0;
   ledg=1;
   ledr=1;
  // relay=0;
   buzz=1;

   init();

   delay(5);
   wcom(0x89);  
   pass();
   wcom(0x89);

         //led=0;          
   //led=1;
   while(keyscan()==p)     //输入第一个键值   
   {

   delay(3);
  // P2 =
    keyscan();

   }
         //led=0;
   wdat(keyscan());
   n0=keyscan();
   change(0x89);
   delay(10);                                          
   ch=p;
         //led=0;

   while(keyscan()==p)                 //输入第二个键值
   {
   delay(3);
   keyscan();
   }

  wdat(keyscan());
  n1=keyscan();
  change(0x8a);
  ch=p;                                                               

                                                                             
  while(keyscan()==p)                 //输入第三个键值
  {
  delay(3);
  keyscan();
  }

  wdat(keyscan());
  n2=keyscan();
  change(0x8b);
  ch=p;


  while(keyscan()==p)                 //输入第四个键值
  {
  delay(3);
  keyscan();
  }
  wdat(keyscan());
  n3=keyscan();
  change(0x8c);
                                                                          
/*
   ch=p;
   while(keyscan()==p)                 //输入第五个键值
   {
   delay(3);
   keyscan();
   }


  wdat(keyscan());
  n4=keyscan();
  change(0x8d);
  ch=p;                                                   

   while(keyscan()==p)                  //输入第六个键值
   {
   delay(3);
   keyscan();
   }
   wdat(keyscan());
   n5=keyscan();                                                  
   change(0x8e);     

*/                 // led=0;
        //        while(1);
  while(1)

  {
if(n0=='2'&&n1=='0'&&n2=='1'&&n3=='8') //设定密码值 2 0 1 8          并判断输入的是否是设定的密码值
{
   int m3=1;
   open();
    ledg=0;
   //relay=1;
   delay(3000);
   //relay=0;
         ledg=1;
   while(m3)
{
   int m4,m5;
   //ledg=0;

   for(m4=200;m4>0;m4--)
   {
     keyscan();
   if(keyscan()=='A')
     {
      m4=0;
      m3=0;
     }
   }

  //ledg=1;

  if(m3!=0)
  {

   for(m5=200;m5>0;m5--)
    {
    keyscan();
    if(keyscan()=='A')
      {
        m3=0;
      }
    }
  }

}

}
else
  {
    //ledr=0;
    error();
   // buzz=0;
    delay(2000);
         wcom(0x01);
         a++;
       
  }
         //ledr=0 ;
        // delay(2000);
         if(a==3)
         {        
          ledr=0;
          }
          else
          {
           break;
          }
        //init();                

  break;
         //init();
  }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-10-22 19:55 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:413688 发表于 2018-10-22 20:35 | 显示全部楼层
路过帮顶!
回复

使用道具 举报

ID:412827 发表于 2018-11-12 20:53 | 显示全部楼层
密码锁 课程设计.rar (928.2 KB, 下载次数: 47)
回复

使用道具 举报

ID:649102 发表于 2020-6-19 13:21 来自手机 | 显示全部楼层
初始密码是多少
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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