数字电路设计实验简易密码锁Word格式.docx

上传人:b****4 文档编号:8013277 上传时间:2023-05-09 格式:DOCX 页数:35 大小:323.05KB
下载 相关 举报
数字电路设计实验简易密码锁Word格式.docx_第1页
第1页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第2页
第2页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第3页
第3页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第4页
第4页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第5页
第5页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第6页
第6页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第7页
第7页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第8页
第8页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第9页
第9页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第10页
第10页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第11页
第11页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第12页
第12页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第13页
第13页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第14页
第14页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第15页
第15页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第16页
第16页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第17页
第17页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第18页
第18页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第19页
第19页 / 共35页
数字电路设计实验简易密码锁Word格式.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字电路设计实验简易密码锁Word格式.docx

《数字电路设计实验简易密码锁Word格式.docx》由会员分享,可在线阅读,更多相关《数字电路设计实验简易密码锁Word格式.docx(35页珍藏版)》请在冰点文库上搜索。

数字电路设计实验简易密码锁Word格式.docx

密码锁输入电路包括时序产生电路,键盘扫描电路,键盘译码电路等,将用户手动输入的相关密码信息转换为软件所能识别的编码,作为整个电路的输入。

密码锁控制电路包括相应的数据存储电路,密码核对电路,能够进行数值的比较,进行电路解锁,开锁,密码的重新设置等。

密码锁显示电路包括将待显示数据的BCD码转换成数码管的七段显示驱动编码,密码锁在相应的状态下的点阵输出以及蜂鸣器的报警输出。

总体框图

按复位键

键入初始密码0000

密码错误

密码正确

按确认键

分块设计

✓键盘扫描电路

首先,向列扫描地址逐列输出低电平,然后从行码地址读回,如果有键摁下,则相应行的值应为低,如果没有按键按下,由于上拉的作用,行码为高。

这样就可以通过输出列码和读取的行码来判断按下的是什么键。

在判断有按键的按下后,要有一定的延时,防止键盘抖动。

entitykeyboardis

port(

row:

instd_logic_vector(3downto0);

col:

outstd_logic_vector(3downto0);

keyout:

q:

outstd_logic;

clk:

instd_logic

);

endkeyboard;

architecturestructofkeyboardis

signalcol_buffer1:

std_logic_vector(3downto0);

signalcol_buffer2:

signalkey:

std_logic_vector(7downto0);

signalcounter:

integerrange0to3;

signaldelay:

integerrange0to10;

signalstop:

std_logic;

begin

col<

=col_buffer2;

q<

=stop;

process(CLK,row,stop)

begin

ifclk'

eventandclk='

1'

then

ifcounter=3then

counter<

=0;

else

=counter+1;

//由于只要求输入四个数字所以需要计数

endif;

casecounteris

when0=>

col_buffer1<

="

1110"

;

when1=>

1101"

when2=>

1011"

when3=>

0111"

endcase;

endif;

endprocess;

key<

=row&

col_buffer2;

process(clk,key)

begin

ifclk'

0'

casekeyis

when"

01111110"

=>

stop<

='

keyout<

="

0000"

01111101"

0001"

01111011"

0010"

01110111"

0011"

10111110"

0100"

10111101"

0101"

10111011"

0110"

10110111"

11011110"

1000"

11011101"

1001"

whenothers=>

stop<

='

//仅仅在摁0~9的时候会有显示,在摁除了这十个键之外的键的时候是不会有反应的,将keyout的值转换为相应的数码管值,来控制数码管的显示

endcase;

endif;

process(clk,stop)

ifclk'

then

ifstop='

col_buffer2<

=col_buffer1;

endif;

endstruct;

✓点阵显示电路

采用行扫描的方式,每经过一段时间,给一行一个低电平。

则若在列的方向上如果接入高电平,则会使相应的二极管发光。

由于人眼的的暂留效应就回使我们看到我们想要的图案。

libraryieee;

useieee.std_logic_1164.all;

entityledis

port(

row:

outstd_logic_vector(7downto0);

num:

instd_logic_vector(1downto0);

clk:

instd_logic;

col:

outstd_logic_vector(7downto0)

);

