改装密码锁实验报告

时间:2024.3.23

北京邮电大学

电路综合实验报告

实验题目:带音乐的密码锁

学生姓名:

班    级:

小班学号:

同组姓名:

E-MAIL:

目录

一.  先前准备(流水灯数码管)

二.  设计目的、用途、功能

三.  硬件设计

四、软件设计

五、实验器材

六、实验结果及截图

七、 分工情况

八、实验总结和心得体会

九、参考文献

十、代码

摘要:本项目是一个基于ATMega 16单片机的电子密码锁改装,通过外接4×4键盘、LCD液晶显示、喇叭、蜂鸣器和LED灯,实现了如下功能:每次按下按键喇叭声响,0~9声音一致,其他按键声音不同,确保密码安全性,密码锁的密码验证,输入密码成功后可以重新设置密码,并且密码可以无限长,输入错误后蜂鸣器报警直到输入错误3次后启动倒计时功能,在倒计时内键盘自动锁死,倒计时结束后恢复所有功能等,通过LCD的巧妙使用实现友好的人机界面功能。

关键字:ATMega16 AVR单片机 、密码锁、 键盘、 LCD 、开锁、倒计时、喇叭

一.  先前准备(流水灯数码管)

在实现大型程序之前我们进行了简单的流水灯数码管试手。该程序实现了每一秒流水灯循环移位以及数码管计时的功能, 并实现了数码管计时的外部中断,在按下按键时数码管计时停止不动,但是流水灯照常工作,取消按键时数码管继续从原来的地方开始计数。

二.设计目的、用途、功能

1.设计目的

随着科技的发展,安全问题越来越受到人们重视,不仅居家安全受到重视,出门在外行李物品的安全问题也受到了很多关注,在此基础上各种安全产品相继问世,密码锁一直都是人们财产安全乃至生命安全的一种重要保障。伴随着人类历史的发展和人们对自身财产安全和人生安全的重视,各种各样的多功能的锁具也相继出现,人们使用的锁具也由传统的机械式锁逐渐发展为安全性能更好,功能更多的电子密码锁。在现代社会,电子密码锁已是一个被大家所熟识的名词。本次试验中将要介绍的电子密码锁是一种通过判断密码输入是否正确来控制电路或是芯片的工作状态。本次试验中,我们在密码锁基础上实现解锁、更改任意长度密码、输入三次错误进入倒计时锁定功能,输入密码成功播放音乐等功能,使得密码锁功能更加丰富,交互界面更加友好。

2.设计用途

由于本设计成本较低且安全性能稳定,可适用于家庭防盗、行李箱、车载行李箱等一些安全性能要求不高且需要便携的产品上,其安全性能远远优于同等成本的安全性。其中输入密码错误无限报警和自动锁死的功能能提高用户的警觉性,降低失窃率。更重要的是本设计的键盘重新定义的思想可移植到自动提款机、公共场合的提款装置等,可以防止用户输入密码时被别人偷看、窃取等,增加用户提款时的安全性。LCD具有良好的人机友好界面,在未开锁之前显示“welcome”,并且只有知道如何开锁才能使用密码锁,进一步提高了安全性能。

3.设计功能

(1)系统功能:

1、    密码键盘的输入:包括0-9数字输入、A-F为功能键。

键盘默认如下:                                                                                  

1    2    3    4

                         5    6    7    8

                         9    0    A    B

                         C    D    E    F

其中A代表reset(复位),B代表*,C代表关锁,D 代表clear(删除),E代表change(修改),F代表#。

2、    液晶显示:主要用于液晶显示屏将具体输入数字用*号代替,便于用户看到自己是否输入六位。最开始显示“Welcome”字样,然后显示操作指南“A=reset,B=*,C=close,D=del,E=change,F=#,”密码输入正确显示“right”绿灯亮并有音乐播放,密码输入错误显示“wrong”红灯亮蜂鸣器响提示输入错误。

(2)处理技术:

1、    密码正误信息输出:“确认”输入后,扫描键盘,与EEPROM中的内置密码相比较,若相同,进入“密码重置”功能;否则,在三次提示输入错误后蜂鸣器鸣响报警。

2、    密码重置:密码正确后,提示是否修改密码,修改按“g”,并且可以修改任意长度密码。两次输入一致后修改内置密码并液晶屏文字提示如果两次输入不一致则重新进入密码重置。

(3)扩展功能

倒计时功能:密码三次输入错误后需间隔半分钟(或更久)后才能再次输入,LCD液晶显示倒计时时间。

密码重置时密码可以任意长度。

液晶显示变幻:可实现闪烁,无限滚动等效果(利用C语言编程实现)。

三.硬件设计

1.系统硬件设计思路

