ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:131.21KB ,
资源ID:22468608      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22468608.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(80C51按键的应用Word文档格式.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、而事实上,我们的手一直按在按键上,并没有重复按动很多次。要想能够正确的判断按键是否按下就要避开这段抖动的时间。根据一般按键的机械特点,以及按键的新旧程度等而言,这段抖动的时间一般在5ms20ms之间。而一旦按键按下,稳定闭合的时间一般最短是20ms(手最快的人按下到放开的时间)。因此,我们通常需要使用如下的防抖措施:1.当P1.2检测到按键按下(即P1.2引脚读到低电平)。2.延时1020ms。3.再次检测P1.2按键是否仍被按下(即P1.2引脚依旧读到低电平),如果此时P1.2引脚仍然能读到低电平,说明按键确实已经稳定的按下了。4.等待按键被放开。上述伪代码写成C51代码就应该是这个样子:s

2、bit BtnAdd=P12; /将P1.2引脚重新命名为BtnAddif(BtnAdd=0) /当P1.2检测到按键按下(即P1.2引脚读到低电平) Delay(20); /延时20ms。 if(BtnAdd=0)/再次检测P1.2按键是否仍被按下,如果此时P1.2引脚 /仍然能读到低电平,说明按键确实已经稳定的按下了 while(!BtnAdd);/等待按键被放开(按键没放开时BtnAdd为低电平(逻辑0), /取反后为高电平(逻辑1),此时while循环条件为真, /则继续执行该句,直到按键放开,后面的代码才能被执行) 6.3 独立按键的使用请实现:一位数码管显示从09的数字,使用两个按

3、键“Add”和“Sub”,按一下Add,显示数字加一,按一下Sub,显示数字减一,如显示数字小于0或大于9,显示字符“E”,即“ERROR”的简写。6.3.1硬件的选择与仿真电路的设计1.打开Proteus,选择“File/NewDesign”菜单选项,新建一个“设计项目”。并将项目保存为“PushButton_1”。2.选择“P”按钮或菜单“Library/Pick Divice/Symbol P”菜单,从“元件库”中选取元件。依次添加其他元件。其名称和位置见下表。元件名称CategorySub-CategoryResults单片机Microprocessor ICs8051 FamilyA

4、T89C52一位7段数码管Optoelectronics7-Segment Displays7SEG-MPX1-CA按钮Switches & RelaysSwitchesBUTTON电阻ResistorsGenericRES依次从备选元件库中摆放器件,连线,画出仿真电路图,如图6-4所示。图6-4电路的说明:在仿真电路中,由于我们使用的是P1口,它内部已经有上拉电阻了,因此我们可以不再添加上拉电阻了。但是,如果您使用的是P0口(内部没有上拉电阻),大家必须添加上拉电阻,以确保单片机可以准确的检测到按键按下的动作。6.3.2程序的设计1.新建一个keil项目,并命名为“PushButton _1

5、”并添加一个名为“main.c”的源代码文件,然后键入如下代码。如代码6.1所示。/代码6.1#include #include function.hcommon.h#define Seg7Port P2 /数码管连接在P2口上/用一个数组来定义字符09共阳极数码管编码uchar code seg7ca=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;#define E 0x86 /用一个字符E来代替字符E的共阳极数码管编码(0x86是其编码)sbit BtnAdd= P12; /将P1.2引脚重新命名为BtnAdd(加1按键)sbit Bt

6、nSub=P13; /将P1.3引脚重新命名为BtnSub(减1按键)uchar count; /定义一个变量来存储当前数码管显示的值void main() 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(

7、! /等待按键被放开(按键没放开时BtnAdd为低电平(逻辑0), /取反后为高电平(逻辑1),此时while循环条件为真, /则继续执行该句,直到按键放开,后面的代码才能被执行) count+; /加1键被按下,count加1 else if(BtnSub=0) /如果减1按键按下则count减1(过程与加1键检测相同) if(BtnSub=0)BtnSub); count-; /减1键被按下,count减1 if(count=0 & count=9) /如果count在09之间,则显示对应的数字 Seg7Port=seg7cacount; else /否则显示字符E表示错误 Seg7Por

8、t=E; 知识点:I/O口做输入口当我们要用51单片机的I/O口做输入口(即检测I/O口当前的状态)时,为了正确的读取I/O口的输入值,我们一般需要先将I/O口置为高电平,如:if elseif else结构的语义if elseif else判断语句时C常用的判断语句,其语义如下:if() /如果else if() /或者(再如果)else /否则这三个分支只有一个能发生(即3选1)。如果你使用if()那么,这两个分支有可能同时发生(多选)。请大家注意它们在语义上的区别,在本例中,我们设计时,是不考虑两个按键同时被按下的情形的,因此,实际是二选一的情况,因此,我们使用了if elseif el

9、se判断语句。6.4 多位数码管的显示两位数码管显示从0059的数字,使用两个按键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加在数码管的个位,从而使数码管的个位

10、发光(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就在059之间反复变化。2. 我们让数码管的个位显示count的个位,数码管的十位显示count的十位。6.4.3程序的设计1.新建一个keil项目,并命名为“PushButton _2”并添加一个名为“ma

11、in.c”的源代码文件,然后键入如下代码。如代码6.2所示。代码6.2sbit GeWei=P30; /定义数码管个位的位选线sbit ShiWei=P31; /定义数码管十位的位选线/关闭所有的数码管显示void CloseAllSeg() GeWei=1; /关闭个位位选线 ShiWei=1;/关闭十位位选线/在数码管上显示count值void Display() uchar tmp; CloseAllSeg(); /关闭所有的数码管显示 /先显示个位 tmp=count%10;/提取count的个位数 GeWei=0; /先显示个位,将十位关闭 Seg7Port=seg7catmp; /

12、将count个位的编码送出 Delay(1); CloseAllSeg(); /关闭所有的数码管显示;消隐,防止闪烁 /再显示十位 tmp = count/10;/提取十位数 ShiWei=0; /先显示十位,将个位关闭/将count十位的编码送出/消隐,防止闪烁 if(BtnAdd=0) /取反后为高电平(逻辑1),此时while循环条件为真, if(count0) /如果count0,每按Sub键count减1,否则count回59 count-; count=59; Display(); /在数码管上显示count值 程序代码说明1.程序结构说明在本例中,我们的程序设计思路是这样的在ma

13、in函数的大循环中,不断的检测BtnAdd和BtnSub是否被按下,如果被按下,则根据按下的按键修改count值,然后再将count的个位和十位分别显示在数码管上即可。2.一个数循环变化的技巧if(count0) /如果count count-; else count=59; 在让一个数循环变化时,这是一种常用的技巧,后面时钟项目中,我们会使用到这种技巧(调整时分秒,年月日等等)。3.Display()函数的使用因为在main函数的大循环中,我们要不断的将count的个位和十位显示在数码管上,这个显示操作可以写为一个函数,即Display()函数,这是一种常用的代码复用的技巧。6.5 4X4键

14、盘的使用当我们的应用中要使用比较多的按键时,如果使用独立按键的话,将会占用很多I/O口,那么,为了节约I/O口线,我们需要使用另一类按键,其中比较常用的是4X4键盘。让我们实现如下功能:让1位数码管依次显示4X4键盘的编码(数字键显示对应的数字,功能键显示对应的AF字符)。6.5.1 4X4键盘实现按键检测的原理分析一般情况下,4X4键盘与单片机的连接如下面这图6-6所示。图6-64X4键盘通常有4行4列共16个按钮,分别跨接在4根交叉的行线和列线上,我们通常把4根行线和4根列线连接在单片机的一个I/O口上,比如像图6-6那样,4根行线连接在P2.0P2.3上,4根列线连接在P2.4P2.7上

15、。当我们要检测键盘上那个按键被按下,我们通常采用如下方法:1.我们先拉低P2.02.依次检测P2.4P2.7,如果没有检测到任何低电平,说明没有按键被按下。检测到有低电平,比如P2.5为低电平,说明P2.0和P2.5交叉的那个按键被按下了。3.我们再拉低P2.14.依次检测P2.4P2.7。(同步骤2)5.我们再拉低P2.26.依次检测P2.4P2.7。7.我们再拉低P2.38.依次检测P2.4P2.7。9.重复步骤18。上述伪代码写成C51代码就应该是这个样子。sbit Line_A=P20; /将4X4键盘的4根行线连接在P2.0P2.3sbit Line_B=P21;sbit Line_

16、C=P22;sbit Line_D=P23;sbit Line_1=P24; /将4X4键盘的4根列线连接在P2.4P2.7sbit Line_2=P25;sbit Line_3=P26;sbit Line_4=P27; Line_A=0; /先拉低P2.0 if(Line_1=0) /检测每根列线是否被拉低。如果没有检测到任何低电平,说明没有按键被按下。 Delay(10); /消抖 if(Line_1=0) result=7; /检测到有低电平,说明P2.0和P2.4交叉的那个按键被按下了,则输出/对应的按键的编码(编码自己定) else if(Line_2=0) /检测每根列线是否被拉低

17、。如果没有检测到任何低电平,说明没有按键被按下 if(Line_2=0) result=8; /检测到有低电平,说明P2.0和P2.5交叉的那个按键被按下了,则输出/对应的按键的编码 else if(Line_3=0) /检测每根列线是否被拉低。 if(Line_3=0) result=9; /检测到有低电平,说明P2.0和P2.6交叉的那个按键被按下了,则输出/对应的按键的编码 else if(Line_4=0) /检测每根列线是否被拉低。 if(Line_4=0) result=10; /检测到有低电平,说明P2.0和P2.7交叉的那个按键被按下了,则输出/对应的按键的编码/再依次检测P2

18、.1,P2.2,P2.36.5.2 硬件电路的设计并将项目保存为“4X4KeyPad”。1位7段共阳数码管4X4键盘KeyPadsKEYPAD-SMALLCALC依次从备选元件库中摆放器件,连线,画出仿真电路图,如图6-7所示。图6-7我们使用P2口来驱动一位共阳极数码管,同时使用P3口来检测4X4按键,其中,P3.0P3.3引脚连接到行线ABCD上,P3.4P3.7连接到列线1234上。6.5.3程序的设计1.新建一个keil项目,并命名为“4X4Key”并添加一个名为“main.c”的源代码文件,然后键入如下代码。如代码6.3所示。/代码6.3#define Seg7Port P2 / 数

19、码管连接在P2口上#define KeyPad P3 / 键盘连接在P3口上sbit Line_A=P30; /将4X4键盘的4根行线连接在P3.0P3.3sbit Line_B=P31;sbit Line_C=P32;sbit Line_D=P33;sbit Line_1=P34; /将4X4键盘的4根列线连接在P3.4P3.7sbit Line_2=P35;sbit Line_3=P36;sbit Line_4=P37;/用一个数组来定义字符0F共阳极数码管编码uchar code seg7ca=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/键盘扫描程序uchar ScanKeypad() uchar result=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) else if(Line_2

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

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