基于单片机AT89C51的电子密码锁设计

发布者:心怀感恩最新更新时间:2016-08-14 来源: eefocus关键字:单片机  AT89C51  电子密码锁 手机看文章 扫描二维码
随时随地手机看文章
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
实现功能:
预先设置好密码,按START键开始输入,输入6位密码后,显示均为“*”,按ENTER结束输入,显示“ENTER PLEASE:”。如果正确显示“OK”,绿灯亮;如果错误显示“YOU ARE WRONG”,禁止键盘输入3秒,并且红灯亮,如果按除START键以外的其他键,继续禁止输入3秒,如果此时按的是START键,可以重新输入。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#define uint unsigned int
#define uchar unsigned char
#define KEY P3 //键盘输入端
#define No_key 20 //无按键时返回值
#define lcddata P2 //1602的数据输入端口
 
sbit lcden=P1^2;
sbit lcdrs=P1^0; //0输入指令,1输入数据
sbit lcdrw=P1^1; //0向LCD写入数据或指令,1从LCD读取信息
sbit light_red=P1^3;
sbit light_green=P1^4;
 
uchar j; //用来统计输入个数的全局变量
uchar aa; //用来在定时器中计数的全局变量
 
uchar code table[]="Hello!       ";
uchar code table1[]="OK!          ";
uchar code table3[]="YOU ARE WRONG!";
uchar code table2[]="ENTER PLEASE:";
uchar code key_table[]={1,2,3,10,
4,5,6,11,
7,8,9,12,
0,13,14,15};
uchar password[]={2,8,1,6,9,3};  //设定初始密码
uchar save[6]; //保存输入数据
 
uchar conflag;
uchar startflag;
uchar lockflag;
 
void delay(uint z);
void wright_com(uchar com); //写命令函数
void wright_data(uchar date);  //写数据函数
 
void init();
void display_OK(); //显示OK
void delete();
uchar keyscan();
void enter_code(uchar t); //输入密码,并把输入的数据存入数组中
void confirm();  //输入密码逐一对比
void succeed_an();
void fail_an();
void lockkey();
void reset();
void display_enter();
void display_wrong();
 
void main(void)
{
uchar temp;
init();
while(1)
{
  if(lockflag)   //输入错误,才会锁存
  {
   temp=keyscan();
if(temp != No_key)
{
aa=0;   //重新计时
if(temp==10)
{
lcdrw=0;  //清屏
lcden=0;
wright_com(0x01);
reset();
light_red=1;
startflag=1; //开始标志置位
 
}
}
  
  }
  else
  {
      temp=keyscan();
   if(temp != No_key)
   {
    if(temp==10)
{
 
lcdrw=0;    //清屏
lcden=0;
wright_com(0x01);
reset();
startflag=1; //开始标志置位
 
}
if(startflag)
{
 enter_code(temp);
 if(temp==13)
  {
   confirm();
if(conflag)
{
succeed_an();
 
}
else
{
fail_an();
}
  
  }
  if(temp==14)
  {
   delete();
  
  }
 
}
   
   }
  
  }
 
}
 
 
}
 
/*显示enter*/
void display_enter()
{
uchar num;
wright_com(0x80);
for(num=0;num<13;num++)
{
wright_data(table2[num]);
}
 
}
/*显示OK*/
void display_ok()
{
uchar num;
wright_com(0x80);
for(num=0;num<13;num++)
{
wright_data(table1[num]);
}
 
}
/*显示错误*/
void display_wrong()
{
uchar num;
wright_com(0x80);
for(num=0;num<14;num++)
{
wright_data(table3[num]);
}
 
}
 
void delete()
{
   wright_com(0x80+0x40+j);
   wright_data(' ');
   save[--j]=0;
   wright_com(0x80+0x40+j);
 
}
/*复位各种变量*/
void reset()
{
uchar num;
display_enter();
wright_com(0x80+0x40);
for(num;num<6;num++)
{
save[num]=0;
wright_data(' ');
 
}
wright_com(0x80+0x40);
lockflag=0;
conflag=0;
j=0;
 
}
void succeed_an()
{
light_green=0;
display_ok();
delay(1000);
light_green=1;
 
}
void fail_an()
{
 
display_wrong();
lockkey();
}
 
 
void lockkey()
{
lockflag=1;
}
 
