搜索
您的当前位置:首页52单片机实现密码锁

52单片机实现密码锁

来源:智榕旅游
 52单片机实现密码锁

一、流程图

一、 硬件部分

1)动态数码管(共阴)

a、数码管原理图:

b、共阳数码管码表:

0xc0 0xf9 0xa4 0xb0 0x99 0x92 0x82 0xf8 0x80 0x90 0 1 2 3 4 5 6 7 8 9 注:共阴在共阳基础上加“~”取反。

c、74hc573芯片:

注:输出使能为OE,锁存使能为LE。

d、74hc138芯片: A 0 1 0 1 0 1 0 1

B 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 C ______

Y0 _____Y1 ______Y2 _____Y3 _____Y4 ______Y5 ______Y6 ______Y7 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0

e、上拉电阻:P0端口必须接上拉电阻才能置一。 2)4×3按键: a、按键去抖动:

单片机常用软件去抖法,第一次检测到有键按下时,不是立刻认定按键的有效性,而是延时5~10ms或更长时间,再检测一次该键,如果仍有效,才确认为有效按键。在按键释放后,应再延时5~10ms,以消除后沿的抖动。 先反转法:

求按键的列线值:行线作为输出线,列线作为输入线,即可得到列线值。 求按键的行线值:行线作为输入线,列线作为输出线,即可得到行线值。 求按键的特征码:将列线值与行线值合并。

P1=0000 1110第一行 P1=0110 0000第一列 P1=0000 1101第二行 P1=0101 0000第二列 P1=0000 1011第三行 P1=0011 0000第三列 P1=0000 0111第四行 c、原理图:

3)复位电路,晶振电路:

4)密码锁原理图:

二、 程序: #include

void delay5ms(void); void delay500ms(void); sbit led=P2^3; void main(void) {

unsigned int m=0; unsigned char z,x,y,n=0; unsigned char i=0;

unsigned int B[]={0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x07}, A[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x00}; P0=0x00; while(1) {

P1=0x0F; if(P1!=0x0F) { P1=0x0F; delay5ms(); if(P1!=0x0F) {

z=P1; P1=0x70; x=P1; y=z^x;

P2=B[i];

if(n==0) {

led=1; }

switch(y) {

case 0x6E:P0=~A[1];delay500ms();if(i==7&&m==7){n=1;led=0;}i++;break; case 0x5E:P0=~A[2];delay500ms();i++;break;

case 0x3E:P0=~A[3];delay500ms();if(i==6&&m==6)m=7;i++;break; case 0x6D:P0=~A[4];delay500ms();if(i==5&&m==5)m=6;i++;break; case 0x5D:P0=~A[5];delay500ms();if(i==3&&m==3)m=4;i++;break; case 0x3D:P0=~A[6];delay500ms();if(i==4&&m==4)m=5;i++;break; case 0x6B:P0=~A[7];delay500ms();if(i==2&&m==2)m=3;i++;break; case 0x5B:P0=~A[8];delay500ms();if(i==1&&m==1)m=2;i++;break; case 0x3B:P0=~A[9];delay500ms();i++;break;

case 0x57:P0=~A[0];delay500ms();if(i==0)m=1;i++;break; default:break;

} if(i>7)

{ i=0; P0=0x00; }

}

} } }

void delay5ms(void) //误差 0us {

unsigned char a,b; for(b=19;b>0;b--) for(a=130;a>0;a--); }

void delay500ms(void) //误差 0us {

unsigned char a,b,c; for(c=23;c>0;c--) for(b=152;b>0;b--) for(a=70;a>0;a--); }

三、 总结:

按键原本想用keypad-phone的,无奈不知道怎么使用,于是改用独立按键。按键程序自己写的时候用的是并列的if语句,程序编译会出错,后来参考别人写的发现是用if嵌套语句。判断密码正确的程序最初是想在switch语句后面写的,发现无法通过编译,也不知道问题出在哪,只知道if语句的条件有问题,最后为了减少if语句的判断条件,索性将判断密码的语句写在switch语句中,最后黄天不负有心人,简易密码锁成功了。不过还有点小问题,就是数码管显示一个数字后会再按下一个数字,上一个数字就会消失,无法显示按了什么,这是因为我用了38译码器作为动态数码管的

片选输入。初衷是为了节省端口,之后要去了解了解别的扩展端口的方法。

2019年3月15日

因篇幅问题不能全部显示,请点此查看更多更全内容

Top