endentity;

architecturestructofledis

signalcounter:

integerrange0to7;

process(clk)

ifcounter=7then

counter<

else

=counter+1;

endprocess;

process(clk,counter)

then

ifnum<

00"

then//键入状态

row<

11111110"

00111100"

11111101"

11111011"

11110111"

when4=>

11101111"

when5=>

11011111"

00011000"

when6=>

10111111"

when7=>

01111111"

elsifnum="

01"

then//闭锁状态

11111111"

01000010"

10"

then//开锁状态

00000000"

00011111"

10011111"

10001000"

01110000"

else

casecounteris//报警状态

✓数码管显示

其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。

一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。

显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。

数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。

所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111;

共阳数码管的字符编码为11000000。

casecounteris//选通,可使数码管只单独亮一位

when0=>

cat<

111110"

ao<

=a0;

when1=>

111101"

=a1;

when2=>

111011"

=a2;

when3=>

110111"

=a3;

when4=>

101111"

=a4;

when5=>

011111"

=a5;

endcase;

process(ao)

caseaois//将键盘输入的一系列值翻译成接通数码管值

when"

a<

1111110"

0110000"

1101101"

1111001"

0110011"

1011011"

1011111"

1110000"

1111111"

1111011"

1010"

0000001"

whenothers=>

0000000"

endcase;

●仿真波形及波形分析

如图,程序开始运行的时候,给键盘扫描,系统会给出相应的键盘输出,是点阵显示出输入状态

图为一系列当键盘键入的时候,一系列数码管显示

在键入改变的初始密码之后,系统会变成闭锁状态,点阵如图显示

当输入的密码错误的时候,摁清零键的时候,会发出警报

entitylockis

//时钟信号

rr:

//重置清零键

s:

//确认键

warn:

//警报信号

ou:

----key

key_row:

//键盘扫描行列

key_col:

----led

led_col:

//点阵扫描行列

led_row:

----seg

cat:

outstd_logic_vector(5downto0);

//数码管选通

a:

outstd_logic_vector(6downto0)//数码管显示

architecturestructoflockis

signalkeynum:

integerrange0to9;

signalwarn_on:

signalstatus:

signalnum_counter:

integerrange0to5;

signalclk_1000:

signalclk_1:

signalq:

signalr:

signalw:

signalnum:

std_logic_vector(1downto0);

signalkey:

signalinput:

signalseg_num:

std_logic_vector(2downto0);

signalp1,p2,p3,p4:

signalpassword:

std_logic_vector(15downto0);

integerrange0to31;

componentdivis//分频器

clk_in:

clk_1000:

clk_1:

outstd_logic

endcomponent;

componentkeyboardis//键盘扫描

componentledis//点阵显示

componentsegis//数码管

r:

outstd_logic_vector(6downto0);

w:

input:

instd_logic_vector(2downto0)

componentOneis

i:

o:

IC1:

divportmap(clk,clk_1000,clk_1);

IC2:

keyboardportmap(key_row,key_col,key,q,clk_1000);

IC3:

ledportmap(row=>

led_row,num=>

num,clk=>

clk_1000,col=>

led_col);

IC4:

segportmap(r=>

r,clk=>

clk_1000,cat=>

cat,a=>

a,w=>

w,input=>

input,num=>

seg_num);

--status

process(s,rr,status)

ifrr='

ifstatus=2then

status<

elsifstatus=3then

=1;

elsifs'

eventands='

ifstatus=0then

status<

password<

=p1&

p2&

p3&

p4;

elsifstatus=1then

ifpassword=p1&

p4then

=2;

else

=3;

//statue0代表的是输入状态,statue1是闭锁状态,statue2是开锁状态,statue3是报警状态,状态转移图在前面已经画出

process(s,rr,clk_1000)

r<

elsifs='

elsifclk_1000'

eventandclk_1000='

---num_counter

process(s,rr,q,clk_1000)

ifs='

num_counter<

elsifrr='

elsifq'

eventandq='

ifstatus=0orstatus=1then

i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2