用单片机设计一个简易的密码锁,用键盘输入0~9三位数的密码.密码输入正确显示“P”约3s,并通过P3.0端口将

大哥,求救
设计内容及要求
锁是人们生活中的常用物品,本题要求用电子元器件设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作(例如:利用继电器使电磁铁吸合拉动物件),并用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;
1. 在锁的控制电路中储存一个可以修改的4位代码,当开锁按钮开关(可设置成6位至8位,其中实际有效为4位,其余为虚设)的输入代码等于储存代码时,进入开锁状态而使锁打开;
2. 从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态(自锁时间20秒),使之无法再打开,并由扬声器发出持续20秒的报警信号,由显示电路显示剩余自锁时间。当连续输入3次错误密码时,系统锁定15分钟,锁定时间内禁止输入密码,同时由显示电路显示剩余锁定时间。
3.电子锁也能做门铃使用,但响声应与报警声相区别。

你这个问题内容量太大,不可能有谁那么多时间给你开发,我这边有个做过的类似的,代码送你了。

#include <msp430x14x.h>
#include "Delay.h"
#include "x24c02.h"
#include "LCD1602.h"

uchar LCD_ID_1[16] = {"Password: ------"};
uchar LCD_ID_2[16] = {"Old Code: ------"};
uchar LCD_ID_3[16] = {"                "};
uchar LCD_ID_4[16] = {"New Code: ------"};

#define JI_OPEN P3OUT|=BIT6
#define JI_CLOSE P3OUT&=~BIT6

uchar a=10,b=10+0x40,c=0,i=0,j=0,k=0,super=0;

uchar flag=0;

uchar table1[6]={1,2,3,4,5,6};
uchar table2[6]={0,0,0,0,0,0};
uchar table3[6]={0,0,0,0,0,0};
uchar supercode[6]={8,8,8,8,8,8};
//SCL时钟线
#define SCO_SET P1OUT|=BIT3//输出高
#define SCO_RESET P1OUT&=(~BIT3)//输出低
#define SCO_IN (P1IN&BIT3)//输出
#define SCOIN P1DIR&=(~BIT3)//设置输入
#define SCOOUT P1DIR|=BIT3//设置输出
//SDA数据线
#define SDO_SET P1OUT|=BIT2
#define SDO_RESET P1OUT&=(~BIT2)
#define SDO_IN (P1IN&BIT2)
#define SDOIN P1DIR&=(~BIT2)
#define SDOOUT P1DIR|=BIT2

void shuru(void);
void shezhi(void);
void bijiao(void);

uchar chumo_read(void)
{
  uchar i,dat;
  SCOOUT;//设置输出
  SCO_RESET;//输出低
  
  SDOOUT;
  SDO_SET;
  delay_us(93);
  SDO_RESET;
  delay_us(10);
  SDOIN;
  
  for(i=0;i<16;i++)
  {
    SCO_SET;
    delay_us(5);
    
    if(SDO_IN!=0)
    {
      dat=i+1;
    }
    
    SCO_RESET;
    delay_us(5);
  }
  delay_ms(2);
  return dat;
}   

void OPEN(void)
{
  P1OUT |= BIT4;
  P3OUT &=~BIT5;
  delay_ms(1000);delay_ms(1000);
  P3OUT &=~BIT5;
  P1OUT &=~BIT4;
}
void CLOSE(void)
{
  P3OUT |= BIT5;
  P1OUT &=~BIT4;
  delay_ms(1000);delay_ms(1000);
  P3OUT &=~BIT5;
  P1OUT &=~BIT4;
}
void main( void )
{
  //系统初始化
  WDT_Init();  //STOP WDT
  MCLK_Init(); //MCLK=8M
  Port_Init(); //CLOSE ALL PORT
  
  P3DIR |= BIT5;
  P1DIR |= BIT4;
  P3OUT &=~BIT5;
  P1OUT &=~BIT4;
  d24c_init();
  
  L1602_Init();
  L1602_string(1, 1, LCD_ID_1);
  
  P3DIR|=BIT6;
  P3DIR&=~BIT7;
  P6DIR|=BIT2;
  JI_CLOSE;
  
  delay_ms(10);
  table1[0]=d24c_read(1);
  delay_ms(20);
  table1[1]=d24c_read(2);
  delay_ms(20);
  table1[2]=d24c_read(3);
  delay_ms(20);
  table1[3]=d24c_read(4);
  delay_ms(20);
  table1[4]=d24c_read(5);
  delay_ms(20);
  table1[5]=d24c_read(6);
  delay_ms(500);
  
  while(1)
  {
    delay_ms(100);

    shuru();
    shezhi();
    bijiao();
  }
}

