基于MCS51单片机的独立按键和矩阵按键检测实验.docx
《基于MCS51单片机的独立按键和矩阵按键检测实验.docx》由会员分享,可在线阅读,更多相关《基于MCS51单片机的独立按键和矩阵按键检测实验.docx(12页珍藏版)》请在冰点文库上搜索。
![基于MCS51单片机的独立按键和矩阵按键检测实验.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/2f603e0f-ed66-4cc5-9706-0100b8e31c0b/2f603e0f-ed66-4cc5-9706-0100b8e31c0b1.gif)
基于MCS51单片机的独立按键和矩阵按键检测实验
实验三基于MCS-51单片机的独立按键和矩阵按键检测实验
一、支撑课程目标
目标1:
掌握微机和单片机的基本原理、编程技术、中断技术、系统扩展、定时器、串行接口和其他输入/输出接口技术,并且了解典型的单片机应用系统的设计思想和实现方法。
目标2:
初步具备自行拟定实验步骤、检查和故障排除、分析和综合实验结果以及撰写实验报告的能力。
目标4:
掌握MCS-51单片机/STM32F103单片机系统仿真工具和仿真流程,了解常用实验仪器、设备的基本工作原理,了解其正确使用方法,具备利用电子仪器设备和专业仿真软件对复杂工程问题进行分析和设计的能力。
二、实验类型:
验证型()、设计型(√)、研究创新型()
三、预期学生学习的成果
1、具有典型按键检测电路原理及消除抖动的必要性的认知。
2、理解程序设计消除抖动的实现过程。
3、掌握独立按键的程序查询检测编程实现。
4、掌握独立按键的中断检测编程实现。
5、理解矩阵键盘的行列扫描检测原理,具有矩阵键盘软硬件设计综合能力。
四、实验原理
1、典型按键检测电路
电阻防止按下电源短路,如图1(a)。
图1按键典型电路及对应检测电压
2、按键抖动及消除
如图1(b),理想条件下,按键未按下,在检测I/O端口是高电平,按下以后,检测I/O端口是低电
平,手松后,按键弹起,检测I/O端口是高电平。
整个按键过程出现高电平到低电平又到高电平,有下降
沿,也有上升沿。
实际过程中,由于人手的抖动,检测端电压如图1(c),检测电压出现“毛刺”抖动,假
设单片机检测高电平阈值为VH,低电平阈值为VL,一次按键就会出现多次高电平到低电平变化,存在按键误检测可能。
常用消除办法之一:
一旦检测到低电平,延迟u毫秒,u选择大于20,再次判断检测端是否是低电平,如果是,就判定为1次按键。
通过延时来避开跳变过程。
3、矩阵按键的行列扫描法原理
4*4矩阵键盘,Y0-Y3为行线,Y4-Y7为列线,如图2所示。
0123
图2矩阵键盘原理图
行扫描法键盘扫描过程:
由于MCS-51单片机I/O引脚(除P0口)都会配置成上拉形式,所以在矩阵键盘部分不需要上拉电阻。
判断键盘中有无键按下及按下键所在列的位置:
将全部行线Y0-Y3置高电平,列线Y4-Y7置低电平,然后检测列线的状态。
若所有行线均为高电平,则键盘中无键按下。
只要有一行的电平为低,则表示键盘该行有一个或多个键被按下。
判断闭合键所在列的位置:
在确认有键按下后,即可进入确定具体闭合键的位置在哪行。
其方法是:
将全部行线Y0-Y3置高电平、列线Y4-Y7逐行置低电平、然后检测行线的状态,只要有一行的电平为低,则表示键盘该行与对应置低列交叉键被按下。
五、实验内容及步骤
(一)实验内容
1、利用Proteus软件绘制MCS-51单片机最小系统,1位数码管控制电路,2个按键检测电路(1个中断按键,1个查询按键)。
2、编写程序,利用程序查询和中断形式分别对按键次数进行计数,按键需要消除抖动,利用1位数码
管显示按键次数。
3、利用Proteus软件绘制MCS-51单片机最小系统,1位数码管控制电路,4*4矩阵按键电路。
4、编写程序,利用矩阵按键的行列扫描原理,实现按键的检测,数码管显示键值。
5、扩展利用其它方法对矩阵键盘按键键值进行检测。
(二)实验步骤
(1)独立按键检测及键数数码管显示
1、典型按键电路可以连接在一般I/O端口上,也可以连接在具有外部中断的I/O引脚上。
当采用程序查询方式检测时,都可以。
在采用外部中断检测时,只能连接在P3.2或P3.3引脚上。
利用Proteus软件绘制电路原理图,参考如图3所示,单片机最小系统,由于I/O口(非P0口)内置有上拉电阻,所以按键不再添加上拉电阻和外置电源,利用数码管显示键值。
两个检测按键分别接在P1.2和P3.3分别测试程序查询和外部中断检测按键。
搭建好硬件电路,以备测试软件。
2、在Keil软件下,建立工程,编写源文件,对于P1.2引脚采用程序查询方式检测按键,P3.3引脚按键采用中断方式检测。
3、程序编译,生成Hex文件,嵌入到Proteus软件单片机里,晶体振荡器12M,运行软件仿真,观察仿真现象。
(2)矩阵按键检测及键值数码管显示
1、在Proteus软件下绘制电路原理图,利用数码管显示键值。
4*4矩阵键盘连接在P1端口的8个引脚上。
由于P1端口内部每个引脚都有上拉电路,所以检测引脚可以不配置上拉电路。
如果连接在P0端
口上,需要连接上拉电路。
2、在Keil软件下,建立工程,编写源文件,矩阵键盘采用程序查询方式检测按键,键值依次0-9,A,B,C,D,E,F。
3、程序编译,生成Hex文件,嵌入到Proteus软件单片机里,晶体振荡器12M,运行软件仿真,观察仿真现象。
不同的按键对应的键值可以根据个人需要设定对应键值。
注意程序中需要消除按键的抖动。
六、扩展实验
1、2个按键同时连接,分别在一个程序里采用查询和中断方式检测按键,比较按键检测的响应灵敏度。
2、矩阵按键检测,采用线翻转等其他方式检测。
七、实验结果
(1)独立按键检测及键数数码管显示
1、典型按键电路可以连接在一般I/O端口上,也可以连接在具有外部中断的I/O引脚上。
当采用程序查询方式检测时,都可以。
在采用外部中断检测时,只能连接在P3.2或P3.3引脚上。
利用Proteus软件绘制电路原理图,参考如图3所示,单片机最小系统,由于I/O口(非P0口)内置有上拉电阻,所以按键不再添加上拉电阻和外置电源,利用数码管显示键值。
两个检测按键分别接在P1.2和P3.3分别测试程序查询和外部中断检测按键。
搭建好硬件电路,以备测试软件。
2、在Keil软件下,建立工程,编写源文件,对于P1.2引脚采用程序查询方式检测按键,P3.3引脚按键采用中断方式检测。
3、程序编译,生成Hex文件,嵌入到Proteus软件单片机里,晶体振荡器12M,运行软件仿真,观
察仿真现象。
Keil
#include
#defineucharunsignedchar
ucharseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchari=0;
sbitKEY=P1^2;//
voiddelayms(intms)
{
intm;
while(ms--)for(m=0;m<123;m++);
}
ucharkeyscan(void)
{
if(KEY==0)//按键未按下
{
delayms(78);
if(KEY==0)
{
i++;
if(i>9)
i=0;
}
}
returni;
}
voidmain(void)
IT1=1;//下降沿触发
P2=seg[0];
while
(1)
{
inta;
a=keyscan();
P2=seg[a];
}
}
voidint1(void)interrupt2using0
{
i++;
if(i>9)
i=0;
P2=seg[i];
}
Proteus
(2)矩阵按键检测及键值数码管显示
1、在Proteus软件下绘制电路原理图,利用数码管显示键值。
4*4矩阵键盘连接在P1端口的8个引脚上。
由于P1端口内部每个引脚都有上拉电路,所以检测引脚可以不配置上拉电路。
如果连接在P0端口上,需要连接上拉电路。
2、在Keil软件下,建立工程,编写源文件,矩阵键盘采用程序查询方式检测按键,键值依次0-9,A,B,C,D,E,F。
3、程序编译,生成Hex文件,嵌入到Proteus软件单片机里,晶体振荡器12M,运行软件仿真,观察仿真现象。
不同的按键对应的键值可以根据个人需要设定对应键值。
注意程序中需要消除按键的抖动。
Keil
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voiddelayms(unsignedintz);
ucharkeyscan(void);
voidmain(void)
ucharkey;
while
(1)
{
key=keyscan()-1;
P0=seg[key];
}
}
voiddelayms(unsignedintms)
{
inti;
while(ms--)for(i=123;i>0;i--);
}
ucharkeyscan(void)
{
ucharscode,scode1,scode2,k;
P1=0xf0;
scode1=P1&0xf0;
if(scode1!
=0xf0)
{
delayms(10);scode1=P1&0xf0;
if(scode1!
=0xf0)
{
//列号
//行号
//键值
scode1=P1^0xf0;
P1=0x0f;
scode2=P1^0x0f;scode=scode1|scode2;switch(scode)
case0x11:
k=1;break;
case0x12:
k=2;break;
case0x14:
k=3;break;
case0x18:
k=4;break;
case0x21:
k=5;break;
case0x22:
k=6;break;
case0x24:
k=7;break;
case0x28:
k=8;break;
case0x41:
k=9;break;
case0x42:
k=10;break;
case0x44:
k=11;break;
case0x48:
k=12;break;
case0x81:
k=13;break;
case0x82:
k=14;break;
case0x84:
k=15;break;
case0x88:
k=16;break;default:
k=0;break;
}
}
}
returnk;
Proteus
八、实验分析
(1)独立按键检测及键数数码管显示
Int1(p3.3口)选为下降沿触发方式,由于每个机器周期采样中断请求信号一次,所以,中断请求信号的高电平和低电平的持续时间必须保持一个机器周期以上。
扫描函数ucharkeyscan(void)一开始delayms(10),出现数码管混乱,中断检测正常,之后延长延时时间delayms(78);两种方式都正常计数.
(2)矩阵按键检测及键值数码管显示
P0口数码管采用共阳极接法,对“0”有效,矩阵式接口有两种:
逐行扫描和线反转。
线反转法的依据是键号与键值一一对应,将数码管段码放进数组里,将行线输出为0读列线得scode1,再将列线输出为0读行线得scode2,再通过scode=scode1|scode2;得到键值,然后ucharkeyscan()扫描函数判断按键按下,消除抖动,利用switch分支函数将p1口键值与k对应,最后扫描键值,查表给P0口数码管赋值,注意,由于k从1~16,而段码的数组是从0到f开始计数的,所以key=keyscan()-1;按键需要减一.
评分: