基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx

上传人:b****0 文档编号:8977182 上传时间:2023-05-16 格式:DOCX 页数:35 大小:554.25KB
下载 相关 举报
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第1页
第1页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第2页
第2页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第3页
第3页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第4页
第4页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第5页
第5页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第6页
第6页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第7页
第7页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第8页
第8页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第9页
第9页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第10页
第10页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第11页
第11页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第12页
第12页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第13页
第13页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第14页
第14页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第15页
第15页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第16页
第16页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第17页
第17页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第18页
第18页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第19页
第19页 / 共35页
基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx

《基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx(35页珍藏版)》请在冰点文库上搜索。

基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序.docx

基于51单片机的PS2键盘1602显示24c02存储的密码锁设计附程序

基于51单片机的PS2键盘密码锁设计

摘要:

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器,被广泛应用于各个领域。

LCD1602液晶显示器以其微功耗、体积小、超薄轻巧等诸多优点而备受人们喜爱。

本作品是以AT89S52作为主控芯片,LCD1602作为显示器,以PS2键盘作为输入设备的密码锁。

PS2键盘与AT89S52通过PS2接口协议进行通信,可以完成密码设置,密码重置及显示等诸多功能。

本作品还使用了24C02存储器来实现密码锁的掉电保存功能。

关键词:

AT89S52;LCD1602;24C02;PS2键盘

Abstract:

AT89S52isalowpower,highperformanceCMOS8bitmicrocontroller,with8Kflashmemory,iswidelyappliedinvariousfields.LCD1602liquidcrystalDisplaywithitslowpowerconsumption,smallsize,thinlightweightandmanyotheradvantages,islikedbypeople.ThisworkisbasedontheAT89S52asthemainchip,theLCD1602asdisplay,PS2keyboardasaninputdeviceofthecipherlock.PS2keyboardandAT89S52throughPS2interfaceprotocolForcommunication,cancompletepassword,passwordresetanddisplayandotherfunctions.Thisworkwealsousedthe24C02memorytorealizethepasswordlockthepower-downsavefunction.

Keywork:

AT89C52;LCD1602;24C02;PS/2keyboard

1实验目的及意义

在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择.

对于单片机初学者的我而言,AT89S52简单易学,非常适合我学习。

设计这个作品为了锻炼自己的动手实践能力,并且能够更深入的学习AT89S52。

通过这个实验,我不但基本掌握了AT89S52这门知识,同时也为我以后更深入的学习一些复杂的单片机打下坚实的基础。

2作品的原理

2.1原理框图

2.2单片机模块

图1.AT89S52单片机最小系统

1、单片机引脚说明

XTAL1:

单芯片系统时钟的反向放大器输入端。

XTAL2:

系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。

RESET:

重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

2、复位电路

当按下按键时,就能完成整个系统的复位,使得程序从新运行。

3、时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。

此电路采用12MHz的石英晶体。

2.3PS2键盘模块

PS2模块由PS2键盘和PS2接口组成,利用通信协议对PS2键盘进行操作,PS2通讯协议是一种双向同步串行通讯协议。

PS2键盘连线图如图所示:

图2.PS2键盘连线图

PS2接口操作时序如下图所示:

图3.时序图

PS2接口通信协议表如下表所示:

图4.通信协议表

表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。

由于PS/2设备能提供串行同步时钟,因此,如果PC机发送数据,则PC机要先把时钟线和数据线置为请求发送的状态。

PC机通过下拉时钟线大于100μs来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。

当PS/2设备检测到需要接收的数据时,它会产生时钟信号并记录下面8个数据位和一个停止位。

主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。

而PS/2设备则要配合PC机才能读到准确的数据。

具体连接步骤如下:

(1)等待时钟线为高电平。

(2)判断数据线是否为低,为高则错误退出,否则继续执行。

(3)读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被PC机拉低,如果被拉低则要中止接收。

(4)读地址线上的校验位内容,1个bit。

(5)读停止位。

