80C51按键的应用Word文档格式.docx

上传人:b****8 文档编号:22468608 上传时间:2023-02-04 格式:DOCX 页数:27 大小:131.21KB
下载 相关 举报
80C51按键的应用Word文档格式.docx_第1页
第1页 / 共27页
80C51按键的应用Word文档格式.docx_第2页
第2页 / 共27页
80C51按键的应用Word文档格式.docx_第3页
第3页 / 共27页
80C51按键的应用Word文档格式.docx_第4页
第4页 / 共27页
80C51按键的应用Word文档格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

80C51按键的应用Word文档格式.docx

《80C51按键的应用Word文档格式.docx》由会员分享,可在线阅读,更多相关《80C51按键的应用Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。

80C51按键的应用Word文档格式.docx

而事实上,我们的手一直按在按键上,并没有重复按动很多次。

要想能够正确的判断按键是否按下就要避开这段抖动的时间。

根据一般按键的机械特点,以及按键的新旧程度等而言,这段抖动的时间一般在5ms~20ms之间。

而一旦按键按下,稳定闭合的时间一般最短是20ms(手最快的人按下到放开的时间)。

因此,我们通常需要使用如下的防抖措施:

1.当P1.2检测到按键按下(即P1.2引脚读到低电平)。

2.延时10~20ms。

3.再次检测P1.2按键是否仍被按下(即P1.2引脚依旧读到低电平),如果此时P1.2引脚仍然能读到低电平,说明按键确实已经稳定的按下了。

4.等待按键被放开。

上述伪代码写成C51代码就应该是这个样子:

sbitBtnAdd=P1^2;

//将P1.2引脚重新命名为BtnAdd

……

if(BtnAdd==0)//当P1.2检测到按键按下(即P1.2引脚读到低电平)

{

Delay(20);

//延时20ms。

if(BtnAdd==0)//再次检测P1.2按键是否仍被按下,如果此时P1.2引脚

//仍然能读到低电平,说明按键确实已经稳定的按下了

{

while(!

BtnAdd);

//等待按键被放开(按键没放开时BtnAdd为低电平(逻辑0),

//取反后为高电平(逻辑1),此时while循环条件为真,

//则继续执行该句,直到按键放开,后面的代码才能被执行)

}

}

6.3独立按键的使用

请实现:

一位数码管显示从0~9的数字,使用两个按键“Add”和“Sub”,按一下Add,显示数字加一,按一下Sub,显示数字减一,如显示数字小于0或大于9,显示字符“E”,即“ERROR”的简写。

6.3.1硬件的选择与仿真电路的设计

1.打开Proteus,选择“File/NewDesign”菜单选项,新建一个“设计项目”。

并将项目保存为“PushButton_1”。

2.选择“P”按钮或菜单“Library/PickDivice/Symbol…P”菜单,从“元件库”中选取元件。

依次添加其他元件。

其名称和位置见下表。

元件名称

Category

Sub-Category

Results

单片机

MicroprocessorICs

8051Family

AT89C52

一位7段数码管

Optoelectronics

7-SegmentDisplays

7SEG-MPX1-CA

按钮

Switches&

Relays

Switches

BUTTON

电阻

Resistors

Generic

RES

依次从备选元件库中摆放器件,连线,画出仿真电路图,如图6-4所示。

图6-4

电路的说明:

在仿真电路中,由于我们使用的是P1口,它内部已经有上拉电阻了,因此我们可以不再添加上拉电阻了。

但是,如果您使用的是P0口(内部没有上拉电阻),大家必须添加上拉电阻,以确保单片机可以准确的检测到按键按下的动作。

6.3.2程序的设计

1.新建一个keil项目,并命名为“PushButton_1”并添加一个名为“main.c”的源代码文件,然后键入如下代码。

如代码6.1所示。

//代码6.1

#include<

reg52.h>

#include"

function.h"

common.h"

#defineSeg7PortP2//数码管连接在P2口上

//用一个数组来定义字符0~9共阳极数码管编码

ucharcodeseg7ca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

#defineE0x86//用一个字符E来代替字符‘E’的共阳极数码管编码(0x86是其编码)

sbitBtnAdd=P1^2;

//将P1.2引脚重新命名为BtnAdd(加1按键)

sbitBtnSub=P1^3;

//将P1.3引脚重新命名为BtnSub(减1按键)

ucharcount;

//定义一个变量来存储当前数码管显示的值

voidmain()

count=0;

//数码管将从0开始显示

while

(1)

BtnAdd=1;

BtnSub=1;

//在读I/O口之前,先要将其置为高电平

//如果加1按键按下,则count加1

if(BtnAdd==0)//当P1.2检测到按键按下(即P1.2引脚读到低电平)

