强密码生成器的设计与实现

发布于:2022-11-29 ⋅ 阅读:(177) ⋅ 点赞:(0)

目 录
摘 要 I
Abstract II
1绪论 1
1.1选题背景及意义 1
1.2国内外研究现状 1
1.3研究主要内容 2
1.3.1题目要求 2
1.3.2本设计主要硬件功能部分 2
1.3.3本设计软件的总体构思 3
2硬件设计 4
2.1EEPROM模块 4
2.2RFID读卡器通信模块 7
2.2.1 RFID读卡器通信的基本原理 7
2.2.2 RFID读卡器密码生成器及其编码 8
2.2.3 RFID读卡器生成强密码 11
2.2.4 RFID读卡器发送与接收设备 11
2.3 LCD5110液晶显示模块 13
2.3.1 LCD5110介绍 13
2.3.2 LCD5110引脚功能表 14
2.3.3 LCD5110电路图 14
2.4 单片机最小系统模块 15
2.4.1单片机选择 15
2.4.2 ATMEGA328P芯片内部资源 16
3软件设计 20
3.1 ARDUINO软件开发环境 20
3.2 PROTEUS原理图仿真 21
3.3 程序流程图 23
3.3.1 主程序流程图 23
3.3.2 RFID读卡器接收强密码 24
3.3.3 串口收发数据模块(调试) 24
4系统测试 26
4.1 硬件调试 26
4.1.1RFID读卡器调试 26
4.1.2继电器调试 26
4.2软件调试 27
总 结 28
致 谢 29
参考文献 30
附 录 32
附录A 系统整体原理与实物图 32
附录B 系统源程序 34
1.3研究主要内容
1.3.1题目要求
RFID读卡器强密码生成器由RFID读卡器密码生成器、RFID读卡器接收终端、带控制的电子锁、提醒电路、密码存储模块构成。当RFID读卡器接收终端收到器发送的开锁密码信号后,并与保存在EEPROM中的密码对比。当对比成功后单片机通过IO口向电子锁发出开锁命令,完成开锁功能;当密码输入错误时通过用户实现提醒功能,用户还可以根据需要更改密码以提高系统防盗安全性。
此题目的重点、难点是实现RFID读卡器信号的接收、密码储存和正确识别按键并显示操作结果。由于RFID读卡器不影响周边环境、不干扰其他电器设备,其无法穿透墙壁。因此,不同房间的家用电器可使用通用的器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,本文转载自http://www.biyezuopin.vip/onews.asp?id=14175一般不需任何调试即可投入工作;编强密码容易,可进行多路。而且RFID读卡器密码锁体积较小、操作方便等优势,具有很好的市场前景。
1.3.2本设计主要硬件功能部分
本系统主要由六大部分组成:
1)单片机最小系统模块
2)LCD5110液晶显示模块
3)RFID读卡器接收模块
4)RFID读卡器发送模块
5)EEPROM密码存储模块
6)用户提醒模块
1.3.3本设计软件的总体构思
本设计以Atmel公司的Atmega328P-PU芯片为核心控制器件,通过Atmega328P芯片与EEPROM之间交换密码后,再与用户通过键盘或RFID读卡器发送过来的密码作对比,然后使用LCD5110显示操作结果,用用户提示密码输入是否正确。当用户输入错误次数达到上限(3次)时,用户能够实现提醒功能;用户还可以根据需要修改密码以保证系统的安全,从而实现RFID读卡器强密码生成器的设计,系统框图如下。

/*
 * Pin 1(VCC) -> +3.3V (rightmost, when facing the display head-on)
 * Pin 2(SCLK) -> Arduino digital pin 2
 * Pin 3(SDIN) -> Arduino digital pin 3
 * Pin 4(DC) -> Arduino digital pin 4
 * Pin 5(SCE) -> Arduino digital pin 6
 * Pin 6 -> Ground
 * Pin 7 -> 10uF capacitor -> Ground
 * Pin 8(RST) -> Arduino digital pin 5
 * RFID读卡器接收引脚 Pin  7
 * LED引脚 Pin 9
 * 用户测试引脚  Pin 8
 */
#include <PCD8544.h>
#include <IRremote.h>
#include <STRING.H>
#include <TimerOne.h>
#include <EEPROM.h>

#define Code_Number 6

void LCD_Init(void);
void Keyvalue_Get(void);
void PD_Save(void);
void Print_Password(void);
void Input_Code(void);
void Set_Code(void);
void PD_Compare(void);
void Code_Right(void);
void Code_Wrong(void);
void Get_Com_Code(void);
void Get_New_Code(void);
void Get_Old_Code(void);
void Input_Com_Code(void);
void Exit(void);
void Timer_Isr(void);                        //中断服务函数定时器

static PCD8544 lcd;                          //结构体定义
static char Password[Code_Number]={
  '1','2','3','4','5','6'} 
