找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[求助]关于C程序的密码锁

[复制链接]
跳转到指定楼层
楼主
ID:14743 发表于 2009-6-27 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*************************************************************************************************
**** 调 试:周继承
**** Email: zhoujichengxi@163.com
*************************************************************************************************
**** 1. MCU:at89s51
**** 2. 晶振:12MH
**** 3. 2009.06. 完成
*************************************************************************************************
************************************************************************************************/
#include<reg51.h>
#define uchar unsigned char;
#define uint unsigned int;
void delay(void);
void delay1(void);
void right(void);
write(void);
uchar A[]={0,1,2,3,4,5};
uchar B1[]={0,0,0,0,0,0};
uchar B2[]={0,0,0,0,0,0};
uint key_data[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,0xbe};
char zhuan[12]={0,1,2,3,4,5,6,7,8,9,0x0a,0x0b};//键盘编号转化为对应的数字
uchar temp,temp1,i,y,c,c1;
c=0;
uint s,j;
 main()
  {
  EX1=1;
  PX1=1;
  IT1=1;
  c1=0; 
begin: s=5000;
  EA=1;
  ET0=1;
  TMOD=0x01; //定时器0为工作方式1
  TH0=(65535-5000)/256;
  TL0=(65535-5000)%256; //初植
  TR0=1;//启动定时器
  P1=0xfe;
  while(1)
   {if(s==0)
       goto loop;
   y=write();
   if(y!=0x0c)
    break;
    }
  B1[0]=y;
  while(1)
   {if(s==0)
       goto loop;
    y=write();
     if(y!=0x0c)
       break;
   }
  B1[1]=y;
  while(1)
      {if(s==0)
       goto loop;
    y=write();
     if(y!=0x0c)
       break;
    }
  B1[2]=y;
  while(1)
   {if(s==0)
       goto loop;
    y=write();
      if(y!=0x0c)
       break;
    }
  B1[3]=y;
  while(1)
   {if(s==0)
       goto loop;
    y=write();
      if(y!=0x0c)
       break;
    }
  B1[4]=y;
  while(1)
   {if(s==0)
       goto loop;
    y=write();
      if(y!=0x0c)
      break;
    }
  B1[5]=y;
  TR0=0;
  P1=0xff;
  if(B1[0]==A[0])
  {if(B1[1]==A[1])
  {if(B1[2]==A[2])
  {if(B1[3]==A[3])
  {if(B1[4]==A[4])
  {if(B1[5]==A[5])
   P1=0x00;
  delay1();
  right();
loop: TR0=0;
  P1=0xff;
  PCON=0x01;
  goto begin;}}}}}
  {P1=0xf0;
  delay1();
  c1++;
  if(c1<3)
  goto begin;
  c1=0;//还原C1的值
  for(i=0;i<100;i++)
   {
   P1=0xf0;
   delay();
   P1=0xff;
   delay();
   }
  P1=0xff;
  PCON=0x01;// 进入休眠
  goto begin;
  }
 }
/*********************************************************************
**** 子 程 序:读取键值服务程序
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日    期:2009.06.17
**** 版    本:
**** 公司名称:
**********************************************************************/
 write()//键值输入子函数
 {
 P0=0xf0;//送测试数据
 if(P0!=0xf0)//回读看是否有变化,如有则有键下
  {void delay();//有按键按下时延时去抖
  if(P0!=0xf0)//再读是否有键按下
   {P0=0xf0; // 再送测试数据
    temp=P0;//保存行或列值
    P0=0x0f;//数据反转
    temp=P0|temp;
   P1=0xbe;
    for(i=0;i<16;i++)
     {if(temp==key_data)
      temp=zhuan;
     }
   P0=0xf0;//送测试数据
   delay();
   if(P0==0xf0)
    {
   P1=0xfe;
   return(temp);}//如果有键按下返回键值
   }
  }
return(0x0c);//如果没有键按下返回无效值 
 }
/*********************************************************************
**** 子 程 序:延时去抖
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日    期:2009.06.17
**** 版    本:v1.0
**** 公司名称:
**********************************************************************/
void delay(void)//延时去抖
 {
  for(j=0;j<3000;j++);
 }
/*********************************************************************
**** 子 程 序:定时中断0
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日    期:2009.06.17
**** 版    本:v1.0
**** 公司名称:
**********************************************************************/
void timer0() interrupt 1//延时用于控制密码输入时间
  {TMOD=0x01; //定时器0为工作方式1
 TH0=(65535-5000)/256;
 TL0=(65535-5000)%256;//初植
 TR0=1;//启动定时器
    s--;
    }