void enter_code(uchar t)
{
if(t>=0&&t<10)
{
if(j==0)
{
wright_com(0x80+0x40);
wright_data('*');
}
else
{
wright_data('*');
}
save[j++]=t;
}
 
}
void confirm()
{
uchar k;
for(k=0;k<6;k++)
{ if(password[k]!=save[k])
{
break;
}
}
if(k==6)
{
conflag=1;
}
 
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(lockflag)
{
aa++;
light_red=0;
if(aa>=60)
{
aa=0;
light_red=1;
lockflag=0;
}
}
 
}
 void init()
 {
  uchar num;
TMOD=1;
ET0=1;
EA=1;
TR0=1;
lcdrw=0;
lcden=0;
wright_com(0x38);
wright_com(0x0c);
wright_com(0x01);
wright_com(0x80);
for(num=0;num<9;num++)
{
wright_data(table[num]);
delay(1);
 
}
 
 
 }
 void wright_com(uchar com)
 {
  lcdrs=0;
lcddata=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
 
 }
 
void wright_data(uchar date)
{
lcdrs=1;
lcddata=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
 
}
 
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*键盘扫描 逐行扫描*/
uchar keyscan()
{
uchar temp;
uchar num=No_key;
KEY=0xfe;
temp=KEY;
temp=temp&0xf0;
while(temp !=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=10;
break;
 
}
while(temp!=0xf0)
{
  temp=KEY;
temp=temp&0xf0;
}
 
}   
 
}
KEY=0xfd;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xed:num=4;
break;
case 0xdd:num=5;
break;
case 0xbd:num=6;
break;
case 0x7d:num=11;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
KEY=0xfb;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xeb:num=7;
break;
case 0xdb:num=8;
break;
case 0xbb:num=9;
break;
case 0x7b:num=12;
break;
 
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
 
}
KEY=0xf7;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xe7:num=0;
break;
case 0xd7:num=13;
break;
case 0xb7:num=14;
break;
case 0x77:num=15;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
   return num;
}
 
基于单片机AT89C51的电子密码锁设计 - 成 - 学海泛舟
 
基于单片机AT89C51的电子密码锁设计 - 成 - 学海泛舟
 
基于单片机AT89C51的电子密码锁设计 - 成 - 学海泛舟
 
基于单片机AT89C51的电子密码锁设计 - 成 - 学海泛舟
 

关键字:单片机  AT89C51  电子密码锁 引用地址:基于单片机AT89C51的电子密码锁设计

上一篇:STC8954RD 串口接收
下一篇:中断及定时器的应用

推荐阅读最新更新时间:2024-03-16 15:04

全集成开发平台 面向嵌入式MCU设计【爱特梅尔】
爱特梅尔公司(Atmel® Corporation)宣布, 针对快速增长、拥有超过10万用户的8位和32位AVR®嵌入式微控制器(MCU)设计社群,推出易于使用的新型全集成开发平台。新推出的Atmel AVR Studio 5是广受欢迎的爱特梅尔集成开发环境(IDE)的增强版本,支持所有8位和32位AVR MCU,能够显著提高开发人员的效率,并可使客户的应用程序在爱特梅尔8位和32位AVR MCU之间实现无缝移植。 AVR Studio® 5能够简化源代码的编辑和调试,具备辅助代码编写功能的编辑器、用于快速创建新项目的向导工具, AVR Software Framework源代码库、GNU C/C++编译器、功能强
[单片机]
全集成开发平台 面向嵌入式<font color='red'>MCU</font>设计【爱特梅尔】
经典单片机类型介绍
1.8051 单片机 最早有Intel公司推出8051/31类 单片机, 也是世界上使用量最大的几种单片机之一.由于Intel公司将重点放在186,386,奔腾等与PC类兼容的高档芯片开发上,8051类单片机主要有Philips,三星,华帮等公司接手.这些公司在保持与8051单片机兼容基础改善了8051的许多特点.提高了速度,降低了时钟频率,放宽了电源电压的动态范围,降低了产品价格. 2.Atmel 单片机: ATMEL 公司是世界上著名的高性能低功耗非易失性存储器和数字集成电路的一流半导体制造公司ATMEL 公司最令人注目的是它的EEPROM 电可擦除技术闪速存储器技术和质量高可靠性的生产技术在CMOS 器件生产领域中AT
[模拟电子]
基于单片机的16x64点阵LED显示屏的设计
   0 引言   LED点阵显示屏是一种简单的汉字显示器,具有价廉、易于控制、使用寿命长等特点,可广泛应用于各种公共场合,如车站、码头、银行、学校、火车、公共汽车显示等。本文详细介绍了一种低廉的16x64点阵LED显示屏的设计过程。   1 硬件系统设计   本系统采用AT89C52单片机作控制器,整个电路主要由单片机控制及其接口电路、驱动显示电路、电源电路等部分组成。为了简化显示屏电路,降低成本,本系统在单片机部分不加字库存储器。而在PC机上编辑汉字和字符显示信息,并将其转换为相应的点阵显示数据,然后通过串口(采用RS-232通信标准)送给单片机存储并进行显示处理。图1所示为其硬件系统原理图。   1.
