标题:
用51单片机实现密码锁Proteus仿真图+代码
[打印本页]
作者:
15689692883
时间:
2018-11-4 15:34
标题:
用51单片机实现密码锁Proteus仿真图+代码
单片机密码锁仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(15.59 KB, 下载次数: 65)
下载附件
2018-11-4 15:56 上传
简单密码锁源程序:
/*******************************************
密码锁:基本功能
1 开机显示“-”,无密码输入时也显示“-”,表示锁定;
2 密码为1位密码;
3 输入密码正确,显示“P”,开锁;
4 输入密码错误,显示“E”,继续锁定;
*******************************************/
#include <REGX51.H>
#define LED P0 //一位数码管显示端口
#define KEY P2 //键盘端口
//共阳极数码管字形码
unsigned char code ledSeg[]={
//0 1 2 3 4 5 6 7 8 9
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
//A B C D E F
0x88,0x83,0xc6,0xa1,0x86,0x8e,
//P16 -17
0x8c,0xbf
};
void delay(unsigned int i)
{
unsigned char j;
while(i--)
for(j=0;j<123;j++);
}
/*矩阵4x4键盘函数
行列反转法,行在低四位,
返回值:按键ascii码,无按键返回0*/
char rdmkey(void)
{
char cin,rin; //列,行输入值
char keyv=0; //键号
static char preCin=0; //上次输入
KEY = 0x0f; //列输出0,行输出1
delay(1);
rin = KEY; //读入行,只关心低四位
rin &= 0x0f;
if(rin==0x0f) return 0; //读入行全为1,无按下,返回0
//有键按下,行列反转,继续判断在哪一列
KEY = 0xf0; //行输出0,列输出1
delay(1);
cin = KEY; //读入列输入值cin只关心高四位
cin &= 0xf0;
if(cin==0x0f) return 0; //读入行全为1,无按下,返回0
cin = cin+rin; //键码=cin+rin,保存在cin中,查表得到键码
if(cin == preCin)
return 0;//和上次相同,返回0
else
preCin=cin;
switch(cin) //查表得到键码
{
case 0xee: keyv='1'; break; //0行0列 (列行1110 1110)
case 0xde: keyv='2'; break; //0行1列 (列行1101 1110)
case 0xbe: keyv='3'; break; //0行2列 (列行1011 1110)
case 0x7e: keyv=0; break; //0行3列 (列行0111 1110)
case 0xed: keyv='4'; break; //1行0列 (列行1110 1101)
case 0xdd: keyv='5'; break; //1行1列 (列行1101 1101)
case 0xbd: keyv='6'; break; //1行2列 (列行1011 1101)
case 0x7d: keyv=0; break; //1行3列 (列行0111 1101)
case 0xeb: keyv='7'; break; //2行0列 (列行1110 1011)
case 0xdb: keyv='8'; break; //2行1列 (列行1101 1011)
case 0xbb: keyv='9'; break; //2行2列 (列行1011 1011)
case 0x7b: keyv=0; break; //2行3列 (列行0111 1011)
case 0xe7: keyv='*'; break; //3行0列 (列行1110 0111)
case 0xd7: keyv='0'; break; //3行1列 (列行1101 0111)
case 0xb7: keyv='#'; break; //3行2列 (列行1011 0111)
case 0x77: keyv=0; break; //3行3列 (列行0111 0111)
default: ;
}
return keyv; //返回键码
}
void main()
{
char keyv;
LED=ledSeg[17]; //显示-,锁定
while(1)
{
keyv=rdmkey();
if (keyv!=0)
{
if(keyv=='6')LED=ledSeg[16]; //显示 P
else LED=ledSeg[14]; //显示 E
}
}
}
复制代码
0.png
(38.19 KB, 下载次数: 76)
下载附件
2018-11-4 15:57 上传
全部资料51hei下载地址:
51单片机实现密码锁.rar
(9.2 KB, 下载次数: 35)
2018-11-4 15:32 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
ll20012
时间:
2020-6-19 18:10
我是小白,问一下proteus仿真的时候总是会出现led或者数码管不亮的情况,电路图和程序都是对的,这个是什么原因。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1