/*********************************************************************
**** 子 程 序:读取密码正确状态服务程序
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日    期:2009.06.17
**** 版    本:
**** 公司名称:
**********************************************************************/
void right()//正确情况下子函数
 {
 c=0;
 c1=0;
 TR0=0;
  P1=0xff;
loop5:  s=5000;
 EA=1;
 ET0=1;
 TMOD=0x01; //定时器0为工作方式1
 TH0=(65535-5000)/256;
 TL0=(65535-5000)%256; //初植
 TR0=1;//启动定时器
 P1=0xfe;
 while(1)
  {
   y=write();
   if(y==0x0a)
   goto loop2;
   if(y==0x0b)
   goto loop3;
   if(s==0)
   break;
   }
  P1=0xff;
  goto loop4;
loop2: P1=0xfc; //kai mem
  delay1();
  P1=0xff;
  goto loop4;
loop3: P1=0x00;
  delay1();
  s=5000;
  EA=1;
  ET0=1;
  TMOD=0x01; //定时器0为工作方式1
  TH0=(65535-5000)/256;
  TL0=(65535-5000)%256; //初植
  TR0=1;//启动定时器
  P1=0xfe;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
     if(y!=0x0c)
     break;
   }
   B1[0]=y;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B1[1]=y;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B1[2]=y;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B1[3]=y;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B1[4]=y;
   while(1)
   {if(s==0)
   goto loop4;
   y=write();
    if(y!=0x0c)
    break;
   }
   B1[5]=y;
   P1=0x00;
   delay1();
   P1=0xff;
/********************************/
  s=5000;
  EA=1;
  ET0=1;
  TMOD=0x01; //定时器0为工作方式1
  TH0=(65535-5000)/256;
  TL0=(65535-5000)%256; //初植
  TR0=1;//启动定时器
  P1=0xfe;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
     if(y!=0x0c)
     break;
   }
   B2[0]=y;
   while(1)
   {if(s==0)
     goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B2[1]=y;
   while(1)
   {if(s==0)
    goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B2[2]=y;
   while(1)
   {if(s==0)
     goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B2[3]=y;
   while(1)
   {if(s==0)
     goto loop4;
   y=write();
    if(y!=0x0c)
     break;
   }
   B2[4]=y;
   while(1)
   {if(s==0)
     goto loop4;
   y=write();
    if(y!=0x0c)
    break;
   }
   B2[5]=y;
  /* for(i=0;i<6;i++)
    {
   while(1)
    {
    if(s==0)
     goto loop4;
    y=write();
    if(y!=0x0c)
     break;
    }
   B2=y; 
   }*/
   P1=0x00;
   delay1();
   P1=0xff;
   for(i=0;i<6;i++)
    {if(B1==B2)
   c++;
   }
   if(c<5)
   {P1=0xf0;
   delay1();
   c1++;
   if(c1<3)
   goto loop5;
   for(i=0;i<100;i++)
   {
   P1=0xf0;
   delay();
   P1=0xff;
   delay();
   }
   goto loop4;
   }
   for(i=0;i<6;i++)
    A=B1;
   P1=0x55;
   delay1();

loop4: TR0=0;
  P1=0xff;
 }
/*********************************************************************
**** 子 程 序:
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日    期:2009.06.17
**** 版    本:
**** 公司名称:
**********************************************************************/
void EXT1() interrupt 2
 {PCON=0x00;
 } 
/*问题有两个不能理解:
*1,为什么读取键值的时候不能用循环,循环
for(i=0;i<6;i++)
    {
   while(1)
    {
    if(s==0)
     goto loop4;
    y=write();
    if(y!=0x0c)
     break;
    }
   B2=y; 
   }
使用时跳出break后不再循环for(i=0;i<6;i++)
2,为什么把原始密码更改为有6的后就不能识别密码了,希望大家给点意见,共同进步!周继承在此感谢!QQ:551684929*/

[此贴子已经被作者于2009-6-27 11:03:16编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:14743 发表于 2009-6-27 10:17 | 只看该作者
程序大概流程:输入密码--正确(开门按A,改密码按B--输入两次对比,一致则更改成功,成功后休眠.否则回到按A开门和按B改密码状态,但是只有三次机会.三次后报警,报警后休眠)--错误的时候回到输入密码的状态,如果三次不对就报警,报警后休眠.
回复

使用道具 举报

板凳
ID:122508 发表于 2016-5-22 10:40 | 只看该作者
大神啊,真牛
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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