(6)如果数据线上为0(即还是低电平),PS/2设备继续产生时钟,直到接收到1且产生出错信号为止(因为停止位是1,如果PS/2设备没有读到停止位,则表明此次传输出错。

          

(7)输出应答位。

(8)检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。

(9)延时45μs,以便PC机进行下一次传输。

PS2键盘扫描方式:

键盘的处理器如果发现有键被按下释放或按住键盘将发送扫描码的信息包到计算机扫描码有两种不同的类型通码和断码,当一个键被按下或按住就发送通码,当一个键被释放就发送断码,每个按键被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以测定是哪个按键,每个键一整套的通断码组成了扫描码集有三套标准的扫描码集,分别是第一套、第二套、和第三套,所有现代的键盘默认使用第二套扫描码

  虽然多数第二套通码都只有一个字节宽但也有少数扩展按键的通码是两字节或四字节宽这类的通码第一个字节总是为E0h

  正如键按下通码就被发往计算机一样,只要键一释放断码就会被发送,每个键都有它自己唯一的通码,它们也都有唯一的断码,幸运的是你不用总是通过查表来找出按键的断码在通码和断码之间存在着必然的联系,多数第二套断码有两字节长它们的第一个字节是F0h,第二个字节是这个键的通码,扩展按键的断码通常有三个字节,它们前两个字节是E0h,F0h,最后一个字节是这个按键通码的最后一个字节。

我在下面列出了几个按键的第二套通码和断码。

2.4LCD1602显示模块

LCD1602采用8位并行数据传输,其操作时序如下图所示:

LCD1602接口由8位数据线,电源地电源正,液晶显示偏压信号(VL),数据命令选择端(RS),读写选择端(RW)组成。

其接口信号说明如下图所示:

图5.接口信号说明图

可以在1602的液晶显示偏压信号端接一个可变电阻,调节显示亮度,初始状态时,调至1602上面一排显示12个黑块为止,LCD1602电路图如下图所示:

图6.LCD电路图

2.524C02存储模块

24c02是串行CMOS,E2PROM内部含有CAT24WC01有一个8字节页写缓冲器,24c02有一个16字节页写缓冲器.该器件通过I2C总线接口进行操作有一个图7.24C02芯片管脚及其描述

专门的写保护功能.

24C02是带有

C总线接口的E2PROM存储器,具有掉电记忆的功能,并且可以象普通RAM一样用程序改写。

它的容量是256个字节(00h~0ffh),有A2、A1、A0三位地址,可见

C总线上可以连接8片AT24C02,它的寻址字节是1010A2A1A0R/W。

图8.24C02电路图

3产品的元件清单

序号

名称

数量

1

AT89S52

1

2

24C02

1

3

LCD1602

1

4

PS2键盘

1

5

10k电位器

1

6

10k电阻

1

7

10uF电解电容

1

8

33PF瓷片电容

2

9

13M晶振

1

10

Mini—DIN连接器

1

11

按键

1

4软件设计

4.1编程语言及编程软件的选择

本设计选择C语言作为编程语言。

C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。

而汇编语言使用起来并没有这么方便。

本设计选用了Keil作为编程软件,.KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

4.2程序设计

1、主程序设计:

首先初始化IO口和键盘、LCD1602、24C02,然后接收按键的输入的密码值,并通过8位并行传输方式传送给LCD1602显示,并同时存入24C02中。

2、获取键值程序:

按照PS2键盘协议操作,键盘按下时发送通码,弹起时发送断码,在单片机中,将接收到的码字与第二套扫描码比较,得出键值。

3、LCD显示程序:

首先初始化LCD1602端口和寄存器,然后接收单片机传送的数据,通过1602写操作时序显示接收到的数据

4、24C02存储程序:

首先初始化24C02,然后从单片机获取密码值。

5调试

调试时直接在作品上进行,调试过程中,先逐个模块进行调试,在整体进行。

整个作品分为AT89S52模块、液晶显示模块、PS2键盘输入模块和24C02存储模块。

在调试过程中,出现许多的问题,有硬件上的,也有软件上的。

比如刚开始时,mini—DIN连接器引脚接错了,给作品调试带来了不少麻烦。

不过还是主要是程序的调试。

虽然很多问题,但是进过不断的调试和改进,很好的完成了作品。

6作品展示及总结

该作品使用低功耗、高性能的AT89s52作为主控芯片,PS2键盘输入,LCD1602液晶显示的密码锁,可以实现密码设置、重置、掉电保存等功能。

在制作过程中我遇到了许许多多的问题,在解决问题的过程中我学到了不少的知识,如:

焊接、电路设计、protel的使用、编写程序等。

所以说实践是学习的最好方法。

7参考文献

[1]张培仁《基于C语言编程MCS-51单片机原理与应用[M]》北京:

清华大学出版社,2003.

[2]郭天祥《新概念51单片机C语言教程》北京:

电子工业出版社,2011.

[3]谭浩强《C程序设计》第四版北京:

清华大学出版社

附件:

/*********************************************************************************************/

//第一次使用时,存储芯片为空时。

按‘,’输入初始密码,按‘.’输入密码开启蜂鸣器

//若设置了初始密码,按'.'输入密码开启蜂鸣器

//按‘;’重置密码,重置后直接输入密码开启蜂鸣器

//完成断电保存

//输入错误密码后,在输入正确密码可用

/*********************************************************************************************/

#include

#include//标准输入输出

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitscl=P3^6;//24c02时钟线接口

sbitsda=P3^7;//24c02数据线接口

sbitfmq=P1^7;

sbitRS=P1^0;//Pin4

sbitE=P1^1;//Pin6

#defineDataP0//数据端口

sbitKey_Data=P3^3;//定义Keyboard引脚

sbitKey_CLK=P3^2;//使用中断

bitBF;

bitShift;//定义上档键标志

bitKey_UP;//定义通码断码标志

unsignedcharKeyV;

unsignedcharIntNum;

unsignedcharDisNum;

charcodecs[]="newmima";

charcodesr[]="entermima";

charcodef[]="DataError";

staticuchardatacsmm[20];

staticuchardatasrmm[20];

staticintt1=1,t2=1,t3=1,t4=1,t5=1,t6=1,num=0;

voidDelayUs(unsignedcharus)//微秒延时函数

{

unsignedcharuscnt;

uscnt=us>>1;/*12MHz频率*/

while(--uscnt);

}

voidDelayMs(unsignedcharms)//毫秒函数声明

{

while(--ms)

{

DelayUs(250);

DelayUs(250);

DelayUs(250);

DelayUs(250);

}

}

voiddelay()

{

;;

}

/*********************************************************************************/

/*存储芯片*/

/********************************************************************************/

voidstart()//开始信号

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

voidstop()//停止

{

sda=0;

delay();

scl=1;

delay();

sda=0;

delay();

}

voidrespons()//应答

{

uchari;

scl=1;

delay();

while((sda==1)&&(i<50))i++;

scl=0;

delay();

}

voidinit()//初始化

{

sda=1;

delay();

scl=1;

delay();

}

voidwrite_byte(uchardate)

{

uchari,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

delay();

sda=CY;

delay();

scl=1;

delay();

}

scl=0;

delay();

sda=1;

delay();

}