系统以Atmega16单片机为控制核心,4*4键盘作为输入模块,1602液晶显示屏作为显示模块实现密码锁的各项功能。

(1)   系统硬件方框图如下:

(2)系统工作的流程图如下

正确,错误,是,是,否,否,错误,判断是否修改密码

,正确,错误,       判断密码正误,  重新输入,       判断密码正误,  重新输入,判断三次内是否输入正确,修改密码
及确认
,LED灯亮(代表开启),否,修改密码
及确认
,LED灯亮(代表开启),判断是否修改密码

 


2.电路连接原理

(1)键盘电路:4*4键盘采用行列式键盘,使用单片机的8个I/O端口就可以控制16个按键。键盘的8个引脚分别接在PORTB的8个端口。对键盘进行扫描时,可以采用查询扫描的方法:先对一行进行扫描,再对列进行扫描,直至将每行每列都扫描一次,通过单片机端口电平的变化,判断哪个按键被按下。

(2)LCD液晶显示电路:1602液晶主要用于与用户交互,提示密码输入状态和显示结果。其中LCD的7~14号引脚分别连结单片机的PORTA各端口,用于数据的并行传输。4~6号引脚与PC0,PC1,PC7相连,分别控制RS(数据/指令寄存器选择)、RW(读写选择引脚)、E(读写使能引脚)。相关功能,我们参照1602的数据手册。

(3)LED电路:用指示灯模拟继电器。密码输入正确绿灯亮,单片机的PD0端口便会输出高电平;密码输入错误红灯亮,单片机的PD2端口便会输出高电平,此时锁未打开。

(4)喇叭电路:密码输入正确喇叭播放一段音乐,喇叭接PD5。

(5)蜂鸣器电路:蜂鸣器电路用于报警。当密码输入错误时,单片机的PD1端口便会输出高电平,蜂鸣器即发出报警声。

3.电路原理图

四、软件设计

1.程序设计思想

1)键盘扫描:键盘扫描程序的流程图如下图所示。对键盘进行查询扫描,确定有键按下后,读取键值,进行延时去抖,再次读取键值,若两次键值相等则返回键值。

一般情况下,我们运用软件进行延时去抖,通常用delay_ms(10),在此期间CPU不能进行其它工作。

 

2LCD显示程序:根据1602的数据手册,我们可以针对其各引脚的定义和内部结构,定义显示字符函数、显示字符串函数、清屏函数和初始化函数,在后续程序中调用即可。

3)音乐程序:此程序根据ATMEGA16的PD4,PD5端口的第二功能通过定义音乐字符的音调和持续时间来进行音乐的输出。

3)整体流程:此程序通过设置多个全局变量把各部分的程序统一成为整体。其中input_sign用于标记是否有键按下,当其为1时代表有键按下;state用于标记功能,state=0代表输入密码,state=1代表密码输入成功,state=2代表改密码,state=3代表修改键盘,state=4代表功能选择;数组password[]用于存储密码;数组key[][]用于存储键值。运用if语句即可实现各种功能。

五、实验器材

六、实验结果及截图

(1)欢迎界面                               (2)操作指南无限循环

(3)当任意按一个键,进入键盘解锁界面        (4)进入输入密码界面

(5)输入六位密码                            (6)判断正误(左边正确,右边错误)

(7)修改密码界面   

七、  分工情况

***:在实验中负责电路搭建与优化,协调输出端口的分配,负责LED显示屏和4*4矩阵键盘代码的编写和原理研究,提出密码锁关于音乐的改装思路。

***:实现键盘模块功能,编写了键盘的扫描函数和键盘相应状态控制函数,完成了其它一些小函数的编写。在最后实验调试中起到了重要的作用。

八、实验总结和心得体会

1)实验总结

①概括这次实验

本项目是做一个基于ATMega 16单片机的电子密码锁,通过4×4键盘和LCD液晶显示,实现了密码锁的基本功能,并在此基础上进行音乐改装。

我们的出发点是设计出既安全又成本低的密码锁。 我们的密码锁有如下功能:密码验证、修改密码、输入错误后鸣笛,输入正确后播放音乐,复位后启动倒计时功能、显示操作指南等功能。

我们收获了很多基础知识,比如说:对键盘进行扫描时,可以采用查询扫描的方法,即先对一行进行扫描,再对列进行扫描,直至将每行每列都扫描一次,通过单片机端口电平的变化,判断哪个按键被按下。当然,我们也掌握了液晶显示屏的各个管脚的左右,也掌握了ATmega16的各个管脚的作用。

自然,我们不仅收获了上面所说的知识,也锻炼了自己的动手能力和解决问题的能力。最重要的是也培养了我们团结协作的能力。

②实验中遇到的问题以及解决方案

