项目6-单片机的按键

合集下载

单片机课件ppt

单片机课件ppt

无线通信
01
蓝牙通信
单片机可以通过蓝牙模块实现无线通信,与手机、电脑等 设备进行数据传输。常见的蓝牙协议有蓝牙2.0、蓝牙4.0 等。
02 03
Wi-Fi通信
单片机可以通过Wi-Fi模块实现无线通信,与云端服务器 进行数据传输。常见的Wi-Fi协议有Wi-Fi 802.11n、WiFi 802.11ac等。
01
发展
随着技术的不断进步,单片机的性能不 断提高,功能不断丰富,应用领域也不 断扩大。
02
03
现状
目前,单片机已经成为嵌入式系统领 域中的重要分支,广泛应用于各个领 域。
单片机的应用领域
工业控制
智能家居
单片机被广泛应用于工业自动化控制系统 中,如过程控制、数据采集、机械臂控制 等。

单片机在智能家居领域中也得到了广泛应 用,如智能门锁、智能照明、智能空调等 。
nRF24L01无线模块
nRF24L01是一款基于FDSM技术的高性能无线收发器芯 片,工作频率范围为2.400GHz~2.525GHz,常被应用于 低功耗无线传输领域。单片机可以通过nRF24L01无线模 块实现无线数据传输。
05 单片机发展与趋 势
单片机的发展历程
起源
单片机最早起源于20世纪70年代,是一种将CPU、内存 、I/O接口等集成在一个芯片中的微型计算机。
4. 调试
通过仿真和实际硬件调试来验证 程序的正确性。
编程实例
LED闪烁
通过编程控制单片机上的 LED灯的亮灭,以实现闪 烁效果。
按键检测
通过编程检测单片机上的 按键输入,并相应地控制 输出。
定时器使用
通过编程使用单片机的定 时器功能,以实现定时控 制或时间间隔测量。

单片机按键课程设计

单片机按键课程设计

单片机按键课程设计一、课程目标知识目标:1. 让学生掌握单片机基础知识和按键的工作原理;2. 帮助学生了解按键在单片机系统中的应用和编程方法;3. 使学生能够运用所学知识设计简单的单片机按键控制系统。

技能目标:1. 培养学生动手实践能力,能够独立完成单片机按键电路的搭建;2. 提高学生编程能力,掌握单片机按键程序的设计与调试;3. 培养学生解决问题的能力,能够针对实际需求设计合适的单片机按键方案。

情感态度价值观目标:1. 培养学生对单片机技术及电子制作的兴趣,激发创新意识;2. 培养学生团队合作精神,学会分享和交流;3. 增强学生面对困难的勇气和毅力,培养勇于挑战的精神。

课程性质分析:本课程为实践性较强的课程,注重理论知识与实践操作的相结合,以培养学生的动手能力和创新能力为核心。

学生特点分析:学生处于初中或高中年级,具有一定的物理和数学基础,对电子技术和编程有一定了解,好奇心强,喜欢动手实践。

教学要求:结合学生特点,注重理论与实践相结合,充分调动学生的积极性,引导学生主动参与,提高学生的实践能力和创新能力。

在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。

二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理、引脚功能等,结合教材相关章节,为学生建立单片机的基本概念。

2. 按键工作原理:讲解按键的物理原理、电路连接方式、去抖动方法等,使学生了解按键在单片机系统中的应用。

3. 单片机按键编程:教授单片机按键程序设计方法,包括I/O口编程、中断处理等,结合教材实例进行讲解。

4. 按键电路搭建:指导学生动手搭建单片机按键电路,学会使用面包板、电子元件等,培养实际操作能力。

5. 按键程序设计与调试:教授编程软件的使用,引导学生编写、调试按键程序,掌握程序设计的基本方法。

6. 应用实例分析:分析典型单片机按键控制系统实例,使学生了解实际应用中的设计方法和技巧。

