基于单片机的模拟手机键盘.docx
《基于单片机的模拟手机键盘.docx》由会员分享,可在线阅读,更多相关《基于单片机的模拟手机键盘.docx(34页珍藏版)》请在冰点文库上搜索。
![基于单片机的模拟手机键盘.docx](https://file1.bingdoc.com/fileroot1/2023-6/10/e85f0c6d-268e-40ec-b8c9-56d40248d631/e85f0c6d-268e-40ec-b8c9-56d40248d6311.gif)
基于单片机的模拟手机键盘
信息工程学院
课程设计报告书
题目:
基于单片机的模拟手机键盘
专业:
电子信息科学与技术
班级:
_
学号:
学生姓名:
_
指导教师:
2013年10月18日
1
信息工程学院课程设计任务书
学号学生姓名专业(班级)电子信息
设计题目基于单片机的模拟手机键盘
单片机晶振频率:
12MHz;
电源电压:
+5v
设
计
技
术
参
数
编程控制单片机端口实现按键输出0~9十个数字并在液晶上显示出来。
设
计
要
求
两天
工
作
量
注:
可填写课程设计报告的字数要求或要完成的图纸数量。
工
作
计
划
[1]康华光,陈大钦.电子技术基础—模拟部分(第五版)[M].北京:
高等教育出版社,2005
参
考[2]郭天祥.51单片机C语言教程[M].北京:
电子工业出版,2012
资
料
指导教师签字教研室主任签字
2
信息工程学院课程设计成绩评定表
学生姓名:
学号:
专业(班级):
电子信息
课程设计题目:
基于单片机的模拟手机键盘
指导教师评语:
成绩:
指导教师:
年月日
3
摘要
本文是做基于89C52单片机的手机键盘的设计;利用P0端3*4的键值来模拟手机键盘
中的数字,将采用编程的方法来实现使用12个键来做到0到9的数字输出和退位清零,并
在液晶屏上显示。
手机作为现代移动通信的载体,其技术也得到了很大的发展,手机的键盘
布局已经成了各大厂商门竞争的主要方面,本次设计提高了我们对单片机的操作能力,让我
们更加认识到单片机的广阔前景,对于我们更加深入学习和了解单片机提供了极大的帮助。
关键词:
矩阵键盘,LCD液晶屏,89C52单片机。
4
目
录
1
任务提出与方案论证..............................................................................................................
-2-
1.1
方案一......................................................................................................................
-2-
1.2
方案二..........................................................................................................................
-2-
1.3
方案对比与选择............................................................................................................
-2-
2.
系统硬件电路的设计.............................................................................................................
-4-
2.1
微处理器的选择...........................................................................................................
-4-
2.2
单片机的基本机构........................................................................................................
-4-
2.3
键盘接口电路................................................................................................................
-5-
2.4
消除抖动........................................................................................................................
-6-
3
详细设计..................................................................................................................................
-7-
3.1
程序流程设计...............................................................................................................
-7-
3.2
硬件电路设计...............................................................................................................
-8-
4
总结
.........................................................................................................................................
-9-
参考文献....................................................................................................................................
-10-
附录...........................................................................................................................................
-11-
-1-
1任务提出与方案论证
1.1方案一
采用8255芯片,通过PA,PB口输出;PC的高四位输出,低四位输入;定
时器测量两次按键的间隔,进行手机键盘的模拟;此种方法思路简单,能够实
现0到9的数值在数码管上的显示。
方框图如图1.1。
主控模块
8255芯片单片机(AT89C5
2)
键盘扫描
Lcd液晶显示
图1.1方案一方框图
1.2方案二
采用易购的AT89C52系列。
该方法采用静态显示法来控制LED的数值显示,P0口接锁存器防止总线间的冲突,P0口输出段码数据,P1.0口到P1.8口接9个按键,用于1到26的数值设置;在硬件电路不变的情况下,通过改变信号来实
现数码管的显示。
方框图如图1.2所示。
键
盘
扫
描
数据锁存器LCD显示
AT89C52
P0端口
列驱动
图1.2方案二方框图
1.3方案对比与选择
由于方案2需要数据锁存器等硬件,且接口较复杂,又考虑到数码管显示只
-2-
有6位,而且系统没有其他复杂的处理任务;所以在综合比较之下,方案1显的更加简单明了,可行性更高;我们一致决定采用方案1来实现a到z对应的1到
26的数值显示。
-3-
2.系统硬件电路的设计
2.1微处理器的选择
1)控制中心使用MCS-51来实现
2)驱动用8255芯片来实现
3)显示用6个三级数码显示管来实现
4)使用+5V电源
2.2单片机的基本机构
1)MCS-51单片机内部结构
MCS-51单片机内部包含中央处理器(CPU)、程序存储器(ROM)、数据存储
器(RAM)、定时/计数器、并行I/O接口、串行I/O接口和中断系统等几大单元。
其内部结构图如图2.1所示。
振荡器80514KB掩膜特殊功能寄存器定时器T0T1
ROMSDR128KB
CPU
并行I/O接口串行接口中断系统
P0P1P2P3TXDRXDINT0INT1
图2.1单片机8051内部结构图
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈
佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
-4-
1)中央处理器
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
2)数据存储器
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
3)程序存储器
8051共有4KB8位掩膜ROM,用于存放用户程序,原始数据或表格。
4)定时/计数器
单片机8051内有两个16位的可编程定时/计数器,以实现定时或计数产生
中断用于控制程序转向。
5)并行输入输出(I/O)口
单片机8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的
传输。
6)全双工串行口
单片机8051内置一个全双工串行通信口,用于与其它设备间的串行数据传
送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
7)中断系统
单片机8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断
和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
8)时钟电路
单片机8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行
的脉冲时序,但单片机8051需外置振荡电容。
2.3键盘接口电路
图2.2为键盘接口电路的原理图,图中矩阵式键盘和8255的PA口相连,
-5-
AT89C52的PB和8255的D0口相连,AT89C52不断的扫描键盘,看是否有键
按下,如有,则根据相应程序对按键作出相应的反应。
图2.2矩阵式键盘接口图
2.4消除抖动
使用键盘时,由于键的闭合和断开,此过程中会产生一个抖动期。
抖动时间的长短与开关机械特性有关,一般为10~20ms。
为了保证CPU对键的闭合的正确判定,必须去除抖动,在键的稳定闭合和断开期间读取键的状态。
去除抖动可以采用硬件和软件两种方法。
硬件方法就是在案件输入通道添加去抖动电路,从根本上避免电压抖动的产生。
软件方法则采用延迟10~20ms的时间,待电压稳定后,在进行状态输入。
由于软件延时方法经济实惠且技术上完全可行,所以此设计采用软件方法去抖。
-6-
3详细设计
3.1程序流程设计
利用KEIL软件编程,使用单片机P0口接上拉电阻驱动液晶屏,使用P3口连接
矩阵键盘扫描按键,在程序开始运行之后,首先是对数据进行初始化之后判断按键
值,通过键值判断该键值是否设置了相应数值,有则转入相应的的程序输出数值,
若没有则返回继续判断。
开始
液晶初始化
N
是否有键按下
Y
松手检测
松手
输出数据
返回继续扫描
图3.1主程序流程图
-7-
3.2硬件电路设计
硬件电路使用PROTEUS软件连线,主要使用AT89C52单片机芯片和LM016L液晶芯片,LI
利用P0口驱动液晶,用P3口连接矩阵键盘。
图3.2硬件连接图
-8-
4总结
本系统分硬件与软件两部分,硬件以单片机STC89C52为核心,以3*4矩阵键盘为输入端,并结合LCD液晶显示模块模拟手机显示屏,构成整个硬件系统。
软件部分是整个控制器的重要组成部分,设计的好坏关系到系统性能的稳定程
度。
在控制器的软件中,采用C语言设计程序,程序可读性强。
回顾起此次单片机课程设计,我仍感慨颇多,在这两个个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,遇到困难,永远不要沮丧气馁。
两周的设计完满结束了,经过自己的努力和同学的帮忙终于有了成果,特别离
不开指导老师的悉心教导,方师的精心指导和解说使我受益匪浅,相信他的工作作风和知识筑成都是我们学习榜样,给我很大的启迪。
感谢这些老师不畏辛劳,热心精心的指导。
在这里向他们说声谢谢,你们辛苦了。
在这里,我们真诚
地感谢在本次设计中给予我们许多帮助和支持的指导老师和各位同学们,真心地祝愿你们身体健康,工作顺利。
-9-
参考文献
[1]康华光,陈大钦.电子技术基础—模拟部分(第五版)[M].北京:
高等教育出版社,
2005
[2]郭天祥.51单片机C语言教程[M].北京:
电子工业出版,2012
-10-
附录
程序清单:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitEN=P2^0;
sbitRS=P2^1;
sbitring=P2^2;
ucharcodetable[]="0123456789";
ucharcodetable2[]="FISHLEONG";
uchartemp,num,num2;
charx;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidcon(ucharcon)
{
RS=0;
EN=0;
P0=con;
delay
(1);
EN=1;
delay
(1);
EN=0;
}
voiddate(uchardate)
{
RS=1;
EN=0;
P0=date;
delay
(1);
EN=1;
delay
(1);
EN=0;
}
voidinit()
{
x=-1;
-11-
ring=0;
con(0x38);
con(0x0e);
con(0x06);
con(0x01);
con(0x80);
for(num2=0;num2<10;num2++)
{
date(table2[num2]);
}
con(0x80+0x40);
}
voidRING()
{
ring=1;
delay(100);
ring=0;
}
voidkey_scan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
x++;
RING();
switch(temp)
{
case0xe0:
num=1;break;
case0xd0:
num=2;break;
case0xb0:
num=3;break;
}
date(table[num]);
}
while(temp!
=0xf0)
{
temp=P3;
-12-
temp=temp&0xf0;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
x++;
RING();
switch(temp)
{
case0xe0:
num=4;break;
case0xd0:
num=5;break;
case0xb0:
num=6;break;
}
date(table[num]);
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
x++;
-13-
RING();
switch(temp)
{
case0xe0:
num=7;break;
case0xd0:
num=8;break;
case0xb0:
num=9;break;
}
date(table[num]);
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
RING();
switch(temp)
{
case0xe0:
con(0x80+0x40+x);
date('');
con(0x80+0x40+x);
x--;
if(x==-2)
{
init();
x=-1;
}
break;
case0xd0:
num=0;
x++;
-14-
date(table[num]);
break;
case0xb0:
init();
break;
}
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
if(x==16)
init();
}
voidmain()
{
init();
while
(1)
{
key_scan();
}
}
-15-