{

Delay(20);

//延时20ms

if(BtnAdd==0)//再次检测P1.2按键是否仍被按下,如果此时P1.2引脚

//仍然能读到低电平,说明按键确实已经稳定的按下了

{

while(!

//等待按键被放开(按键没放开时BtnAdd为低电平(逻辑0),

//取反后为高电平(逻辑1),此时while循环条件为真,

//则继续执行该句,直到按键放开,后面的代码才能被执行)

count++;

//加1键被按下,count加1

}

}

elseif(BtnSub==0)//如果减1按键按下则count减1(过程与加1键检测相同)

if(BtnSub==0)

BtnSub);

count--;

//减1键被按下,count减1

if(count>

=0&

&

count<

=9)//如果count在0~9之间,则显示对应的数字

Seg7Port=seg7ca[count];

else//否则显示字符‘E’表示错误

Seg7Port=E;

 

●知识点:

I/O口做输入口

当我们要用51单片机的I/O口做输入口(即检测I/O口当前的状态)时,为了正确的读取I/O口的输入值,我们一般需要先将I/O口置为高电平,如:

ifelseifelse结构的语义

ifelseifelse判断语句时C常用的判断语句,其语义如下:

if()//如果

elseif()//或者(再如果)

else//否则

这三个分支只有一个能发生(即3选1)。

如果你使用

if()

那么,这两个分支有可能同时发生(多选)。

请大家注意它们在语义上的区别,在本例中,我们设计时,是不考虑两个按键同时被按下的情形的,因此,实际是二选一的情况,因此,我们使用了ifelseifelse判断语句。

6.4多位数码管的显示

两位数码管显示从00~59的数字,使用两个按键Add和Sub,按一下Add,数字加一,按一下Sub,数字减一,如此反复。

6.4.1硬件的选择与仿真电路的设计

并将项目保存为“PushButton_2”。

51单片机

两位7段共阳数码管

7SEG-MPX2-CA

依次从备选元件库中摆放器件,连线,画出仿真电路图,如图6-5所示。

图6-5

电路说明

因为我们使用了两位共阳数码管,由于51的驱动能力不足以直接驱动数码管,因此,我们通过两个PNP三极管作为电子开关来驱动数码管位选线,当P3.0输出低电平时,PNP三极管导通,Vcc通过三极管Q1加在数码管的个位,从而使数码管的个位发光(P3.1控制数码管十位发光的原理相同)。

电阻R3和R4为限流电阻,通常取值为1K左右。

电阻R5和R6为下拉电阻,保证PNP三极管可靠地截止,通常取值为10K左右。

6.4.2实现原理分析

1.我们使用一个变量count表示当前数值,让count从0开始,每按Add键加1,当count增加到59时,让它回到0,每按Sub键减1,当count减少到0时,让它回到59重新开始。

这样,count就在0~59之间反复变化。

2.我们让数码管的个位显示count的个位,数码管的十位显示count的十位。

6.4.3程序的设计

1.新建一个keil项目,并命名为“PushButton_2”并添加一个名为“main.c”的源代码文件,然后键入如下代码。

如代码6.2所示。

代码6.2

sbitGeWei=P3^0;

//定义数码管个位的位选线

sbitShiWei=P3^1;

//定义数码管十位的位选线

//关闭所有的数码管显示

voidCloseAllSeg()

GeWei=1;

//关闭个位位选线

ShiWei=1;

//关闭十位位选线

//在数码管上显示count值

voidDisplay()

uchartmp;

CloseAllSeg();

//关闭所有的数码管显示

//先显示个位

tmp=count%10;

//提取count的个位数

GeWei=0;

//先显示个位,将十位关闭

Seg7Port=seg7ca[tmp];

//将‘count’个位的编码送出

Delay

(1);

CloseAllSeg();

//关闭所有的数码管显示;

消隐,防止闪烁

//再显示十位

tmp=count/10;

//提取十位数

ShiWei=0;

//先显示十位,将个位关闭

//将‘count’十位的编码送出

//消隐,防止闪烁

if(BtnAdd==0)

//取反后为高电平(逻辑1),此时while循环条件为真,

if(count<

59)//如果count<59,每按Add键count加1,否则count回0

{

count++;

}

else

count=0;

if(count>

0)//如果count>

0,每按Sub键count减1,否则count回59

count--;

count=59;

Display();

////在数码管上显示count值

●程序代码说明

1.程序结构说明

在本例中,我们的程序设计思路是这样的

在main函数的大循环中,不断的检测BtnAdd和BtnSub是否被按下,如果被按下,则根据按下的按键修改count值,然后再将count的个位和十位分别显示在数码管上即可。

2.一个数循环变化的技巧

if(count<

59)//如果count<59,每按Add键count加1,否则count回0

count++;

else

以及下面的代码:

if(count>

0)//如果count>

count--;

else

count=59;

在让一个数循环变化时,这是一种常用的技巧,后面时钟项目中,我们会使用到这种技巧(调整时分秒,年月日等等)。

3.Display()函数的使用

因为在main函数的大循环中,我们要不断的将count的个位和十位显示在数码管上,这个显示操作可以写为一个函数,即Display()函数,这是一种常用的代码复用的技巧。

6.54X4键盘的使用

当我们的应用中要使用比较多的按键时,如果使用独立按键的话,将会占用很多I/O口,那么,为了节约I/O口线,我们需要使用另一类按键,其中比较常用的是4X4键盘。

让我们实现如下功能:

让1位数码管依次显示4X4键盘的编码(数字键显示对应的数字,功能键显示对应的A~F字符)。

6.5.14X4键盘实现按键检测的原理分析

一般情况下,4X4键盘与单片机的连接如下面这图6-6所示。

图6-6

4X4键盘通常有4行4列共16个按钮,分别跨接在4根交叉的行线和列线上,我们通常把4根行线和4根列线连接在单片机的一个I/O口上,比如像图6-6那样,4根行线连接在P2.0~P2.3上,4根列线连接在P2.4~P2.7上。

当我们要检测键盘上那个按键被按下,我们通常采用如下方法:

1.我们先拉低P2.0

2.依次检测P2.4~P2.7,如果没有检测到任何低电平,说明没有按键被按下。

检测到有低电平,比如P2.5为低电平,说明P2.0和P2.5交叉的那个按键被按下了。

3.我们再拉低P2.1

4.依次检测P2.4~P2.7。

(同步骤2)

5.我们再拉低P2.2

6.依次检测P2.4~P2.7。

7.我们再拉低P2.3

8.依次检测P2.4~P2.7。

9.重复步骤1~8。

上述伪代码写成C51代码就应该是这个样子。

sbitLine_A=P2^0;

//将4X4键盘的4根行线连接在P2.0~P2.3

sbitLine_B=P2^1;

sbitLine_C=P2^2;

sbitLine_D=P2^3;

sbitLine_1=P2^4;

//将4X4键盘的4根列线连接在P2.4~P2.7

sbitLine_2=P2^5;

sbitLine_3=P2^6;

sbitLine_4=P2^7;

Line_A=0;

//先拉低P2.0

if(Line_1==0)//检测每根列线是否被拉低。

如果没有检测到任何低电平,说明没有按键被按下。

Delay(10);

//消抖

if(Line_1==0)

result=7;

//检测到有低电平,说明P2.0和P2.4交叉的那个按键被按下了,则输出

//对应的按键的编码(编码自己定)

elseif(Line_2==0)//检测每根列线是否被拉低。

如果没有检测到任何低电平,说明没有按键被按下

if(Line_2==0)

result=8;

//检测到有低电平,说明P2.0和P2.5交叉的那个按键被按下了,则输出//对应的按键的编码

elseif(Line_3==0)//检测每根列线是否被拉低。

if(Line_3==0)

result=9;

//检测到有低电平,说明P2.0和P2.6交叉的那个按键被按下了,则输出//对应的按键的编码

elseif(Line_4==0)//检测每根列线是否被拉低。

if(Line_4==0)

result=10;

//检测到有低电平,说明P2.0和P2.7交叉的那个按键被按下了,则输出//对应的按键的编码

//再依次检测P2.1,P2.2,P2.3

6.5.2硬件电路的设计

并将项目保存为“4X4KeyPad”。

1位7段共阳数码管

4X4键盘

KeyPads

KEYPAD-SMALLCALC

依次从备选元件库中摆放器件,连线,画出仿真电路图,如图6-7所示。

图6-7

我们使用P2口来驱动一位共阳极数码管,同时使用P3口来检测4X4按键,其中,P3.0~P3.3引脚连接到行线ABCD上,P3.4~P3.7连接到列线1234上。

6.5.3程序的设计

1.新建一个keil项目,并命名为“4X4Key”并添加一个名为“main.c”的源代码文件,然后键入如下代码。

如代码6.3所示。

//代码6.3

#defineSeg7PortP2//数码管连接在P2口上

#defineKeyPadP3//键盘连接在P3口上

sbitLine_A=P3^0;

//将4X4键盘的4根行线连接在P3.0~P3.3

sbitLine_B=P3^1;

sbitLine_C=P3^2;

sbitLine_D=P3^3;

sbitLine_1=P3^4;

//将4X4键盘的4根列线连接在P3.4~P3.7

sbitLine_2=P3^5;

sbitLine_3=P3^6;

sbitLine_4=P3^7;

//用一个数组来定义字符0~F共阳极数码管编码

ucharcodeseg7ca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//键盘扫描程序

ucharScanKeypad()

ucharresult='

N'

;

//定义函数输出结果

KeyPad=0xff;

//全部置高电平,为检测输入做准备

//先拉低P3.0

if(Line_1==0)//检测每根列线是否被拉低。

if(Line_1==0)

result=7;

//检测到有低电平,说明P3.0和P3.4交叉的那个按键被按下了,则输出对应的按键

//的编码(编码自己定,本例中P3.0和P3.4交叉为数字7按键,所以我们输出7)

elseif(Line_2

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

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1