1.      之前在搭建电路时使用了PC2-PC5管脚,发现下载时出错,最后才知道PC2-PC5管脚是下载端,改了电路端口后错误消失。

2.      在测试键盘功能时,不能控制键盘,而且按键的时候发现实际功能和预设功能不同,当时觉得很奇怪。后来经过不断地探索,发现是判断按键的那段代码的值错了,在修改之后发现好了了。

3.      紧接着就是显示屏的代码问题,会遇到一些字符显示太快,或者是没有达到预期的结果,但是都通过不断地修改断码来解决问题。距离说一下,就是我要实现的功能是按了*键之后,显示”press #”,但是每次都显示“press *”,后来发现是函数里有一个case少了一个break。

4.      最后呢是显示倒计时, 刚开始显示乱码。最后写了这样一个函数LCD_show(m,n);  利用for循环,把数组里的0,1,2等换成‘0’,‘1’,‘2’才解决了问题。

(2)      心得体会

 一分耕耘一分收获,这次实验,把这句话展现的淋漓尽致。我想在实验成功的那一刹那,就是对我们这历时一周的忙碌最好的报答。

这次实验还算顺利,在规定日期前就完成了任务。时间呢,可能大部分花费在解决一些不可预知的问题上了,无论是连电路,还是写代码,虽然也会出现问题,整体来说还算顺利。

有时候一整天都待在实验室,虽然说累,但是很值得。怀揣着一份新奇,不断尝试,感觉那样的日子很充实,很快乐。

在这次实验中,出现了许多问题,但是我觉得遇到的困难越多,越难解决,当你成功时的喜悦就越大。就好像在密码锁改装时为了修改为任意长度的密码,仅仅修改一处代码,其他地方的代码也会出错,在经过无数次修改与调试之后,终于成功了,那一刻成功的喜悦是无法用言语描述的。

当然对于密码锁,我们接触最多的就是取款机了,我们设计的这个密码锁,与众不同的地方就是我们可以让我们的液晶显示屏无限循环的显示操作指南,只有当你按下键盘上的任意一个键的时候才可以终止这种循环。还有一点,就是我们的密码锁加了倒计时这个功能,当输入错误次数超过三次的时候,就不能再输入了,更加安全。

九、参考文献

《AVR C语言开发入门指导》

《AVR单片机原理及应用》

《1602液晶说明》

《cn_mega16-16L》

《AVR系统板说明》

十、代码

1.流水灯数码管

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

int num[10]=          

{        0b10111111,//0

         0b00001110,//1

         0b11011011,//2

         0b11001111,//3

         0b01101110,//4

         0b11101101,//5

        0b11111101,//6

         0b00001111,//7

         0b11111111,//8

         0b11101111//9

};

volatile int temp0 = 0;

volatile int temp1 = 0;

unsigned int g;

volatile int dq;                       //

        

int main(void)

{   g=0;

         dq=0;

         TCNT0 = 55;

         TIMSK |= (1 << TOIE0);//使能TC1溢出中断

         TCCR0 |= (1 << CS01);//8分频

         int i , j;

         char temp;

         DDRA = 0xff;

         DDRB = 0xff;

         DDRD = 0xf7;

         PORTD = 0b10111111;   

         PORTB = 0b10110111;

         PORTA = 0b00000001;

         MCUCR = (1<<ISC11) ;//INT1设置边沿触发

         GICR|=(1 << INT1);//使能INT1中断

         sei (); //使能总中断

         while(1)

         {        if(dq==0)

                   {        temp = PORTA;        

                      PORTA = PORTA <<1;

                            dq=1;

                      if ( temp & 0b10000000)

                     {

                                     PORTA = PORTA | 0b00000001;

                            }

                   }

                   if(PIND & (1<<3) )

                   {

           if(g<=60)

                            {        int temp0 = g/10;

                                     int temp1 = g%10;

                                     PORTD = num[temp1];

                                     PORTB = num[temp0];

                                    

                            }

                            else if(g>60)

                            {

                                     g=0;

                            }

                           

                   }

        

         }                                            

}

SIGNAL ( SIG_INTERRUPT1 )

{

         PIND=~PIND;

        

}

volatile unsigned int cnt = 0;

SIGNAL(SIG_OVERFLOW0)

{

         TCNT0 = 55;

         cnt ++;

         if(cnt >=605 )

         {

                   cnt=0;

                   dq=0;       

                   if(PIND & (1<<3) )

                   {

                            g++;

                   }

         }

        

        

}

2.密码锁

#include<avr/io.h>

#include<string.h>

#include<util/delay.h>

#define  uchar unsigned char

#define  uint  unsigned int

unsigned char  key_stime_ok;

unsigned char key_temp=0;

unsigned char error=0, number=0;