, PD_Get[Code_Number]={
  '0','0','0','0','0','0'}
,Password_S_T[Code_Number]={ 
  '0','0','0','0','0','0'};
char Main_Page_F=0,Main_Page_Confirm_F=0;
char Input_Code_F=0,Set_Code_F=0,Exit_F=0;   //输入密码,设置密码标志位
int  key=0,Hour=12,Minute=12,Second=12;       //时间显示变量
int  Clear_Screen_F=0,Buzzer_Set_F=0;
int  Recv_Pin = 7, LED_Pin_9=9,Code_Right_F=0;//定义RFID读卡器的引脚为10,LED --Pin 9
int  Buzzer_Pin_8=8 , Buzzer_Input_F=0;          //提醒功能引脚及标志位
IRrecv irrecv(Recv_Pin);
decode_results results;
unsigned long decode_value;
unsigned long en_num[12]={
  0x006897,0x0030CF,0x0018E7,0x007A85,       
  0x0010EF,0x0038C7,0x005AA5,0x0042BD,
  0x004AB5,0x0052AD,0x00A857,0x00906F,       //0x00A857 --+   0x00906F -- EQ
};                                         //from 0 to 9 encode value  
void setup() {                              //initial  lcd5110
  lcd.begin(84, 48);
  pinMode(LED_Pin_9,OUTPUT);                 //测试LED
  pinMode(Buzzer_Pin_8,OUTPUT);
  Serial.begin(9600);                  
  irrecv.enableIRIn();                       // 初始化RFID读卡器
  Timer1.initialize(10000);
  Timer1.attachInterrupt(Timer_Isr); // blinkLED to run every 0.15 seconds
}
void LCD_Init()
{
  if(EEPROM.read(0)==8)                     //判断是否为初始密码,初始密码为 7 5 2
    for(int i=0;i<Code_Number;i++) 
      Password[i]=EEPROM.read(i+1);         //读出初始密码
  else 
    for(int i=0;i<Code_Number;i++)
    EEPROM.write(i+1,Password[i]);
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("1. Unlock");
  lcd.setCursor(0,2);
  lcd.print("2. Set code");
  lcd.setCursor(0,4);
  lcd.print("3. Exit now");
  do{
    Keyvalue_Get() ;
  } 
  while(!((key=='1')||(key=='2')||(key=='3'))) ; 
  if(key=='1')                               //按下输入密码键
  { 
    Input_Code_F=1 ;
    key=0;
  }
  if(key=='2')                               //按下设置键
  { 
    Set_Code_F=1;   
    key=0;
  }
  if(key=='3')
  { 
    Exit_F=1;       
    key=0;
  }
}

void Keyvalue_Get(void)
{
  if (irrecv.decode(&results))
  {
    results.value=results.value&0x00FFFF;
    if(results.value<0x00FF00){      
      switch(results.value){
      case 0x006897 :
        key='0';
        break;
      case 0x0030CF :
        key='1';
        break;
      case 0x0018E7 :
        key='2';
        break;
      case 0x007A85 :
        key='3';
        break;
      case 0x0010EF :
        key='4';
        break;
      case 0x0038C7 :
        key='5';
        break;
      case 0x005AA5 :
        key='6';
        break;          
      case 0x0042BD :
        key='7';
        break;
      case 0x004AB5 :
        key='8';
        break;
      case 0x0052AD :
        key='9';
        break;
      case 0x00A857 :                         //cancle button
        key='c';
        break;                   
      case 0x00906F :                         //set button
        key='s';
        break; 
      }      
      //      return 1 ;                       //不能加这句,多次测试出现错误
    }
    irrecv.resume();                          //获取下一个强密码值,必须放在强密码函数里面 !
  }        
}

void Print_Password(void)                     //print  code  
{  
  for(int i=0;i<Code_Number;i++)lcd.print(PD_Get[i]); 
}   
void loop() 
{
  LCD_Init();                                 // 初始化界面
  interrupts();                               //open interrupt 
  while(1)
  {
    if(Input_Code_F)                          //输入密码
    { 
      Input_Code_F=0;
      Input_Code();
    }         //clear Flag          
    if(Set_Code_F)                            //设置密码    
    { 
      Set_Code_F=0;  
      Set_Code();  
    }         //clear Flag        
    if(Exit_F)
    { 
      Exit();
    }                                        //不能清标志位,因为要一直显示
    if(Main_Page_Confirm_F)                   //清所有标志位
    { 
      digitalWrite(Buzzer_Pin_8,LOW);          //close led
      digitalWrite(LED_Pin_9,LOW);
      Main_Page_Confirm_F=0 ;
      Buzzer_Set_F=0 ;
      Buzzer_Input_F=0;  
      Main_Page_F=0;  
      Exit_F=0;    
      LCD_Init();                             //回到主界面     
      Clear_Screen_F=0;                       //复位清屏标志位
    }
  }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看