教学进度安排:1. 第1课时:单片机基础知识及按键工作原理介绍;2. 第2课时:单片机按键编程方法讲解;3. 第3课时:按键电路搭建及编程实践;4. 第4课时:按键程序设计与调试;5. 第5课时:应用实例分析及总结。

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。

(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。

在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

操作方完成矩阵式键盘实验。

具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。

完成思考题。

三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。

2.在keil上进行编译后生成“xxx.hex”文件。

3.编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。

单片机按键程序的编写

单片机按键程序的编写
下面我们来看看多个按键的情况 吧
一般情况下,如果多个按键每个都直接接在单片机的 I/O 上的话会占用很多的 I/O 资源。比 较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对 于 m 行 n 列的矩阵,可以接的按键总数是 m*n。这里我们以常见的 4*4 矩阵键盘来讲解矩阵 键盘的编程。
/******************************************
* 此模块所需相关支持库
*
******************************************/
#include"regx52.h"
#define uint8 unsigned char
#define uint16 unsigned int
bit bdata StartScan = 0 ;//此变量需放在定时中断中置位
else
{
//SHOW_ICON
}
}
}
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用 CPU 的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按 键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行 定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小 即可。然后在主程序类似下面这样写即可
这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑 实际情况。我们根据这幅流程图来写它的代码看看。
unsigned char v_ReadKey_f( void )
{
unsigned char KeyPress ;

单片机键盘显示实验报告

单片机键盘显示实验报告

单片机的键盘和显示实验报告㈠实验目的1.掌握单片机I/O的工作方式;2.掌握单片机以串行口方式0工作的LED显示;3.掌握键盘和LED显示的编程方法。

㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。

四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。

编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。

注:①通过按键来选择加、减、乘、除四种运算方式。

②输入两个数字均为一位十进制数,可预先放在内存中。

㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接?P1.4~P1.7是键输出线,P1.0~P1.3是扫描输入线。

输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。

2.74LS164移位寄存器的移位速率是多少?实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。

其实这个问题确实不知道怎么回答。

LED 显示用的段码与教科书所提供的不同,本实验采用如下段码:显示数符段码显示数符段码0BBH A DBH109H B F1H2EAH C B2H36BH D E9H459H E F2H573H F D2H否有否P1口置输入读P1口开 始显示“0000”是否有键按下?延迟消抖是否有键按下?是读键码加法运算减法运算除运算6F3H—40H70BH.04H8FBH┗┛A1H97BH┗┛1AH灭00H P DAH实验代码:ORG 0000HAJMP MAINORG 0030HMAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化MOV 42H,#0BBHMOV 43H,#0BBHMOV 44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示KEY:MOV R3,#08H;用来存放两个数据MOV R4,#02HMOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1;消抖MOV A,P1 ;再次读取按键状态CPL AJZ KEY ;再次判别是否有键按下PUSH AKEY1:MOV A,P1CPL AANL A,#0FH ;判别按键释放JNZ KEY1 ;按键未释放,等待LCALL DELAY1;释放,延时去抖动POP AJB ACC.0,ADD1 ;K1按下转去ADD1JB ACC.1,SUB1 ;K1按下转去SUB1JB ACC.2,MUL1 ;K1按下转去MUL1JB ACC.3,DIV1 ;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数和被加数MOV 43H,#049HLCALL DISPLAY ;显示加号MOV A,R3ADD A,R4DA AMOV R3,A ;相加结果放入R6ANL A,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果的高位放入R6LCALL L;显示缓存区设置LCALL DELAY2;延时一秒后显示LCALL DISPLAYLJMP KEYSUB1:LCALL BUFFER ;显示减数和被减数MOV 43H,#40HLCALL DISPLAY ;显示减号MOV A,R3CLR CY ;CY清零SUBB A,R4 ;做减法PUSH ARLC A ;带进位循环左移,最高位放入CYJC F ;判断最高位,若为1则跳转到负数ZHENG: POP AMOV R4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INC AMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L ;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV 43H,#99HLCALL DISPLAY ;显示乘号MOV A,R3MOV B,R4MUL AB ;结果放入AB,A中是低8位,B中是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B ;结果个位放入R7MOV R3,A ;结果的十位放入R6LCALL LLCALL DELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数和被除数MOV 43H,#62HLCALL DISPLAY ;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B ;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,@A+DPTR ;调用段选号MOV 41H,A ;显示余数MOV A,R3MOVC A,@A+DPTRMOV 43H,A ;显示商MOV 42H,#00HMOV 44H,#00HLCALL DELAY2 ;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,@A+DPTRMOV 42H,AMOV A,R3MOVC A,@A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04H;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,@R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2;是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOV A,R4MOVC A,@A+DPTRMOV 41H,A ;R4对应的段码MOV A,R3MOVC A,@A+DPTRMOV 42H,A ;R3对应的段码MOV 43H,#00HMOV 44H,#00HRETDELAY1: ;普通延时MOV R1,#20HDS1:MOV R2,#0FFHDS2:DJNZ R2,DS2DJNZ R1,DS1RETDELAY2:MOV R6,#14H ;定时1SMOV TMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLR TR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH 09H 0EAH 6BH ;段码表DB 59H 73H 0F3H 0BHDB 0FBH 7BH 00H 0DBHDB 0F1H 0B2H 0E9H 0F2HDB 0D2H 40H实验结果及分析按键1:8+2= 结果:10按键2:8-2= 结果: 6按键3:8*2= 结果:16按键4:8/2= 结果:4从上面的结果可以看出,本次实验基本完成了实验要求。

单片机按键处理方式(一)——典型的按键处理方式

单片机按键处理方式(一)——典型的按键处理方式

单⽚机按键处理⽅式(⼀)——典型的按键处理⽅式前⾔ 按键处理是学习单⽚机的必修课之⼀。

⼀次按键的过程,并⾮是⼀个理想的有⼀定宽度的电平脉冲,⽽是在按下、弹起过程中存在抖动,只有在中间阶段电平信号是稳定的。

⼀次典型的按键过程是酱紫的: 在抖动过程中,电平信号⾼低反复变化,如果你的按键检测是检测下降沿或上升沿或者是⽤外部中断检测按键,都可能在抖动时重复检测到多次按键。

这就是在未消抖的按⼀次键显⽰值加1的程序中,出现按⼀次键显⽰值+2、+3甚⾄加更多的原因。

对于按键消抖,常⽤的有硬件消抖和软件消抖。

本⽂是我个⼈对按键处理的⼀些常见⽅法的总结,由于我本⼈不太懂硬件,所以这⾥只讨论独⽴按键的软件消抖实现。

⽔平有限,如有错误请不吝指正。

硬件环境 本⽂代码均在单⽚机STC90C516RD+、晶振12.0MHz硬件环境下试验通过。

带消抖的简单的按键处理 最简单的消抖处理就是在⾸次检测到电平变化后加⼀个延时,等待抖动停⽌后再次检测电平信号。

这也是⼤多数单⽚机教程讲述的消抖⽅式。

但在实际应⽤中基本不⽤这种⽅式,原因后⾯讲,先看代码://⽅法⼀:带消抖的简单的按键处理#include <reg52.h>#define GPIO_KEY P1 //8个独⽴按键IO⼝#define GPIO_LED P0 //8个LED灯,⽤于显⽰键值unsigned char ScanKey();void DelayXms(unsigned char x);void main(){unsigned char key;GPIO_LED = 0x00; //初始化LEDwhile (1){key = ScanKey(); //读取键值// if (0xff != key) //若有键按下,则更新LED的状态GPIO_LED = ~key; //点亮LED}}unsigned char ScanKey(){unsigned char keyValue = 0xff; //赋初值,0xff表⽰没有键按下GPIO_KEY = 0xff; //给按键IO⼝置位if (0xff != GPIO_KEY) //检查按键IO⼝的电平,如有键按下则不为0xff{DelayXms(15); //延时15ms,滤掉抖动。

单片机按键原理

单片机按键原理

单片机按键原理在单片机系统中,按键是一种常见的输入设备,用于向单片机输入外部信号。

按键原理是单片机系统中的基础知识之一,下面我们来详细了解一下单片机按键原理。

1. 按键的基本原理。

按键是一种开关设备,通过按下或释放按钮来改变其导通状态。

在单片机系统中,按键通常由两个金属片组成,当按下按键时,两个金属片接触,形成通路,使得电流可以流通;释放按键时,两个金属片分开,断开通路,电流无法通过。

单片机通过检测按键的状态来判断用户的操作,从而实现相应的功能。

2. 按键的连接方式。

在单片机系统中,按键可以采用两种连接方式,串联和并联。

串联连接是将多个按键连接在一起,形成一个按键组,将按键组的两端分别连接到单片机的两个引脚上,通过检测引脚的电平变化来判断用户的操作。

并联连接是将多个按键分别连接到单片机的不同引脚上,每个按键对应一个引脚,通过检测不同引脚的电平变化来判断用户的操作。

3. 按键的检测原理。

单片机通过检测按键引脚的电平变化来判断按键的状态。

在按键释放时,引脚上的电平为高电平;在按键按下时,引脚上的电平为低电平。

单片机通过定时检测按键引脚的电平变化,来实时监测按键的状态,从而判断用户的操作。

4. 按键消抖原理。

在实际应用中,按键可能会出现抖动现象,即在按键按下或释放的过程中,由于机械结构的原因,按键可能会产生多次开关动作,导致单片机检测到多次按键触发。

为了解决这个问题,通常会在软件中加入按键消抖算法,通过软件延时或状态判断来滤除按键抖动,确保单片机能够正确识别用户的操作。

5. 按键的应用。

按键广泛应用于各种单片机系统中,如嵌入式系统、电子设备、工业控制等领域。

通过按键,用户可以向单片机输入各种指令或数据,实现对系统的控制和操作。

在实际应用中,按键的设计和布局需要根据具体的系统需求来进行合理规划,以确保按键操作的准确性和可靠性。

总结。

单片机按键原理是单片机系统中的基础知识,了解按键的基本原理、连接方式、检测原理和消抖原理,对于设计和开发单片机系统具有重要意义。

单片机实训报告实训方案

单片机实训报告实训方案

一、实训目的1. 掌握单片机的基本原理和组成。

2. 熟悉51单片机的编程方法及开发工具。

3. 培养动手实践能力,提高问题分析和解决能力。

4. 理解单片机在实际应用中的地位和作用。

二、实训内容1. 单片机基本原理- 单片机的组成结构- CPU的工作原理- 存储器分类及功能- I/O接口电路2. 51单片机编程- C语言编程基础- 51单片机指令系统- 程序设计方法- 常用函数和中断系统3. 单片机开发工具- Keil uVision软件的使用- 串口调试助手的使用- 实验箱的连接与调试4. 实训项目- 项目一:LED流水灯- 实现功能:通过单片机控制LED灯的闪烁,形成流水灯效果。

- 实训目标:熟悉单片机基本编程方法,掌握LED灯的控制。

- 项目二:按键控制LED灯- 实现功能:通过按键控制LED灯的开关。

- 实训目标:掌握按键输入的处理方法,了解中断系统。

- 项目三:数字时钟- 实现功能:通过单片机实现数字时钟的功能,显示时分秒。

- 实训目标:掌握定时器的工作原理,了解时钟系统的设计。

- 项目四:温度传感器数据采集- 实现功能:通过温度传感器采集环境温度,并在LCD显示屏上显示。

- 实训目标:学习传感器应用,掌握A/D转换器的工作原理。

三、实训步骤1. 准备工作- 熟悉实训环境,了解实验设备。

- 安装Keil uVision软件,配置实验箱。

2. 理论学习- 学习单片机基本原理、编程方法和开发工具。

- 阅读相关教材和资料,掌握知识点。

3. 项目实施- 根据实训项目要求,进行程序设计。

- 利用Keil uVision软件进行编译、调试和烧录程序。

- 连接实验箱,进行实际操作。

4. 结果分析- 分析程序运行结果,发现问题并解决。

- 总结实训过程中的经验和教训。

5. 撰写报告- 按照实训报告模板,撰写实训报告。

四、实训要求1. 严格遵守实训纪律,按时完成实训任务。

2. 认真学习理论知识,熟练掌握编程方法和开发工具。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

路,P3.2为低电平。
为了消除键盘抖动现象,键盘两端并联滤波电容器C4。
P3.2是单片机的外部中断的输入端,当按键按下时,让单
片机执行外部中断服务程序,在中断服务中完成对LED的 控制。
VCC(+5V)
C1 30P C2 30P R1 1K
IC STC89C51 CY 12MHz
19 18 XTAL1 XTAL2 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17
在数字电路中,常利用触发器消除键盘抖动,但在单
片机系统中,按键可以直接接在单片机的I/O口上,常利用
键盘程序来消除键盘的抖动现象。
6.3 利用外部中断实现键盘输入
一、电路原理 在图6-3中,单片机的P0.0口接一只LED,键盘接在
P3.2端口,按键不按时,由于P3.2接有上拉电阻R3,所
以P3.2此时为高电平+5V,如果按键按下,P3.2电源地短
本案例按键抬起后数据才能得到调整。此种编程方法并不 影响单片机驱动1个数码管工作,但动态显示电路在此种 情况下不能正常工作。如果把while改换成if,按键只要按 下数据就能调整,但如果按下不放开按键,数据自动快速 增加或减小。
如果按键按下既不让程序死循环,也不让由于按键按
的时间过长而数据调整失控,最可靠的办法是利用变量记
if(key2_state == 1) { i--; key2_state = 0; if(i < 0) i = 9; } P0 = seven_seg[i]; //显示键盘调整数据 } }
如果按键按下不放开,程序一直执行语句while(key1
==0),这时程序在此处死循环,不能执行其它程序,所以
个。外部中断主要通过单片机的引脚P3.3()、P3.4()接收 外部脉冲或高低电平出发CPU中断。与外部中断有关的多 功能寄存器为IE、IP、TCON。程序如下:
/*****************************************************************/
#include<reg51.h> sbit LED = P0^0; bit i; void delay() { unsigned char a,b; for(a=0;a<255;a++) for(b=0;b<255;b++); }
这里没有设置INT0是下降沿触发中断或是低电平触发
中断,原因是按键按下,不管产生不产生键抖现象,总能
使INT0引脚产生1个下降沿和低电平。如果设置只有下降 沿才触发INT0中断,需要利用设置计时器控制寄存器 TCON的IT0 = 1位,按键按下是否产生中断,可以利用程 序检测TCON的IE0位。利用外部中断触发作为按键输入很 好的解决了键盘抖动问题。
+VCC
KEY
CP 加计数器
R
图6-1 加数计数小系统
高电平 低电平 T1 T2 T3 T5
T4
图6-2 加数计数小系统
在图6-1所示的一个加数计数小系统中,设计数器的
脉冲输入端CP为上升沿有效,加计数器初始显示为0。按
键不按时,CP = 0,计数器不加1计数。一般认为:按键 按下,CP端由低电平变为高电平,含有电平上升沿,计 数器加1计数,并且按下1次,计数器加1。实际实验时会 发现,按键按下1次,计数器不是加1,而是跳跃一次性增 加3或4。原因是按键按下在导体接触的瞬间产生了震动。
如果需要多个键盘,把INT0口与I/O口之间用键盘连
接,I/O输出低电平扫面信号即可。在数码管动态显示电路
中,为了节省硬件资源,可以在INT0口和P2口之间接入 键盘,实现8只按键输入。
三、利用延时程序防止键盘抖动,实现键盘输入
按键按下产生的抖动现象持续的时间不会很久,因此
在按键按下后,可延时一段时间跳过抖动,再对按键的状 态检测,从而利用延时的方法也可以实现键盘输入。本案 例完通过两个键盘设计,实现对数码管显示数据的调整。
嵌入式单片机方向—单片机C语言程序项目设计
项目6 单片机的按键
6.1任务说明
任务:了解按键的器件特性,学习利用外部中断扫描,延 时等手段实现按键的输入,重点掌握按键程序的变
成 方法。
6.2 按键抖动现象
按键按下都会发出一声响,随然有的按键声音很轻
微,但这都是金属导体碰撞产生的震动,这种现象称为键 盘抖动如果不对键盘的抖动进行处理,按键会对系统电路 或程序产生意外的干扰。为了观察按键的抖动现象,我们 先做一个小实验,分析一下一个微触按键产生抖动对系统 的影响。
R2 1K LED1
9
RESET
C3 10
29 30 31
PSEN ALE EA P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
R3 10K C4 0.1μ
VCC
1 2 3 4 5 6 7 8
KEY
图6-3 利用外部中断INT0实现键盘输入电路
二、外部中断
51系列单片机的中断共有5个,其中外部中断共占两
KEY1
KEY2
图 6-4 利用延时函数消除键盘抖动实现键盘输入电路
在图6-4中,KEY1、KEY2两个键盘一端分别接P3.0、
P3.1,另一端接地,数码管仍使用共阳型。在Proteuse软
件中,按键的英文名字为BUTTON,在Switches & Relasy 下的Switches里。现在实现两个按键控制数码显示的数 字,其中KEY1按下使数字增加,数字到9后变为0,依次循 环;KEY量为1 //如果按键按下又放开 //按键按下状态复位 //按键抬起状态变量为1
//按键按下抬起时,数据调整
忆按键按下和放开的两种状态,根据判断实现键盘输入。 程序如下:
/*********************************/ uchar key1_down_state, key1_up_state, …… if(key1 == 0) { delay(200) //变量声明,初始值为0
if(key1 == 0)key1_down_state = 1; } if(key1 == 1 && key1_down_state = 1) { key1_down_state = 0; key1_up_state = 1; } …… if(key1_up_state == 1) { key1_up_state = 0; i++; } …… /*********************************/
C1 30P C2 30P R1 1K
R2~9 200
AC a g d b c dot
9
a b c f d e f e g dot
RESET
SEVEN_SEG
C3 10 μ
29 30 31
PSEN ALE EA P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
VCC
1 2 3 4 5 6 7 8
/*****************************************************************************/
#include<reg51.h> #define uchar unsigned char uchar code seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit key1 = P3^0; sbit key2 = P3^1; uchar key1_state,key2_state; // 按键按 下的状态变量 void delay(uchar i) { while(i) i--; }
VCC(+5V) IC STC89C51 CY 12MHz
19 18 XTAL1 XTAL2 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17
图6-2是按键按下过程中CP端实际电平改变情况。T1为不
按按键时刻,T2为按键按下瞬间的抖动,T3为按键按下稳
定时刻,T4为按键放开时刻瞬间,T5为按键放开时刻。从 图中可以了解到,按键按下的瞬间由于震动会是按键内部 的导体稳定接触,而是在导通和不导通之间来回弹跳,虽 然时间一瞬间,但使CP端获得了多个电平的上升沿。按 键抖动时间的长短由按键的机械特性决定,一般为5ms~ 10ms。因此不能直接把按键作为1个脉冲的输入。
void int0_isr(void) interrupt 0 //INT0 中断服务函数,INT0的中断号为0 { i = ~i; //INT0 中断1次,i值改变1次 LED = i; //INT0 中断1次,LED工作状态变化1次 delay(); //调用延时函数 } void main(void) { LED = 0; //芯片初始化时,LED灭 EA = 0; EX0 = 1; //开启INT0中断 PX0 = 1; //INT0 中断优先,可以省去 EA = 1; //开启总中断开关 while(1); //等待按键按下,中断发生 } /**********************************************************/
相关文档
最新文档