
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^6
sbit lcdrs=P2^4
sbit lcdrw=P2^5
bit flag
bit flag1
bit flag2
bit flag3
bit flag4
uchar a[6]
uchar b[6]
uchar c[6]
uchar num,key,zhi,num1,num2,i,temp,ss,num3,num4,num5,num6
uchar code table[]=" input password: "
uchar code table1[]="right!"
uchar code table2[]="error!"
uchar code table3[]={'0','1','2','3','4','5','6','7','8','9'}
uchar code table4[]="wrong!"
uchar code table5[]="change password:"
uchar code table6[]="password again: "
uchar code table7[]="new passwordsure"
uchar password[]={'0','0','0','0','0','0'}
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void write_com(uchar com)
{
lcdrs=0
lcdrw=0
P0=com
delay(5)
lcden=1
delay(5)
lcden=0
}
void write_data(uchar date)
{
lcdrs=1
lcdrw=0
P0=date
delay(5)
lcden=1
delay(5)
lcden=0
}
void init()
{
lcden=0
write_com(0x38)
write_com(0x0c)
write_com(0x06)
write_com(0x01)
write_com(0x80)
for(num=0num<16num++)
{
write_data(table[num])
delay(5)
}
//write_com(0x80+0x40)
}
uchar keyscan(void)
{
uchar temp,zhi
P3=0x7f
temp=P3&0x7f
if(temp!=0x7f)
{
delay(1)
P3=0x7f
temp=P3&0x7f
if(temp!=0x7f)
{
P3=0x7f
temp=P3&0x7f
switch (temp)
{
case 0x7e:zhi=1break
case 0x7d:zhi=2break
case 0x7b:zhi=3break
case 0x77:zhi=4break
}
while(temp!=0x7f)
{
P3=0x7f
temp=P3&0x7f
}
return zhi
}
}
//**********
P3=0xbf
temp=P3&0xbf
if(temp!=0xbf)
{
delay(1)
P3=0xbf
temp=P3&0xbf
if(temp!=0xbf)
{
P3=0xbf
temp=P3&0xbf
switch (temp)
{
case 0xbe:zhi=5break
case 0xbd:zhi=6break
case 0xbb:zhi=7break
case 0xb7:zhi=8break
}
while(temp!=0xbf)
{
P3=0xbf
temp=P3&0xbf
}
return zhi
}
}
//***********
P3=0xdf
temp=P3&0xdf
if(temp!=0xdf)
{
delay(1)
P3=0xdf
temp=P3&0xdf
if(temp!=0xdf)
{
P3=0xdf
temp=P3&0xdf
switch (temp)
{
case 0xde:zhi=9break
case 0xdd:zhi=10break
case 0xdb:zhi=11break
case 0xd7:zhi=12break
}
while(temp!=0xdf)
{
P3=0xdf
temp=P3&0xdf
}
return zhi
}
}
//********
P3=0xef
temp=P3&0xef
if(temp!=0xef)
{
delay(1)
P3=0xef
temp=P3&0xef
if(temp!=0xef)
{
P3=0xef
temp=P3&0xef
switch (temp)
{
case 0xee:zhi=13break
case 0xed:zhi=14break
case 0xeb:zhi=15break
case 0xe7:zhi=16break
}
while(temp!=0xef)
{
P3=0xef
temp=P3&0xef
}
return zhi
}
else
{
zhi=0
return zhi
}
}
}
void changepassword()
{
uchar j=0,k=0,m=0
flag2=0
flag3=0
flag4=0
write_com(0x01)
delay(10)
write_com(0x0c)
delay(10)
write_com(0x80)
for(num4=0num4<16num4++)
{
write_data(table5[num4])
}
while(!flag2)
{
key=keyscan()
if(key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9||key==10)
{
b[j]=table3[key-1]
write_data(table3[key-1])
delay(10)
write_com(0x80+0x40+3+j)
delay(10)
write_data('*')
j++
if(j==6)
{
j=0
flag2=1
flag3=1
write_com(0x01)
delay(10)
write_com(0x80)
for(num5=0num5<16num5++)
{
write_data(table6[num5])
}
}
}
}
while(flag3)
{
key=keyscan()
if(key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9||key==10)
{
c[k]=table3[key-1]
write_data(table3[key-1])
delay(10)
write_com(0x80+0x40+3+k)
delay(10)
write_data('*')
k++
if(k==6)
{
flag3=0
write_com(0x01)
if((b[0]==c[0])&&(b[1]==c[1])&&(b[2]==c[2])&&(b[3]==c[3])&&(b[4]==c[4])&&(b[5]==c[5]))
{
flag4=1
password[0]=b[0]
password[1]=b[1]
password[2]=b[2]
password[3]=b[3]
password[4]=b[4]
password[5]=b[5]
write_com(0x80)
//delay(10)
}
}
}
while(flag4)
{
flag4=0
write_com(0x80)
for(num6=0num6<16num6++)
{
write_data(table7[num6])
}
delay(2000)
write_com(0x80)
for(num=0num<16num++)
{
write_data(table[num])
delay(5)
}
}
}
}
void main()
{
init()
while(1)
{
key=100
key=keyscan()
if((!flag)&&(!flag1))
{
if((key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9||key==10)&&(i<6))
{
write_com(0x0f)
write_com(0x06)
a[i]=table3[key-1]
write_data(table3[key-1])
delay(10)
write_com(0x80+0x40+4+i)
delay(50)
write_data('*')
i++
}
}
if((!flag)&&(!flag1))
{
if(key==11)
{
i=0
if((a[0]==password[0])&&(a[1]==password[1])&&(a[2]==password[2])&&(a[3]==password[3])&&(a[4]==password[4])&&(a[5]==password[5]))
{
flag1=1
write_com(0x01)
delay(10)
write_com(0x0c)
delay(10)
write_com(0x80+4)
for(num1=0num1<6num1++)
{
write_data(table1[num1])
}
}
else
{
write_com(0x01)
delay(10)
write_com(0x0c)
delay(10)
write_com(0x80+4)
for(num2=0num2<6num2++)
{
write_data(table2[num2])
}
ss++
if(ss==3)
{
flag=1
write_com(0x01)
write_com(0x0c)
write_com(0x80+0x40+4)
for(num3=0num3<6num3++)
{
write_data(table4[num3])
}
}
}
}
}
if(key==12)
{
changepassword()
}
}
}
C语言源代码程序#include 《AT89X52.H》
unsigned char ps[]={1,2,3,4,5}
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x00,0x40,0x73,0xff}
unsigned char dispbuf[8]={18,16,16,16,16,16,16,16}
unsigned char dispcount
unsigned char flashcount
unsigned char temp
unsigned char key
unsigned char keycount
unsigned char pslen=5
unsigned char getps[6]
bit keyoverflag
bit errorflag
bit rightflag
unsigned int second3
unsigned int aa,bb
unsigned int cc
bit okflag
bit alarmflag
bit hibitflag
unsigned char oka,okb
void main(void)
{
unsigned char i,j
TMOD=0x01
TH0=(65536-500)/256
TL0=(65536-500)%6
TR0=1
ET0=1
EA=1
while(1)
{
P3=0xff
P3_4=0
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
for(i=10i》0i--)
for(j=248j》0j--)
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
temp=P3
temp=temp &0x0f
switch(temp)
{
case 0x0e:
key=7
break
case 0x0d:
key=8
break
case 0x0b:
key=9
break
case 0x07:
key=10
break
}
temp=P3
P1_1=~P1_1
if((key》=0) &&(key《10))
{
if(keycount《6)
{
getps[keycount]=key
dispbuf[keycount+2]=19
}
keycount++
if(keycount==6)
{
keycount=6
}
else if(keycount》6)
{
keycount=6
keyoverflag=1//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--
getps[keycount]=0
dispbuf[keycount+2]=16
}
else
{
keyoverflag=1
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1
rightflag=0
second3=0
}
else
{
for(i=0i《keycounti++)
{
if(getps[i]!=ps[i])
{
i=keycount
errorflag=1
rightflag=0
second3=0
goto a
}
}
errorflag=0
rightflag=1
a: i=keycount
}
}
temp=temp &0x0f
while(temp!=0x0f)
{
temp=P3
temp=temp &0x0f
}
keyoverflag=0//?????????
}
}
P3=0xff
P3_5=0
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
for(i=10i》0i--)
for(j=248j》0j--)
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
temp=P3
temp=temp &0x0f
switch(temp)
{
case 0x0e:
key=4
break
case 0x0d:
key=5
break
case 0x0b:
key=6
break
case 0x07:
key=11
break
}
temp=P3
P1_1=~P1_1
if((key》=0) &&(key《10))
{
if(keycount《6)
{
getps[keycount]=key
dispbuf[keycount+2]=19
}
keycount++
if(keycount==6)
{
keycount=6
}
else if(keycount》6)
{
keycount=6
keyoverflag=1//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--
getps[keycount]=0
dispbuf[keycount+2]=16
}
else
{
keyoverflag=1
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1
rightflag=0
second3=0
}
else
{
for(i=0i《keycounti++)
{
if(getps[i]!=ps[i])
{
i=keycount
errorflag=1
rightflag=0
second3=0
goto a4
}
}
errorflag=0
rightflag=1
a4: i=keycount
}
}
temp=temp &0x0f
while(temp!=0x0f)
{
temp=P3
temp=temp &0x0f
}
keyoverflag=0//?????????
}
}
P3=0xff
P3_6=0
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
for(i=10i》0i--)
for(j=248j》0j--)
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
temp=P3
temp=temp &0x0f
switch(temp)
{
case 0x0e:
key=1
break
case 0x0d:
key=2
break
case 0x0b:
key=3
break
case 0x07:
key=12
break
}
temp=P3
P1_1=~P1_1
if((key》=0) &&(key《10))
{
if(keycount《6)
{
getps[keycount]=key
dispbuf[keycount+2]=19
}
keycount++
if(keycount==6)
{
keycount=6
}
else if(keycount》6)
{
keycount=6
keyoverflag=1//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--
getps[keycount]=0
dispbuf[keycount+2]=16
}
else
{
keyoverflag=1
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1
rightflag=0
second3=0
}
else
{
for(i=0i《keycounti++)
{
if(getps[i]!=ps[i])
{
i=keycount
errorflag=1
rightflag=0
second3=0
goto a3
}
}
errorflag=0
rightflag=1
a3: i=keycount
}
}
temp=temp &0x0f
while(temp!=0x0f)
{
temp=P3
temp=temp &0x0f
}
keyoverflag=0//?????????
}
}
P3=0xff
P3_7=0
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
for(i=10i》0i--)
for(j=248j》0j--)
temp=P3
temp=temp &0x0f
if (temp!=0x0f)
{
temp=P3
temp=temp &0x0f
switch(temp)
{
case 0x0e:
key=0
break
case 0x0d:
key=13
break
case 0x0b:
key=14
break
case 0x07:
key=15
break
}
temp=P3
P1_1=~P1_1
if((key》=0) &&(key《10))
{
if(keycount《6)
{
getps[keycount]=key
dispbuf[keycount+2]=19
}
keycount++
if(keycount==6)
{
keycount=6
}
else if(keycount》6)
{
keycount=6
keyoverflag=1//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--
getps[keycount]=0
dispbuf[keycount+2]=16
}
else
{
keyoverflag=1
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1
rightflag=0
second3=0
}
else
{
for(i=0i《keycounti++)
{
if(getps[i]!=ps[i])
{
i=keycount
errorflag=1
rightflag=0
second3=0
goto a2
}
}
errorflag=0
rightflag=1
a2: i=keycount
}
}
temp=temp &0x0f
while(temp!=0x0f)
{
temp=P3
temp=temp &0x0f
}
keyoverflag=0//?????????
}
}
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-500)/256
TL0=(65536-500)%6
flashcount++
if(flashcount==8)
{
flashcount=0
P0=dispcode[dispbuf[dispcount]]
P2=dispbit[dispcount]
dispcount++
if(dispcount==8)
{
dispcount=0
}
}
if((errorflag==1) &&(rightflag==0))
{
bb++
if(bb==800)
{
bb=0
alarmflag=~alarmflag
}
if(alarmflag==1)//sound alarm signal
{
P1_7=~P1_7
}
aa++
if(aa==800)//light alarm signal
{
aa=0
P1_0=~P1_0
}
second3++
if(second3==6400)
{
second3=0
errorflag=0
rightflag=0
alarmflag=0
bb=0
aa=0
}
}
else if((errorflag==0) &&(rightflag==1))
{
P1_0=0
cc++
if(cc《1000)
{
okflag=1
}
else if(cc《2000)
{
okflag=0
}
else
{
errorflag=0
rightflag=0
P1_7=1
cc=0
oka=0
okb=0
okflag=0
P1_0=1
}
if(okflag==1)
{
oka++
if(oka==2)
{
oka=0
P1_7=~P1_7
}
}
else
{
okb++
if(okb==3)
{
okb=0
P1_7=~P1_7
}
}
}
if(keyoverflag==1)
{
P1_7=~P1_7
}
}
近年来,随着生活水平的不断改善,个人财富日益增长,人们对安全防盗的要求也逐渐提高。安全可靠、使用方便的电子密码锁成了人们防盗的首选。以Max +PlusⅡ(Multiple Array Matrix and ProgrammingLogic User SystemⅡ,多阵列矩阵及可编程逻辑用户系统Ⅱ)为工作平台,使用PLD可编程器件和VHDL语言设计的带音乐的电子密码锁具有密码预置,误码锁死及开锁音乐提示等功能。这种设计不仅简化了系统结构,降低了成本,更提高了系统的可靠和保密性。采用PLD可编程逻辑器件开发的数字系统,可以方便地升级和改进。1 设计思路
密码锁电路由键盘控制、密码设置和音乐演奏三大功能模块组成,原理如图1所示。Count,Keyvalue,Contrl,Smdisplay构成键盘控制模块,Songer是音乐演奏模块,Set是密码设置模块。
1.1 键盘控制
键盘主要完成向系统输入数据,传送命令等功能。它是一个机械d性按键开关的集合,利用机械触点的合、断作用产生高、低电平。通过对电平高低状态的检测,以确认按键按下与否。一个电压信号通过机械触点的断开、闭合过程的波形如图2所示。
在该键盘电路中,Count模块提供键盘的行扫描信号Q[3..0]。在没有按键按下时,信号EN为高电平,行扫描输出信号Q[3..0]的循环变化顺序为0001 OO100100 1000 0001(依次扫描4行按键);当有按键按下时,信号EN为低电平,行扫描输出信号Q[3..0]停止扫描,并锁存当前的行扫描值。例如按下第一行的按键,那么Q[3..O]=0001。
Keyvalue模块的主要功能是对输入按键的行信号Q[3..0]和列信号14[3..0]的当前组合值进行判断来确定输入按键的键值。
Contrl模块的主要功能是实现按键的消抖,判断是否有按键按下。确保对按键的提取处于图2所示的闭合稳定时间范围内,这就对本模块的输入时钟信号有一定的要求,在本设计中该模块输入的时钟信号频率为64 Hz。Smdisplay模块主要是完成数码管动态扫描和七段译码显示的功能。
1.2 音乐演奏电路Songer
根据声乐学知识,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素。获得这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是关键。如图3所示,该电路需要由NOTETABS(音调发生器)、TONETABA、SPEAKER(数控分频器)三个模块组成,分别实现了声音产生、节拍控制、音调控制的功能。
1.3 密码设置
Set模块是实现密码锁功能的核心模块。其主要作用是设置密码,Set为设置密码的有效信号,可以实现修改密码的功能。En为输入密码确认信号,当输入完六位密码后确认输入,一旦输入的密码跟所设置的密码一致时,则输出信号OP有效(高电平);OP控制演奏音乐,此时音乐响起。若密码不正确,则指示输入错误及输入次数,输完三次无效后密码锁锁死,必须由RESET信号(启动信号,给一个低电平)重新打开密码锁功能。
2 电路的VHDL描述
键盘控制电路,音乐演奏电路以及密码设置模块均使用硬件描述语言VHSIC Hardware Description Lan-guage(VHDL)设计而成。例如:TONETABA的VHDL模型如下:
VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,支持各种模式的设计方法:自顶向下与自底向上或混合方法,从而大大简化了硬件的设计任务,提高了设计效率和可靠性。它同时具有与具体硬件电路无关和与设计平台无关的特性,所以用VHDL进行电子系统设计,设计者可以专心致力于其功能的实现,而不需要对其他相关因素花费过多的时间和精力。
设计步骤
3.1 设计输入
首先在合适的路径下建立本设计的文件夹,然后用VHDL语言编辑Count,Keyvalue,Contrl,Smdisplay等电路,并在Max+PlusⅡ软件中使用文本编辑器输入上述各电路模块的VHDL程序,编译生成各模块;最后在Max+PlusⅡ软件中使用图形编辑器以自底向上的方法编辑原理图。先编辑图3电路,以Singer.gdf命名,其次使用“Create default Symbol”生成Songer模块,然后再编辑如图1所示原理电路图。
3.2 仿真测试及编程下载配置
将设计好的项目存盘,并将其设置成Project。选择目标器件为ACEX系列中的EP1K30QC208-2,启动编译,如果发现编译出现错误,修正后再次编译。编译后即可对波形文件进行仿真,并进行测试和波形分析。分析完成后进行编程下载配置。
3.3 硬件测试
在高电平时,通过键盘的0~F号键进行6位密码输入,密码输入完毕后通过单击确认键进行密码设置确认。当输入的密码与设置的密码一致时,扬声器开始循环演奏乐曲,且数码管SM8显示输入密码的次数,数码管SM7显示密码输入是否正确。如果密码正确,则SM7显示‘0’;如果密码错误,则SM7显示‘E’。数码管SM6~SM1显示输入的6位密码。在密码输入正确开始演奏乐曲时,如果将拨位开关KD4拨向上,则数码管SM8显示乐曲的音符,而此时若将拨位开关KD3拨向上则停止演奏乐曲。发光二极管LED1~LED4显示输入按键的键值,LED16监控是否有按键按下。
4 结 语
使用Max+PlusⅡ软件和VHDL语言设计电路,思路简单,功能明了;不仅可以进行逻辑仿真,还可以进行时序仿真;使用PLD器件不仅省去了电路制作的麻烦,还可以反复多次进行硬件实验,非常方便地修改设计,且设计的电路保密性很强。总之,采用Max+PlusⅡ软件和VHDL语言使得复杂的电子系统的设计变得简单容易,大大提高了设计效率。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)