void shuru(void)
{
  wcmd(0x80+a+c);
  wcmd(0x0f);
  
  if((chumo_read()!=0)&&(chumo_read()<11))
  {
    delay_ms(10);
    if(chumo_read()!=0)
    {
      table2[c]=chumo_read();
      L1602_char(1,a+c+1,(chumo_read()%10)+0X30);
      c++;
      delay_ms(500);
      if(c==6)
      {
        c=0;
        L1602_string(1, 1, LCD_ID_1);
      }
    }
  }
  
  j=0;
  for(i=0;i<6;i++)
  {
    if(table1[i]!=table2[i])
    {
      j=1;
      break;
    }
  } 

  if(chumo_read()==13)
  {
    delay_ms(10);
    if(chumo_read()==13)
    {
      c=0;
      L1602_string(1, 1, LCD_ID_1);
      delay_ms(1000);
    }
  }
}

void shezhi(void)
{
  if(chumo_read()==16)
  {
    delay_ms(10);
    if(chumo_read()==16)
    {
      L1602_string(1, 1, LCD_ID_3);
      L1602_string(2, 1, LCD_ID_2);
      flag=1;
      c=0;
      delay_ms(500);
    }
  }
  while(flag==1)
  {
    wcmd(0x80+0x40+a+c);
    wcmd(0x0f);
    
      if((chumo_read()!=0)&&(chumo_read()<11))
  {
    delay_ms(10);
    if(chumo_read()!=0)
    {
      table2[c]=chumo_read();
      L1602_char(2,a+c+1,(chumo_read()%10)+0X30);
      c++;
      delay_ms(500);
      if(c==6)
      {
        c=0;
        L1602_string(2, 1, LCD_ID_2);
          super=1;
          for(i=0;i<6;i++)
          {
            if(supercode[i]!=table2[i])
            {
              super=0;
              break;
            }
          } 
      }
    }
  }
  
  k=1;
  for(i=0;i<6;i++)
  {
    if(table1[i]!=table2[i])
    {
      k=0;
      break;
    }
  } 

  if(chumo_read()==13)
  {
    delay_ms(10);
    if(chumo_read()==13)
    {
      c=0;
      L1602_string(2, 1, LCD_ID_2);
      delay_ms(1000);
    }
  }
    
  if(k==1 || super == 1)
  {
     L1602_string(2, 1, LCD_ID_4);
  }
    while(k==1 || super==1)
    {
      wcmd(0x80+0x40+a+c);
      wcmd(0x0f);

      if((chumo_read()!=0)&&(chumo_read()<11))
      {
        delay_ms(10);
        if(chumo_read()!=0)
        {
          table1[c]=chumo_read();
          L1602_char(2,a+c+1,(chumo_read()%10)+0X30);
          c++;
          if(c==6)
          {
            delay_ms(1000);
            c=0;
            flag=0;
            k=0;
            super = 0;
            d24c_write(1,table1[0]);
            delay_ms(30);
            d24c_write(2,table1[1]);
            delay_ms(30);
            d24c_write(3,table1[2]);
            delay_ms(30);
            d24c_write(4,table1[3]);
            delay_ms(30); 
            d24c_write(5,table1[4]);
            delay_ms(30);
            d24c_write(6,table1[5]);
            delay_ms(30);    
  
            L1602_string(1, 1, LCD_ID_1);
            L1602_string(2, 1, LCD_ID_3);
           }
         }
         delay_ms(400);
      }
      delay_ms(100);
      if(chumo_read()==13)
      {
        delay_ms(10);
        if(chumo_read()==13)
        {
          c=0;
          L1602_string(2, 1, LCD_ID_2);
          delay_ms(500);
        }
      }
   }
  }
}
void bijiao()
{
  if((j==0)||((P3IN&BIT7)!=0))
  {
    JI_OPEN;
    P6OUT&=~BIT2;
    OPEN();
    delay_ms(2000);
    L1602_string(1, 1, LCD_ID_1);
    for(i=0;i<6;i++)
    {
      table2[i]=0;
    }
    JI_CLOSE;
    CLOSE();
  }
  else
  {
    P6OUT|=BIT2;
  }
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-21
我以前写过一个程序,要是找找,还是能找到的,要比你的电路简单多了.
输出就不讲了,输出电平时间是可以设置的.
输入我讲一下,我用的是1个按键,密码输入方法类似摩尔斯码,如输入2,就是连续的按2下,如果输入8,就连续按8下,在这个按键上并一个LED,这个LED为状态显示,当密码输入正确时,LED闪一下.
如果密码都正确,输出脚输出高电平.
这个电路简单吧.本回答被网友采纳
第2个回答  2011-06-16
按你说的有点麻烦 不过还是可以完成的
第3个回答  2017-11-18
还可以不难
懂事电子设计 Vgz

...输入0~9三位数的密码.密码输入正确显示“P”约3s,并通过P3.0端口将...
#define JI_OPEN P3OUT|=BIT6#define JI_CLOSE P3OUT&=~BIT6uchar a=10,b=10+0x40,c=0,i=0,j=0,k=0,super=0;uchar flag=0;uchar table1[6]={1,2,3,4,5,6};uchar table2[6]={0,

基于单片机电子密码锁设计~
给你一个思路吧,先用7个端口做成3*4矩阵键盘,0~9 * #共12个键,另外用4个端口做红灯输出、绿灯输出、报警输出、开锁输出。*键为取消键,#键为确认键,密码可存入单片机的ROM中(不能改密码)或存入24CXX串行E2PROM(可改密码)。键盘处理方法可以用两种,一种是在主程序里不停扫描端口检测按键...

51单片机矩阵键盘输入0-999999的任意数的问题?
0-999999,最多有6位数,因此可声明一个 6 byte的数组keybuffer[6]和一个存储数字位数的变量bitnum unsigned char keybuffer[6];unsigned char bitnum=0 ;if(key<10){ keybuffer[bitnum] = key ;bitnum ++ ;}\/\/如果用数码管显示,直接把keybuffer的值送显就可以了 \/\/如果还需把值算出...

求用51单片机控制的简单密码锁原理
main: MOV A,#88H ;方式0 MOV DPTR,#CADDR MOVX @DPTR,A CLR P1.2 mov r0,#50h ;初始密码首地址 mov r1,#08h szmm: mov @r0,#00h ;设置密码 inc r0 djnz r1,szmm mov r2,#03h ;设置输入密码的次数 K:mov ie,#81h ;中断方式设置 mov tcon,#01h k1:mov...

怎样制作个电子密码锁,用来控制电路的开关
回答:要求电子器件设计制作密码锁的控制电路,使之在输入正确的代码时,输出信号以启动执行机构动作,并且用红、绿LED指示关锁、开锁状态。 (2) 1)密码锁控制器中存储一个4位代码,当开锁按钮开关设置9位,其中只有4位有效)的输入代码等于存储代码时启动开锁控制电路,并且用绿灯亮、红灯灭表示开锁状态。 2)...