ucharread_byte()

{

uchari,k;

scl=0;

delay();

sda=1;

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

k=(k<<1)|sda;

scl=0;

delay();

}

returnk;

}

voidwrite_add(ucharaddress,uchardate)

{

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

ucharread_add(ucharaddress)

{

uchardate;

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

returndate;

}

/**************************************************************************/

/*液晶*/

/***********************************************************************/

voidWriteCommand(unsignedcharc)//写命令函数

{

DelayMs(5);//操作前短暂延时,保证信号稳定

E=0;

RS=0;

_nop_();

E=1;

Data=c;

E=0;

}

voidWriteData(unsignedcharc)//写数据函数

{

DelayMs(5);//操作前短暂延时,保证信号稳定

E=0;

RS=1;

_nop_();

E=1;

Data=c;

E=0;

RS=0;

}

voidShowChar(unsignedcharpos,unsignedcharc)//写入字节函数

{

unsignedcharp;

if(pos>=0x10)

p=pos+0xb0;//是第二行则命令代码高4位为0xc

else

p=pos+0x80;//是第二行则命令代码高4位为0x8

WriteCommand(p);//写命令

WriteData(c);//写数据

}

voidShowString(unsignedcharline,char*ptr)//写入字符串函数

{

unsignedcharl,i;

l=line<<4;

for(i=0;i<16;i++)

ShowChar(l++,*(ptr+i));//循环显示16个字符

}

voidInitLcd()//初始化函数

{

DelayMs(15);

WriteCommand(0x38);//displaymode

WriteCommand(0x38);//displaymode

WriteCommand(0x38);//displaymode

WriteCommand(0x06);//显示光标移动位置

WriteCommand(0x0f);//显示开及光标设置

WriteCommand(0x01);//显示清屏

}

/*************************************************************************************/

//键盘

/*************************************************************************************/

unsignedcharcodeUnShifted[59][2]={//键盘数组

0x1C,'a',

0x32,'b',

0x21,'c',

0x23,'d',

0x24,'e',

0x2B,'f',

0x34,'g',

0x33,'h',

0x43,'i',

0x3B,'j',

0x42,'k',

0x4B,'l',

0x3A,'m',

0x31,'n',

0x44,'o',

0x4D,'p',

0x15,'q',

0x2D,'r',

0x1B,'s',

0x2C,'t',

0x3C,'u',

0x2A,'v',

0x1D,'w',

0x22,'x',

0x35,'y',

0x1A,'z',

0x45,'0',

0x16,'1',

0x1E,'2',

0x26,'3',

0x25,'4',

0x2E,'5',

0x36,'6',

0x3D,'7',

0x3E,'8',

0x46,'9',

0x0E,'`',

0x4E,'-',

0x55,'=',

0x5D,'\\',

0x29,'',

0x54,'[',

0x5B,']',

0x4C,';',

0x52,'\'',

0x41,',',

0x49,'.',

0x4A,'/',

0x71,'.',

0x70,'0',

0x69,'1',

0x72,'2',

0x7A,'3',

0x6B,'4',

0x73,'5',

0x74,'6',

0x6C,'7',

0x75,'8',

0x7D,'9',

};

unsignedcharcodeShifted[59][2]={

0x1C,'A',

0x32,'B',

0x21,'C',

0x23,'D',

0x24,'E',

0x2B,'F',

0x34,'G',

0x33,'H',

0x43,'I',

0x3B,'J',

0x42,'K',

0x4B,'L',

0x3A,'M',

0x31,'N',

0x44,'O',

0x4D,'P',

0x15,'Q',

0x2D,'R',

0x1B,'S',

0x2C,'T',

0x3C,'U',

0x2A,'V',

0x1D,'W',

0x22,'X',

0x35,'Y',

0x1A,'Z',

0x45,')',

0x16,'!

',

0x1E,'@',

0x26,'#',

0x25,'$',

0x2E,'%',

0x36,'^',

0x3D,'&',

0x3E,'*',

0x46,'(',

0x0E,'~',

0x4E,'_',

0x55,'+',

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2