[单片机]
基于<font color='red'>单片机</font>的16x64点阵LED显示屏的设计
Proteus软件仿真与Keil的51单片机系统设计
  1 概述   随着半导体技术的飞速发展,以及移动通信、网络技术、多媒体技术在嵌入式系统设计中的应用,单片机从4位、8位、16位到32位,其发展历程一直受到广大电子爱好者的极大关注。单片机功能越来越强大,价格却不断下降的优势无疑成为嵌入式系统方案设计的首选,同时单片机应用领域的扩大也使得更多人加入到基于单片机系统的开发行列中,推动着单片机技术的创新进步。   然而传统的单片机系统开发除了需要购置诸如仿真器、编程器、示波器等价格不菲的电子设备外,开发过程也较繁琐。如图1所示,用户程序需要在硬件完成的情况下才能进行联调,如果在调试过程中发现需修改硬件,则要重新制板。因此无论从硬件成本还是开发周期来看,其高风险、低效率的特性显露无
[单片机]
Proteus软件仿真与Keil的51<font color='red'>单片机</font>系统设计
单片机定时器0的使用
本程序功能是让PA口接的等每隔0.5s闪烁一次,程序如下 include avr/io.h #include avr/interrupt.h #define F_CPU 8000000UL int k; int main(void) { DDRA=0XFF; PORTA=0xff; TCCR0=0X05; TCNT0=256-F_CPU/1024*0.5; TIMSK=0X01; sei(); while(1); } ISR(TIMER0_OVF_vect) { k++; if(k 200) { k=0; PORTA=~PORTA; } TCNT0=256-F_CPU/102
[单片机]
基于AVR单片机的语音识别系统设计方案
引言 传统的人机交互依靠复杂的键盘或按钮来实现,随着科技的发展,一些新型的人机交互方式也随之诞生,带给人们全新的体验。基于语音识别的人机交互方式是目前热门的技术之一。但是语音识别功能算法复杂、计算量大,一般在计算机上实现,即使是嵌入式方面,多数方案也需要运算能力强的ARM或 DSP ,并且外扩RAM、FLASH等资源,增加了硬件成本,这些特点无疑限制了语音识别技术的应用,尤其是嵌入式领域。 本系统采用的主控MCU为Atmel公司的ATMEGA128,语音识别功能则采用ICRoute公司的单芯片LD3320。LD3320内部集成优化过的语音识别算法,无需外部FLASH,RAM资源,可以很好地完成非特定人的语音识别任务。
[单片机]
基于AVR<font color='red'>单片机</font>的语音识别系统设计方案
arm单片机的内核结构
ARM芯片的核心,即CPU内核(ARM720T)由一个ARMTTDMI 32位RISC处理器、一个单一的高速缓冲8KB Cache和一个存储空间管理单元(MMU)所构成。8KB的高速缓冲有一个四路相连寄存器,并被组织成52线四字(4×52×4字节)。高速缓冲直接与ARMTTDMI相连,因而高速缓冲来自CPU的虚拟地址。当所需的虚拟地址不在高速缓冲中时,由MMU将虚拟地址转换为物理地址。一个64项的转换旁路缓冲器(TLB)用来加速地址转换过程,并减少页表读取所需的总线传送。通过转换高速缓冲中未存储的地址,MMU就能够节约功率。通过内部数据总线和扩展并行总线,ARM可以和存储器(SRAM/Flash/Nand-Flash等)、用户接口
[单片机]
采用8位单片机驱动PCI总线网卡的设计方案
目前,以太网(Ethernet)协议已经非常广泛地应用于各种计算机网络,如办公局域网、工业控制网络、因特网等场合,并且还不断地在发展。单片机或微控制器(MCU)(也称为嵌入式系统)已经在各个领域得到了广泛的应用。目前绝大多数系统都是以MCU为核心,与监测、伺服、指示设备配合实现一定的功能。如果嵌入式系统能够连接到Internet,则可以方便、低廉地将信息传送到世界上的任何一个地方。因此单片机如何控制以太网网卡进行传输数据,如何加载TCP/IP协议连接到互联网,这些都是一些具有挑战性的问题[1,2]。 单片机上网研究最多的一个方案就是用单片机驱动ISA总线网卡或者是驱动基于ISA总线的以太网控制芯片。但是,近年来,随着ISA总线在台
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved