用51单片机实现密码的存储与比较该用什么书学习比较好?希望是c语言的,麻烦推荐下,谢谢~
4个回答
展开全部
流水灯,数码管是初级水平,密码锁要涉及到矩阵键盘和液晶屏及EEPROM操作相当于中级水平,所以一下子就想完成任务比较维,网上是有很多实例,但不一定符合你的要求,你若没有基础,在弄不懂别人程序的情况下进行修改,只能越改越糟
思路很简单,就是读6个(假设密码6位)健值,按确认后,与EEPROM中存入的数据进行比较,若正确,则输出开锁信号,若不正确,输出错误信号,若连续3次输入错误,则闭锁键盘或报警
先给你1个按键扫描程序,看你能懂不,用的是P 3口一半输出,一半输入,网上很多,但其实你不用理解C语言的好处是可移植,只要知道程序的作用,而不必理解其里面的每一句话,复制即可 但主程序比较简单,我注释一下:
uchar keyscan()
{
key=16;
P3=0xef;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xed:
key=4;
break;
case 0xeb:
key=8;
break;
case 0xe7:
key=12;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
P3=0xdf;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xde:
key=1;
break;
case 0xdd:
key=5;
break;
case 0xdb:
key=9;
break;
case 0xd7:
key=13;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
P3=0xbf;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xbe:
key=2;
break;
case 0xbd:
key=6;
break;
case 0xbb:
key=10;
break;
case 0xb7:
key=14;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
P3=0x7f;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0x7e:
key=3;
break;
case 0x7d:
key=7;
break;
case 0x7b:
key=11;
break;
case 0x77:
key=15;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
return(key);
}
void main()
{
c=1;
while(c<7)//若不够6次,一直扫描键盘
{
keyval=keyscan();//扫描键盘
if(keyval<10) //10以下键值有效
{
switch(c)
{
case 1:b1=keyval; break;//第一次得到的键值存入变量b1
case 2:b2=keyval; break;//第二次得到的键值存入变量b2
case 3:b3=keyval; break;;//第三次得到的键值存入变量b3
case 4:b4=keyval; break;//第四次得到的键值存入变量b4
case 5:b5=keyval; break;//第五次得到的键值存入变量b5
case 6:b6=keyval; break;//第六次得到的键值存入变量b6
}
c++;
display(b1,b2,b3,b4,b5,b6);//显示输入的数字,由于我用的是数码管,所以不给子程序了
}
while(s2!=0);
if(s2==0) //S2为开锁键
{
此处可写入比较程序
}
}
//密码可存入EEPROM如24C02或单片机内部的EEPROM,但程序比较复杂
也可直接在程序中直接写入,但修改比较困难
例如比较语句
if((b1==1)&&(b2==2)&&(b3==3)&&(b4==4)&&(b5==5))&&(b6==6))......
密码123456直接写入程序
我刚开始学单片机只想做一个能定时采集电压或电流并保存的装置,以实现简单的自动化,但实现它很难,随着学习的深入,发现确实不难,因设计中遇到的许多问题都在学习中找到解决办法了
郭天祥的视频,<<10天会单片机和C语言>>还是比较适合快速入门的,不过你要有实验板
思路很简单,就是读6个(假设密码6位)健值,按确认后,与EEPROM中存入的数据进行比较,若正确,则输出开锁信号,若不正确,输出错误信号,若连续3次输入错误,则闭锁键盘或报警
先给你1个按键扫描程序,看你能懂不,用的是P 3口一半输出,一半输入,网上很多,但其实你不用理解C语言的好处是可移植,只要知道程序的作用,而不必理解其里面的每一句话,复制即可 但主程序比较简单,我注释一下:
uchar keyscan()
{
key=16;
P3=0xef;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xed:
key=4;
break;
case 0xeb:
key=8;
break;
case 0xe7:
key=12;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
P3=0xdf;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xde:
key=1;
break;
case 0xdd:
key=5;
break;
case 0xdb:
key=9;
break;
case 0xd7:
key=13;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
P3=0xbf;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xbe:
key=2;
break;
case 0xbd:
key=6;
break;
case 0xbb:
key=10;
break;
case 0xb7:
key=14;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
P3=0x7f;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0x7e:
key=3;
break;
case 0x7d:
key=7;
break;
case 0x7b:
key=11;
break;
case 0x77:
key=15;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;
}
}
return(key);
}
void main()
{
c=1;
while(c<7)//若不够6次,一直扫描键盘
{
keyval=keyscan();//扫描键盘
if(keyval<10) //10以下键值有效
{
switch(c)
{
case 1:b1=keyval; break;//第一次得到的键值存入变量b1
case 2:b2=keyval; break;//第二次得到的键值存入变量b2
case 3:b3=keyval; break;;//第三次得到的键值存入变量b3
case 4:b4=keyval; break;//第四次得到的键值存入变量b4
case 5:b5=keyval; break;//第五次得到的键值存入变量b5
case 6:b6=keyval; break;//第六次得到的键值存入变量b6
}
c++;
display(b1,b2,b3,b4,b5,b6);//显示输入的数字,由于我用的是数码管,所以不给子程序了
}
while(s2!=0);
if(s2==0) //S2为开锁键
{
此处可写入比较程序
}
}
//密码可存入EEPROM如24C02或单片机内部的EEPROM,但程序比较复杂
也可直接在程序中直接写入,但修改比较困难
例如比较语句
if((b1==1)&&(b2==2)&&(b3==3)&&(b4==4)&&(b5==5))&&(b6==6))......
密码123456直接写入程序
我刚开始学单片机只想做一个能定时采集电压或电流并保存的装置,以实现简单的自动化,但实现它很难,随着学习的深入,发现确实不难,因设计中遇到的许多问题都在学习中找到解决办法了
郭天祥的视频,<<10天会单片机和C语言>>还是比较适合快速入门的,不过你要有实验板
追问
好网友,感谢你那么长的回答啊~我的基础还是有一点的,郭天祥的视频,实验板,等等都是有的。应该说是入了门的。现在我想向中级水平发展,但就是没有方向啊!不知道你当时是怎么过来的啊?我就是特别想弄明白eeprom的操作问题,而且要详细一点的,不要随意带过的那种。最好是能和密码锁结合起来讲的那种。还请网友继续解答!
追答
EEPROM 例程上也有,只要知道那几个子程序的作用,原样复制即可
我用的是STC52单片机内部的EEPROM, 标称是2K,实际大部分版本是4K,,首地址应该是0X2800,有现成的例子,可以做成单独的源文件和头文件,用时完全不用更改
只要把源文件添加进工程中,在主模块中将其头文件包含进去即可
写入某一扇区前要擦除整个扇区
源文件见附件:
头文件如下:
#ifndef __EEPROM_H__
#define __EEPROM_H__
#define uchar unsigned char
#define uint unsigned int
//擦除片内EEPROM的一个扇区
void eepromEraseSector (uint address);
void eepromWrite(uint address, uchar write_data);
//读取STC单片机内部EEPROM的一个字节
uchar eepromRead(uint address);
#endif
展开全部
你说的密码存储于比较具体是什么样的一个功能?能否举个例子
追问
就拿电子密码锁为例吧!假设我想做一个电子密码锁,但我真的不知道该怎么下手啊!虽然我知道大致需要什么东西,但就是没有个项目开发的条理,而且也不知道每一步该怎么做。所以我就想要一本能具体说明下开发思路的书,而且是很浅显易懂的那种。不相关的流水灯,数码管等可以舍弃掉啊!
追答
如果是密码锁的话,那么就需要单片机具有ROM功能或者可以与外部存储器通信。你可以找个相关的单片机或者芯片的技术手册研究一下,一般芯片厂商都是提供C语言源代码的,只要你对C足够了解学起来很容易。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
什么意思啊.问题写得怪怪的,是指密码柜吗?
追问
就是说作为一个小白,现在有一个项目,和电子密码锁有点类似的,要实现密码的存入、取出和比对,而且是用C语言实现编程而不是汇编语言。但是不知道有没有什么书对这块有具体介绍。网友应该懂小白那种懂一点却又不全懂的心情。你想啊,我只是要学习存存密码,有个液晶显示一下而已,干嘛还要学流水灯,数码管之类的?但一般的书偏偏就是有这些却没有关于密码存储的详细讲解,我怎么知道那个代码要那样设计?拜求网友指一条明路~
追答
学流水灯是让你从易入门吖,你现在对C运用如何.如果运用自如了.那就看看一些电子方面的书,把一些原理搞懂了.自己能画出原理图,利用原理逻辑性再结合C定程序.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
会C语言,会单片机,基本就好了吧?
更多追问追答
追问
太笼统了吧?什么人是一开始就什么都会啊?再说了,我也只是先要学习一下密码存储的部分,太就是找不到相关的系统介绍的书啊!都是在将流水灯、数码管之类的,我用不到啊!我就是要用到密码存储,但没有书有讲得那么详细啊!拜求网友指导~
追答
http://www.51c51.com/cyuyan.htm 这里有关24C02的 就是写数据到EEPROM里,读取EEPROM里的数据,并显示等等、、、、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询