unsigned char Password = 7;

unsigned char Password1;

unsigned char  key_stime_counter;

unsigned char animation_state=0;

unsigned char code_number[6], temp1[6],temp2[6];

int password[16]={1,2,3,4,5,6,7};

uchar time_show[]={'0','1','2','3','4','5','6','7','8','9',':'};

uchar instr[]="A=Ent,B=*,C=Lok,D=Del,E=Chag,F=#";

unsigned int music_h[7]={524,588,660,698,784,880,988};//存放H调音阶频率(高8度)

unsigned int Doraemon[][2]=                                       //哆啦A梦

{

{196,475},{262,225},{262,475},{330,225},{440,475},

{330,225},{392,600},{392,475},{440,225},{392,475},

{330,225},{349,475},{330,225},{294,600},{220,475},

{294,225},{294,475},{349,225},{495,475},{495,225},

{440,375},{392,125},{349,500},{349,375},{330,125},

{220,250},{247,500},{262,250},{294,2000}

};

void delay(unsigned int x)

{       

   TCNT0 = 55;          //设置TC寄存器的初值

   TCCR0 |=(1<<CS01);   //设置8分频

   for(int i=0;i<x*350;i++)         //i表示计时器得到的毫秒数,根据我们之前的实验,循环30次大约为1毫秒

   {

                   while(!(TIFR & (1 << TOV0)));

        TCNT0 = 55;

   }//一个计时器周期

}       

void instruction();

#define No_key       255

#define K1_1    1

#define K1_2    2

#define K1_3    3

#define K1_4    4

#define K2_1    5

#define K2_2    6

#define K2_3    7

#define K2_4    8

#define K3_1    9

#define K3_2    0

#define K3_3    'A'

#define K3_4    'B'

#define K4_1    'C'

#define K4_2    'D'

#define K4_3    'E'

#define K4_4    'F'

#define Key_mask   0b00001111

void write_com(uchar com)//写指令

{       

         PORTC &= ~0x80;

         PORTC &= ~0x02;

         PORTA  = com;

         PORTC |= 0x01;

         _delay_ms(10);

    PORTC &= ~0x01;

}

void write_dat(uchar dat)//写数据

{

         PORTC |= 0x80;

         PORTC &= ~0x20;

         PORTA  = dat;

         PORTC |= 0x01;

         _delay_ms(10);

    PORTC &= ~0x01;

        

}

void LCD_show(int x, int y)//显示倒计时

{

         write_com(0x80+3);

         _delay_ms(50);

         write_dat(time_show[x]);

         write_com(0x80+4);

         _delay_ms(50);

         write_dat(time_show[y]);

         _delay_ms(1000);

        

}

void show(uchar j)//显示屏