单片机用3*3矩阵键盘显示数字0~9
那就选择数码管吧,假设矩阵键盘连P1口,数码管连P0口,上电后数码管显示0,然后3*3键盘控制显示1~9,程序c语言如下:\/***扫描法监测键盘,显示按键数值。我的板子是4*4的,所以没调试,有不对的地方我再给你调我看有别人也再问,不介意我去赚点分吧~~~ o(︶︿︶)o***...

基于单片机的电子密码锁设计
设计一个由51单片机控制的电子密码锁,输入接口使用4×4键盘,输出接口使用6位7段数码管。单片机将输入的密码与设定的密码比较,若密码正确,则密码锁打开(绿色发光二极管亮一... 设计一个由51单片机控制的电子密码锁,输入接口使用4×4键盘,输出接口使用6位7段数码管。单片机将输入的密码与设定的密码比较,若密码正确,...

基于单片机英文输入显示系统设计,要求能用行列式键盘输入英文字母的大小...
简单一点设计是26个字母,你设定6*6扫描矩阵,一共36个点,这样只要12个普通IO口就可以,满足需求,软件中做定时巡查就可以了,显示的话是看你要接到电脑屏幕还是自己做一个液晶屏,接电脑屏幕的话,就单片机外面做一个RS232接口,将数据串行发送给电脑屏幕。如果是加一个液晶屏,自己就做好26字母的...

基于单片机的智能电子密码锁怎么做
while(keyval!=D[4]) \/\/第五位密码输入不正确,等待 ;while(keyval!=D[5]) \/\/第六位密码输入不正确,等待 ;while(keyval!=D[6]) \/\/没有输入“OK”,等待 ;P3=0xfe; \/\/P3.0引脚输出低电平,点亮LED } \/ 函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位 \/ ...

单片机密码锁怎么判断密码正确
(1)通过单片机编程,设置电子锁的原始密码;(2)通过键盘键入密码;(3)通过数码管显示键入内容;(4)当输入正确密码时,显示灯闪亮一次,输入错误密码时显示灯不亮;(5)可以通过键盘输入新密码,修改原密码。READ EQU 0 ;WRITE EQU 2 ;EWEN EQU 4 ;EWDS EQU 6 ;FLGO ...

相似回答