{        int i;

         write_com(0x0c);

         _delay_ms(50);

         write_com(0x06);

         _delay_ms(50);

         switch(j)

    {

                   case 0:

                   {

                            uchar table[]="WELCOME!^_^";

                            write_com(0x01);

                            _delay_ms(50);

                            write_com(0x80+0x10);

                            _delay_ms(50);

                            for(i=0;i<11;i++)

                            {

                                     write_dat(table[i]);

                                     _delay_ms(100);

                            }

        

                            for(int j=0;j<13;j++)

                            {

                                     write_com(0x18);

                                     _delay_ms(100);

                            }

                            _delay_ms(500);

                            instruction(instr);

                            _delay_ms(1000);

                            break;

                   }

                   case 1:

                   {       

                            write_com(0x01);

                            _delay_ms(10);

                            uchar table1[] = "or return";

                            for (i=0;i<9;i++)

                            {

                                     write_dat(table1[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 2:

                   {       

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table2[] = "press F";

                            for (i=0;i<7;i++)

                            {

                                     write_dat(table2[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }       

                  

                   case 3:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table3[] = "press B";

                            for (i=0;i<7;i++)

                            {

                                     write_dat(table3[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 4:

                   {

                            uchar table4[] = "then press F";

                            write_com(0x80+40);//让字符在第二行显示

                            _delay_ms(50);

                            for (i=0;i<12;i++)

                            {

                                     write_dat(table4[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 5:

                   {

                           

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table5[] = "input the code";

                            for (i=0;i<14;i++)

                            {

                                     write_dat(table5[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 6:

                   {

                            write_com(0x01); //先清屏

                            _delay_ms(50);

                            uchar table6[] = "right";

                            for (i=0;i<5;i++)

                            {

                                     write_dat(table6[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 7:

                   {

                            uchar table7[] = "open";

                            write_com(0x80+40);//让字符在第二行显示

                            _delay_ms(50);

                            for (i=0;i<4;i++)

                            {

                                     write_dat(table7[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 8:

                   {

                            uchar table8[] = "please press E";

                            write_com(0x80+40);//让字符在第二行显示

                            _delay_ms(50);

                            for (i=0;i<14;i++)

                            {

                                     write_dat(table8[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 9:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table9[] = "code is wrong";

                            for (i=0;i<13;i++)

                            {

                                     write_dat(table9[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 10:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table10[] = "change code";

                            for (i=0;i<11;i++)

                            {

                                     write_dat(table10[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 11:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table11[] = "input again";

                            for (i=0;i<11;i++)

                            {

                                     write_dat(table11[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 12:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table12[] = "modified ok";

                            for (i=0;i<11;i++)

                            {

                                     write_dat(table12[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

         case 13:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table13[] = "modify password";

                            for (i=0;i<15;i++)

                            {

                                     write_dat(table13[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 14:

                   {

                            write_com(0x01);

                            _delay_ms(50);

                            uchar table14[] = "fail";

                            for (i=0;i<4;i++)

                            {

                                     write_dat(table14[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   case 15:

                   {

                            write_com(0x80+0x40);

                            _delay_ms(50);

                            uchar table15[] = "please press C";

                            for (i=0;i<14;i++)

                            {

                                     write_dat(table15[i]);

                                     _delay_ms(10);

                            }

                            break;

                   }

                   default :

                       break;

         }

}

        

uchar read_keyboard()

{    

         static unsigned char key_state = 0, key_value, key_line;

         uchar key_return = No_key,i;

         switch (key_state)

         {

                   case 0:

                            key_line = 0b00010000;

                            for (i=1; i<=4; i++)                                    // 扫描键盘

                            {    

                                     PORTB = ~key_line;

                                     PORTB = ~key_line;                                

                                     key_value = Key_mask & PINB;                      

                                     if (key_value == Key_mask)

                                               key_line <<= 1;                               // 没有按键,继续扫描

                                     else

                                     {

                                               key_state++;                                  // 有按键,停止扫描

                                               break;                                       

                                     }

                            }

                            break;

                   case 1:

                            if (key_value == (Key_mask & PINB))              // 消抖处理,键盘编码,返回编码值

                            {

                                     switch (key_line | key_value)              

                                     {                                          

                                               case 0b00011110:

                                                        key_return = K1_1;

                                                        break;

                                               case 0b00011101:

                                                        key_return = K1_2;

                                                        break;

                                               case 0b00011011:

                                                        key_return = K1_3;

                                                        break;

                                               case 0b00010111:

                                                        key_return = K1_4;

                                                        break;

                                               case 0b00101110:

                                                        key_return = K2_1;

                                                        break;

                                               case 0b00101101:

                                                        key_return = K2_2;

                                                        break;

                                               case 0b00101011:

                                                        key_return = K2_3;

                                                        break;

                                               case 0b00100111:

                                                        key_return = K2_4;

                                                        break;

                                               case 0b01001110:

                                                        key_return = K3_1;

                                                        break;

                                               case 0b01001101:

                                                        key_return = K3_2;

                                                        break;

                                               case 0b01001011:

                                                        key_return = K3_3;

                                                        break;

                                               case 0b01000111:

                                                        key_return = K3_4;

                                                        break;

                                               case 0b10001110:

                                                        key_return = K4_1;

                                                        break;

                                               case 0b10001101:

                                                        key_return = K4_2;

                                                        break;

                                               case 0b10001011:

                                                        key_return = K4_3;

                                                        break;

                                               case 0b10000111:

                                                        key_return = K4_4;

                                                        break;

                                     }

                                     key_state++;                        // 转入等待按键释放状态

                            }

                            else

                            key_state--;                         // 两次行电平不同返回状态0,(消抖处理)

                            break;                                       

                   case 2:                                              // 等待按键释放状态

                            PORTB = 0b00001111;                // 列线全部输出低电平

                            PORTB = 0b00001111;                // 重复送一次

                            if ( (Key_mask & PINB) == Key_mask)

                                key_state=0;                        // 行线全部为高电平返回状态0

                            break;

         }

   return key_return;

}

/********************************************************************************************************/

void lis_keyboard(uchar key_temp0)

{    

         switch (key_temp0)

         {

                   case K1_1:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K1_2:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K1_3:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K1_4:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K2_1:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K2_2:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K2_3:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K2_4:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K3_1:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                            case K3_2:

                   {

                            DDRD|=0x30;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[2]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

        

                   case K3_3:

                   {

                            DDRD|=0x20;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[3]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                   case K3_4:

                   {

                            DDRD|=0x20;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[4]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                   case K4_1:

                   {

                            DDRD|=0x20;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[5]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                   case K4_2:

                   {

                            DDRD|=0x20;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[6]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                   case K4_3:

                   {

                            DDRD|=0x20;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[0]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

                   case K4_4:

                   {

                            DDRD|=0x20;

                            TCCR1A=0x50;

                            TCCR1B=0x09;

                            OCR1A=(500000/music_h[1]-1);

                            _delay_ms(150);

                            DDRD &= ~0x20;

                            break;

                   }

         }

}

void keyboard_states()

{

         unsigned char i, j=0;

         if(key_temp=='A')

         {       

                   number = 0;

                   error=0;

                   PORTD = 0x00;

                   animation_state=0;

         }

         if(key_temp=='C')//     ----关锁

         {

                   number = 0;

                   error=0;

                   PORTD = 0x00;

                   animation_state=0;

         }

         if(animation_state==0)//     -----显示只有当用户先按"B",再按"F"键时,密码锁才能进入工作状态。

         {

                   if(key_temp=='B')

                   {       

                       show(2);

                            animation_state++;

                           

                   }

                   if(key_temp!='B')

                   {       

                            show(3);

                            show(4);

                            _delay_ms(50);

                   }

         }

         else if(animation_state==1)//    -------先按*  后按# 然后才能解锁

         {

                   if(key_temp=='F')

                   {

                            show(5);

                            animation_state++;

                   }

         }

         else if(animation_state==2)//   ------输入任意位密码(除了F和D以外的键)

         {

                   if(key_temp=='F')

                   animation_state++;

                   else if(key_temp=='D')

                   {

                            number=0;

                       show(5);

                   }

                   else 

                   {      

                            if(number==0)//输入密码先清屏,然后输入密码(小于16位)

                            {

                                     write_com(0x01);

                                     _delay_ms(50);

                            }

                            write_com(0x0c);

                            _delay_ms(50);

                            write_com(0x06);

                            _delay_ms(50);

                            write_com(0x80+number);

                            _delay_ms(50);

                            uchar table1[] = "*";

                            for (i=0;i<1;i++)

                            {

                                     write_dat(table1[i]);

                                     _delay_ms(10);

                            }

                           

                            code_number[number]=key_temp;

                            number++;

                   }

         }

         else if(animation_state==3)

         {

                   if(number == Password)

                   {

                            for(i=0;i<Password;i++)

                                     {

                                               if(code_number[i]==password[i]) //判断密码正误

                                               j++;

                                     }

                            if(j==Password)

                                     {

                                               show(6);

                                               show(7);

                                               PORTD = 0x01;//输入正确的话绿灯闪烁三次

                                               _delay_ms(200);

                                               PORTD = 0x00;

                                               _delay_ms(200);

                                               PORTD = 0x01;

                                               _delay_ms(200);

                                               PORTD = 0x00;

                                               _delay_ms(200);

                                               PORTD = 0x01;

                                               for(int i=0;i<38;i++)

                                               {       

                                                                 DDRD|=0x30;   //设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)

                                                                 TCCR1A=0x50;  //一下两个设置使得:无分频,计数上限ICR1,OC1B/OC1A电平取反

                                                                 TCCR1B=0x09;

                                                                 OCR1A=(500000/Doraemon[i][0]-1); //设置使得输出频率

                                                                 delay(Doraemon[i][1]);//延时音长

                                              }

                                               DDRD&=~0x20;

                                               PORTD = 0x00;

                                               _delay_ms(200);

                         show(13);

                                               show(8);

                                               _delay_ms(1000);

                                               show(1);

                                               show(15);

                                               _delay_ms(100);

                                               error=0;

                                               animation_state+=1;

                                    

                                     }

                            else

                                     {

                                               show(9);

                                              error++;

                                               PORTD = 0x02;//输入错误的话蜂鸣器响三次

                                               _delay_ms(50);

                                               PORTD = 0x00;

                                               _delay_ms(100);

                                               PORTD = 0x02;

                                               _delay_ms(50);

                                               PORTD = 0x00;

                                               _delay_ms(100);

                                               PORTD = 0x02;

                                               _delay_ms(50);

                                               PORTD = 0x00;

                                               _delay_ms(100);

                           

                                               PORTD = 0x04;                   //红灯亮

                                               _delay_ms(2000);

                                               PORTD = 0x00;

                                    

                                }

                   }

                   else

                   {

                            show(9);

                            error++;

                            PORTD = 0x02;//输入错误的话蜂鸣器响三次

                            _delay_ms(50);

                            PORTD = 0x00;

                            _delay_ms(100);

                            PORTD = 0x02;

                            _delay_ms(50);

                            PORTD = 0x00;

                            _delay_ms(100);

                            PORTD = 0x02;

                            _delay_ms(50);

                            PORTD = 0x00;

                            _delay_ms(100);

                            PORTD = 0x04;                   //红灯亮

                            _delay_ms(2000);

                            PORTD = 0x00;

                   }

                   if(error<3&&error>0)

                   {   show(5);

                            number = 0;

                            animation_state=2;

                   }

                   else if(error==3)

                            {

                                     PORTD = 0x02;//输入密码所悟三次蜂鸣器响一秒然后进入倒计时

                                     _delay_ms(2000);

                                     PORTD = 0x00;

                                    

                                     write_com(0x01);

                                     _delay_ms(50);

                                     write_com(0x0c);

                                     _delay_ms(50);

                                     write_com(0x06);

                                     _delay_ms(50);

                                     write_com(0x80+0);

                                     _delay_ms(50);

                                     write_dat(time_show[0]);

                                     write_dat(time_show[0]);

                                     write_dat(time_show[10]);//输出':'

                                     for(int m=2;m>=0;m--)

                                     {

                                               for(int n=9;n>=0;n--)

                                               {

                                                        LCD_show(m,n);//倒计时

                                               }

                                    

                                     }

                                     write_com(0x01); //先清屏

                                     _delay_ms(50);

                                     show(5);

                                     number=0;

                           

                                     animation_state=2;

                            }

         }

        

         else if(animation_state==4)//   修改密码 g

         {

                   if(key_temp=='E')

                   {

                            number=0;

                            show(10);

                            animation_state++;

                   }

                   if(key_temp=='C')//     ----关锁

                   {

                            number = 0;

                            error=0;

                            PORTD = 0x00;

                            animation_state=0;

                   }

         }

         else if(animation_state==5)

         {

                   if(key_temp=='F')//F为确定键

                   {

                            number=0;

                            animation_state++;

                            show(11);

                   }

                   else if(key_temp=='D')//D表示删除

                   {

                            show(10);

                            number = 0;              

                   }

                   else

                   {

                            if(number==0)

                            {

                                     write_com(0x01);

                                     _delay_ms(50);

                            }

                            write_com(0x0c);

                            _delay_ms(50);

                            write_com(0x06);

                            _delay_ms(50);

                            write_com(0x80+number);

                            _delay_ms(50);

                            uchar table1[] = "*";

                            for (i=0;i<1;i++)

                            {

                                     write_dat(table1[i]);

                                     _delay_ms(50);

                            }

                           

                  

                            temp1[number]=key_temp;

                            number++;

                            Password1 = number;

                   }

         }

         else if(animation_state==6)//

         {

                   if(key_temp=='F')

                   animation_state++;

                   else if(key_temp=='D')

                   {

                            show(11);

                            number=0;

                   }

                   else

                   {

                            if(number==0)

                            {

                                     write_com(0x01);

                                     _delay_ms(50);

                            }

                            write_com(0x0c);

                            _delay_ms(50);

                            write_com(0x06);

                            _delay_ms(50);

                            write_com(0x80+number);

                            _delay_ms(50);

                            uchar table1[] = "*";

                            for (i=0;i<1;i++)

                            {

                                     write_dat(table1[i]);

                                     _delay_ms(10);

                            }

                            temp2[number]=key_temp;

                            number++;

                   }

         }

         else if(animation_state==7)//

         {       

                   i=0,j=0;

                   if(number==Password1)

                   {

                            for(i=0;i<Password1;i++)

                            {

                                     if (temp1[i]==temp2[i])

                                     j++;

                            }

                            if(j==Password1)

                            {        Password = Password1;

                                     show(12);

                                     _delay_ms(50);

                                     PORTD = 0x02;//修改成功的话蜂鸣器鸣响两声

                                     _delay_ms(50);

                                     PORTD = 0x00;

                                     _delay_ms(100);

                                     PORTD = 0x02;

                                     _delay_ms(50);

                                     PORTD = 0x00;

                                     _delay_ms(100);

                                     for(i=0;i<Password;i++)

                                     {

                                               password[i]=temp2[i];

                                     }

                                     show(15);

                                     _delay_ms(50);

                            }

                            else

                            {

                                     show(14);

                                     _delay_ms(100);

                                     write_com(0x01);

                                     show(10);

                                     animation_state=4;

                                     show(8);

                            }

                   }

                   else

                   {

                            show(14);

                            _delay_ms(100);

                            write_com(0x01);

                            show(10);

                            animation_state=4;

                            show(8); 

                   }

         }

}

void instruction()//显示操作指南

{

         DDRA = 0xff;

         DDRC |=(1<<0)|(1<<1)|(1<<7);//C0表示VL,C1表示RW,C7表示E

         PORTC &= ~0x01;

         write_com(0x38);//设置16*2显示

         _delay_ms(50);

         write_com(0x01);

         _delay_ms(50);

         write_com(0x0c);

         _delay_ms(50);

         write_com(0x80+0);

         _delay_ms(50);

         for(int i=0;i<16;i++)

         {

                   write_dat(instr[i]);

                            _delay_ms(50);

         }

         write_com(0x80+0x40);

                   _delay_ms(50);

         for(int i=16;i<32;i++)

         {

                   write_dat(instr[i]);

                   _delay_ms(50);

         }

}

int main(void)

{

         write_com(0x38);//设置16*2显示

         _delay_ms(50);

        

         DDRB = 0xff;

         PORTB = 0xff;

         DDRB = 0xf0;//高四位为输入高电平低四位输出低电平

         DDRD = 0xff;

         PORTD = 0x00;

         DDRA = 0xff;

         DDRC = 0b10000011;//C0表示VL,C1表示RW,C7表示E

         PORTC&=~0x01;

        

         show(0);//显示welcome 和操作指南S

         _delay_ms(500);

         while(1)

         {       

                   key_temp = read_keyboard();

                 // 调用键盘接口函数读键盘

                   lis_keyboard(key_temp);

                   if (key_temp != No_key)

                   keyboard_states();           // 有按键按下

         }

}

更多相关推荐:
密码锁课程设计报告

1引言11电子密码锁简介电子密码锁是一种通过密码输入来控制电路或是芯片工作从而控制机械开关的闭合完成开锁闭锁任务的电子产品它的种类很多有简易的电路产品也有基于芯片的性价比较高的产品现在应用较广的电子密码锁是以芯...

南邮电子密码锁设计实验报告

电子密码锁设计实验报告摘要密码锁又称电子锁它的主要功能是1用数字方式输入开锁密码输入密码正确时开锁2如果密码有误或者输入时间过长则发出报警信号目录第一章系统结构与技术指标11系统功能结构12性能和电气指标13设...

电子密码锁实验报告

电子时钟实验报告密码锁实验报告一实验目的1学习8051定时器时间计时处理跑马灯按键扫描及LED数码管显示的设计方法2设计任务及要求利用实验平台上8个LED数码管按键跑马灯实现设置密码密码锁的功能二实验要求基本要...

VHDL密码锁实验报告

华南师范大学实验报告学生姓名学号20xx3100202专业通信工程年级班级课程名称可编程数字系统实验项目VHDL设计一密码锁试验时间指导老师冯寿廷一课程设计目的熟悉EDA工具掌握用VHDL语言进行数字系统设计的...

电子技术实验报告密码锁设计

中国石油大学胜利学院电子技术课程设计总结报告题目电子密码锁设计学生姓名徐连杰学号20xx07013137系别信息与计算科学系专业年级20xx级自动化专业1班指导教师王心刚20xx年6月23日一设计任务与要求1电...

密码锁的设计与测试_实验报告

数电实验实验报告20xx级通信工程专业3班姓名汪冰滢学号1362310308日期20xx年4月2日

北邮小学期简易密码锁实验报告

简易智能密码锁实验报告一实验要求设计并实现一个数字密码锁密码锁有四位数字密码和一个确认开锁按键密码输入正确密码锁打开密码输入错误进行警示基本要求1密码设置通过键盘进行4位数字密码设定输入在数码管上显示所输入数字...

微机原理课题设计实验报告之矩阵式键盘数字密码锁

微机系统与应用课程设计报告班级学号姓名实验地点E楼区312实验时间20xx312317矩阵式键盘数字密码锁设计一实验目的1掌握微机系统总线与各芯片管脚连接方法提高接口扩展硬件电路的连接能力2初步掌握键盘扫描密码...

实验报告2---古典密码playfair

陕西师范大学数学与信息科学学院信息安全实验报告学号40905197姓名程晓红班级09信科时间20xx55成绩

密码学实验报告1

哈尔滨工程大学实验报告实验名称古典密码班级学号姓名实验时间20xx615成绩指导教师实验室名称哈尔滨工程大学实验室与资产管理处制一实验名称古典密码算法二实验目的通过编程实现经典的代替密码算法和置换密码包括移位密...

应用密码学-维吉尼亚(Vigenere)密码的破译实验报告-zx

Byzx实验内容经典密码算法分析实践破解以下数据并解析破解过程Mfwkrpltqqctixlcnrgemwhivjwoeenijkymnhmmqxhjnzssuwypfychjafmvjhpvrexjahtew...

单片机课程设计__电子密码锁报告

基于单片机控制的电子密码锁摘要本系统由单片机系统矩阵键盘LED显示和报警系统组成系统能完成开锁超时报警超次锁定管理员解密修改用户密码基本的密码锁的功能除上述基本的密码锁功能外还具有调电存储声光提示等功能依据实际...

密码锁实验报告(34篇)