独立按键和矩阵按键

合集下载

矩阵按键电路和独立按键工作原理

矩阵按键电路和独立按键工作原理

矩阵按键电路和独立按键工作原理矩阵按键电路矩阵按键电路是一种高效而又经济的按键设计方式,它将多个按键组织成一定的矩阵结构并通过一个控制器来实现按键的检测。

矩阵按键电路由行线与列线组成。

行线为输出线,列线为输入线。

在按下一个按键时,控制器会向对应的列线输出高电平,此时如果行线有接通的按键,那么控制器就能够检测到该按键被按下的信号。

矩阵按键的工作原理是利用行列扫描的方法来检测按键的状态。

控制器会按顺序扫描每一行,当扫描到某一行时,会向该行对应的列线输出高电平,然后检测该行是否回应了该列的高电平,如果有,则可以确定该行对应的按键被按下了。

矩阵按键电路的优点是能够节约设备成本和空间,同时减少硬件的数量,从而减轻设备的负担。

此外,由于控制器只在需要时才会扫描按键,能够降低功耗,也不易疲劳。

不过矩阵按键电路的缺点是不适合使用既能按短按键又支持长按键的按键,同时按键数量也受到限制,因为每个行线和列线都需要一个接口,因此设计中一定要考虑到矩阵电路的规模和设计合理性。

独立按键独立按键是指在电路设计中,将每个按键独立处理,每个按键都有自己的连接端,与其他按键相互独立,排列随意,可以短按、长按等操作。

独立按键的工作原理是当按键被按下后,按键触头与弹簧之间的接触面积减小,从而形成了一个电路通路。

此时电流会从露出来的触点中流过,被检测电路感应到,并对该按键进行相应的控制处理。

独立按键的优点是可设计灵活,不受按键数量限制,适合于需要支持各种按键操作的设备,同时还可以支持防抖处理,从而减少误操作。

另外,独立按键电路不会受到其他按键和电路的干扰,稳定性更好。

不过独立按键的缺点是设备成本相对较高,同时还需要占用更多的空间和接线,电路复杂度也较高,这对于大规模的复杂电路可能会造成较大的困难。

综合比较可以看出,矩阵按键和独立按键各有优缺点,在实际应用中应根据具体的场景及需求来选择适合的按键方式。

矩阵按键适用于按键数目较少的情况,减少硬件数量,节约设备成本和空间,同时能够节能降耗。

独立式键盘与矩阵键盘原理逐行扫描法与行列互换法 键盘编码器芯片74C922

独立式键盘与矩阵键盘原理逐行扫描法与行列互换法 键盘编码器芯片74C922
独立式按键在单片机按键的应用系统中分为独立式按键矩阵式按键所谓的独立式按键就是指按键直接连接在io线上构成的单独按键通常一个按键需要单独占用一根口线那么cpu就可以通过向此io口发出读指令来得到当前按键的状态
单片机原理及应用
第4 章(2)--- 键盘
独立式键盘与矩阵键盘原理 二. 逐行扫描法与行列互换法 三. 键盘编码器芯片74C922 四. 小结
2.矩阵式按键 在独立式按键结构下,如果连接 16个按键则需要占个I/O 口。因此在需要大量按键
的情况下,矩阵式按键结构比独 立式按键节约I/O口的资源
矩阵式键盘与独立式的键盘不同,
往往矩阵式按键需要行和列共同 决定按键的键值。
一.独立式按键与矩阵式键盘原理
第2行检测
第3行检测
第4行检测
二. 逐行扫描法与行列互换法
第4列扫描: 第4列输出0,其余列输出1
输入情况检测:
第1行检测
第2行检测
第3行检测
第4行检测
二. 逐行扫描法与行列互换法
逐行扫描法的 另一种写法:
第1列输出0的情况:
其余情况类似,这里省略
二. 逐行扫描法与行列互换法
行列互换法:
将两次读入的端口电平值进行 “或” 运算,则结果中只有对 应闭合键所在行、列位置的数值为0,其余皆为1。
根据预先制定的规则,利用查表法可求出代表闭合键编号的 键模值。
二. 逐行扫描法与行列互换法
三. 键盘编码器芯片74C922
各引脚功能如下: Y1—Y4为行键输入端; X1—X4为列键输入端; OSC为振荡器的外接引线端,可用 外部的输入脉冲或电容器; DA—DD为数据输出端,可与微机 直接接口;KBM为键颤屏蔽端; OE 为数据输出允许端,低电平有 效; DAV为数据输出有效,高电平有效; VCC为电源端,接3—5V; GND为接地端

单片机控制系统按键的类型

单片机控制系统按键的类型

012 3 0
456 7 1
8 9 10 11 2
12 13 14 15 3
0 123
图7.5 矩阵式键盘结构
+5 V
矩阵式键盘中,行、列线分别连接到按键开关的两 端,行线通过上拉电阻接到+5V上。当无键按下时,行 线处于高电平状态;当有键按下时,行、列线将导通, 此时,行线电平将由与此行线相连的列线电平决定。这 是识别按键是否按下的关键。然而,矩阵键盘中的行线、 列线和多个键相连,各按键按下与否均影响该键所在行 线和列线的电平,各按键间将相互影响,因此,必须将 行线、列线信号配合起来作适当处理,才能确定闭合键 的位置。
图7.8是一种简易键盘接口电路,该键盘是由8051 P1口 的高、低字节构成的4×4键盘。键盘的列线与P1口的高4位 相连,键盘的行线与P1口的低4位相连,因此,P1.4P1.7是 键输出线,P1.0P1.3是扫描输入线。图中的4输入与门用于 产生按键中断,其输入端与各列线相连,再通过上拉电阻接 至+5 V电源,输出端接至8051的外部中断输入端。
2. 矩阵式键盘按键的识别 识别按键方法很多,其中最常见的方法是扫描法。下 面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。 按键按下时,与此键相连的行线与列线导通,行线在 无键按下时处在高电平。显然,如果让所有的列线也处在 高电平,那么,按键按下与否不会引起行线电平的变化, 因此,必须使所有列线处在低电平。只有这样,当有键按 下时,该键所在的行电平才会由高电平变为低电平。CPU 根据行电平的变化,便能判定相应的行有键按下。8号键按 下时,第2行一定为低电平。然而,第2行为低电平时,能 否肯定是8号键按下呢?
(3) 求按键位置。根据前述键盘扫描法,进行逐 列置0扫描。图7.6中,32个键的键值分布如下(键值 由4位十六进制数码组成,前两位是列的值,即A口数 据,后两位是行的值,即C口数据,X为任意值):

单片机开关元器件名称

单片机开关元器件名称

单片机开关元器件名称引言:在单片机系统中,开关元器件起着至关重要的作用。

它们可以控制电路的开关状态,实现信号的输入和输出。

本文将介绍几种常见的单片机开关元器件,包括按键开关、拨动开关、光电开关以及磁敏开关。

一、按键开关按键开关是单片机系统中最常见的开关元器件之一。

它们通常由金属片、弹簧、触点等组成。

按键开关可以分为矩阵按键和独立按键两种类型。

矩阵按键可以将多个按键通过行和列的组合方式连接到单片机的I/O口上,实现多个按键共用一个I/O口的功能。

独立按键则每个按键都连接到单片机的一个独立的I/O口上。

二、拨动开关拨动开关是一种常用的手动开关元器件,它可以实现电路的开关和切换功能。

拨动开关通常由一根或多根摇杆连接到触点上,通过拨动摇杆来改变触点的接通状态。

拨动开关常用于控制电路的开关、模式选择等场景中。

三、光电开关光电开关是利用光电效应工作的一种开关元器件。

它由发光二极管和光敏二极管组成。

发光二极管发出的光线被光敏二极管接收,当光线被遮挡时,光敏二极管的电阻值发生变化,从而改变开关的状态。

光电开关常用于检测物体的存在与否、计数等应用中。

四、磁敏开关磁敏开关是一种利用磁场变化来实现开关动作的元器件。

它通常由磁敏材料和触点组成。

当磁敏材料受到外部磁场的影响时,其电阻值发生变化,从而导致触点的状态改变。

磁敏开关常用于磁场检测、安全开关等应用中。

五、总结单片机开关元器件在电路设计中起着重要的作用。

按键开关、拨动开关、光电开关和磁敏开关都是常见的开关元器件。

它们各自具有不同的特点和应用场景,可以满足不同的需求。

在实际应用中,我们需要根据具体的需求选择适合的开关元器件,并合理设计电路,确保其正常工作。

通过合理使用开关元器件,我们可以实现单片机系统的功能拓展、信号输入和输出控制等功能。

六、参考文献[1] 赵鸿飞. 单片机技术及应用[M]. 清华大学出版社, 2014.[2] 杨剑波. 单片机原理与应用[M]. 电子工业出版社, 2017.[3] 刘新平, 赵莉. 单片机原理与应用[M]. 清华大学出版社, 2018.。

实验5-独立键盘和矩阵键盘

实验5-独立键盘和矩阵键盘

实验5 独立键盘和矩阵键盘一、实验目的1、学会用C语言进行独立按键应用程序的设计。

2、学会用C语言进行矩阵按键应用程序的设计。

二、实验内容1、独立按键:对四个独立按键编写程序:当按k1时,8个LED同时100ms闪烁;当按k2时,8个LED从左到右流水灯显示;当按k3时,8个LED从右到左流水灯显示;当按k4时,8各LED同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭;2、矩阵按键:采用键盘扫描方式,顺序按下矩阵键盘后,在一个数码管上顺序显示0~F,采用静态显示即可。

3、提高部分(独立按键、定时器、数码管动态扫描):编写程序,实现下面的功能。

用数码管的两位显示一个十进制数,变化范围为00~59,开始时显示00,每按一次k1,数值加1;每按一次k2,数值减1;每按一次k3,数值归零;按下k4,利用定时器功能使数值开始自动每秒加1;再按一次k4,数值停止自动加1,保持显示原数。

三、实验步骤1、硬件连接(1)使用MicroUSB数据线,将实验开发板与微型计算机连接起来;(2)在实验开发板上,用数据线将相应接口连接起来;2、程序烧入软件的使用使用普中ISP软件将HEX文件下载至单片机芯片内。

查看结果是否正确。

四、实验结果——源代码1. #include "reg52.h"typedef unsigned char u8;typedef unsigned int u16;#define LED P2sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;const char tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u8 code begMid[]={0x7e, 0xbd,0xdb,0xe7, 0xdb, 0xbd, 0x7e}; void Delay(u16 i){ while(i--);}void KeyDown(){u8 i;if(key2==0){Delay(1000);if(key2==0){for(i=0;i<8;i++){LED=tab[i];Delay(50000);}while(!key2);}LED=0xff;}else if(key1==0){Delay(1000);if(key1==0)for(i=0;i<3;i++){LED=0x00;Delay(10000);LED=0xff;Delay(10000);}}}}void Int0Init(){IT0=1;EX0=1;EA=1;}void Int1Init(){IT1=1;EX1=1;EA=1;} void main(){Int0Init();Int1Init();while(1){KeyDown();}}void Int0() interrupt 0{u8 i;if(key3==0){Delay(1000);if(key3==0)for(i=7;i>=0;i--){LED=tab[i];Delay(50000);}}}}void Int1() interrupt 2{u8 i;if(key4==0){Delay(1000);if(key4==0){for(i=0;i<=6;i++){LED=begMid[i];Delay(50000);}}}}2.#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 KeyValue;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//??0~F?? void delay(u16 i){while(i--);}void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);if(GPIO_KEY!=0x0f){GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0)){delay(1000);a++;}}}}void main(){LSA=0;LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=smgduan[KeyValue];}}3.#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;#define KEYPORT P3sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;u16 t;u8 sec;u8 DisplayData[2];u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Time1Init(){TMOD |= 0x10;TH1=0Xd8;TL1=0Xf0;EA=1;ET1=1;}void delay(u16 i){while(i--); }void DigDisplay(){u8 i;for(i=0;i<2;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;break;case 1:LSA=1;LSB=0;LSC=0;break;}P0=DisplayData[i];delay(100);P0=0x00;}}void datapros(){DisplayData[0]=smgduan[sec%10];DisplayData[1]=smgduan[sec/10];}void main(){Time1Init();while(1){if(key4==0){delay(1000);if(key4==0){TR1=!TR1;while(key4==0);}}if(key3==0){delay(1000);if(key3==0){sec=0;while(key3==0);}}if(key2==0){delay(1000);if(key2==0){sec--;while(key2==0);}}if(key1==0){delay(1000);if(key1==0){sec++;while(key1==0);}}}}void Time1() interrupt 2{TH1=0Xd8;TL1=0Xf0;t++;if(t==100){t=0;sec++;if(sec>=60){sec=0;}}datapros();DigDisplay();}五、实验体会——结果分析1、独立按键:位定义四个按键key1、key2、key3、key4,宏定义LED为P2口,tab数组保存流水灯D0-D7依次点亮的数值,begMid数组保存流水灯同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。

基于MCS-51单片机的独立按键和矩阵按键检测实验

基于MCS-51单片机的独立按键和矩阵按键检测实验

实验三基于MCS-51单片机的独立按键和矩阵按键检测实验一、支撑课程目标目标1:掌握微机和单片机的基本原理、编程技术、中断技术、系统扩展、定时器、串行接口和其他输入/输出接口技术,并且了解典型的单片机应用系统的设计思想和实现方法。

目标2:初步具备自行拟定实验步骤、检查和故障排除、分析和综合实验结果以及撰写实验报告的能力。

目标4:掌握MCS-51单片机/STM32F103单片机系统仿真工具和仿真流程,了解常用实验仪器、设备的基本工作原理,了解其正确使用方法,具备利用电子仪器设备和专业仿真软件对复杂工程问题进行分析和设计的能力。

二、实验类型:验证型( )、设计型(√)、研究创新型()三、预期学生学习的成果1、具有典型按键检测电路原理及消除抖动的必要性的认知。

2、理解程序设计消除抖动的实现过程。

3、掌握独立按键的程序查询检测编程实现。

4、掌握独立按键的中断检测编程实现。

5、理解矩阵键盘的行列扫描检测原理,具有矩阵键盘软硬件设计综合能力。

四、实验原理1、典型按键检测电路典型的按键检测电路具备检测按键的条件:检测引脚处在键按下前和后,要有电平变化,否则按键无法检测。

电路组成包括电源、上拉电阻、按键、接地组成,按下前,检测引脚高电平,按下后检测引脚低电平。

电阻防止按下电源短路,如图1(a)。

GND(a)(b)图 1 按键典型电路及对应检测电压2、按键抖动及消除如图1(b),理想条件下,按键未按下,在检测I/O端口是高电平,按下以后,检测I/O端口是低电平,手松后,按键弹起,检测I/O端口是高电平。

整个按键过程出现高电平到低电平又到高电平,有下降沿,也有上升沿。

实际过程中,由于人手的抖动,检测端电压如图1(c),检测电压出现“毛刺”抖动,假设单片机检测高电平阈值为VH,低电平阈值为VL,一次按键就会出现多次高电平到低电平变化,存在按键误检测可能。

常用消除办法之一:一旦检测到低电平,延迟u毫秒,u选择大于20,再次判断检测端是否是低电平,如果是,就判定为1次按键。

独立按键及矩阵键盘控制LED灯课件

独立按键及矩阵键盘控制LED灯课件
动态显示技术
通过动态刷新LED灯的状态,实现LED灯的闪烁、流水灯等效果,提高 系统的交互性和用户体验。
03
队列缓冲技术
将按键输入和LED灯输出分别放在不同的队列中处理,通过队列缓冲技
术实现程序的非阻塞性处理,提高系统的响应速度和处理效率。
实战项目:独立
05 按键及矩阵键盘 控制LED灯的综
合应用
行消抖处理。
硬件去抖
通过在按键与处理芯片之间增加 一个RC滤波电路,利用RC的充 放电过程来过滤按键电平抖动, 从而消除按键抖动对读取按键状
态的影响。
软件去抖
通过编写一段软件延时程序,在 检测按键状态时延时一段时间后 再进行检测,从而避免按键抖动
对读取按键状态的影响。
复杂矩阵键盘控制
1 2
扫描法
通过逐行逐列扫描键盘矩阵,依次识别每个按键 的行列坐标,从而判断出按下的按键位置。
连接电路
矩阵键盘的行线和列线分 别与树莓派的GPIO引脚相 连,形成矩阵结构。
电源和地线
需要连接电源和地线,以 给矩阵键盘提供工作电压 。
编程实现
01
02
03
04
安装库
需要安装相应的Python库, 如RPi.GPIO和MFRC522。
初始化
初始化树莓派的GPIO引脚和 MFRC522模块。
扫描按键
二极管和晶体管
介绍这两种重要的电子元件及其在 电路中的应用。
编程基础
01
02
03
编程语言
介绍适用于独立按键和矩 阵键盘控制的编程语言, 如C语言或Python。
程序结构
详细解释程序的各个部分 ,如变量、函数、循环等 。
条件语句
介绍条件语句及其在编程 中的应用。

矩阵键盘的检测和独立按键的区别

矩阵键盘的检测和独立按键的区别

矩阵键盘的检测和独立按键的区别
 这次我接着上次的说,讲一下复合按键和矩阵键盘。

 先说矩阵键盘,因为我写的组合键代码是在矩阵键盘的基础上写的,当然在独立按键上写组合键更简单一些。

所以当你矩阵键盘的组合键会写的时候,你在独立按键上的组合键也就会写了。

 矩阵键盘的检测和独立按键有很大的区别,但是究其本质还是一样的。

 先看一下矩阵键盘的原理图:
 矩阵键盘原理图
 由于矩阵键盘中每一个按键的两个接线口都是接在IO口上的,所以我们就必须在软件里面控制单片机在每个独立按键的两端加上不同的电平。

 【注】:独立按键很简单,直接在一端接地就行了。

简述独立式键盘和矩阵式键盘的应用场合

简述独立式键盘和矩阵式键盘的应用场合

独立式键盘和矩阵式键盘是两种常见的计算机输入设备,它们各自有着不同的特点和应用场合。

下面将分别对两种键盘的应用场合进行简述。

一、独立式键盘的应用场合1. 专业键盘输入独立式键盘通常采用机械键盘的结构,具有较长的按键行程和良好的手感,适合需要大量键盘输入的专业人士使用,如程序员、作家、编辑等。

2. 高端游戏玩家对于注重游戏体验的高端游戏玩家来说,独立式键盘同样是一种不错的选择。

它们通常具有反应迅速、按键触感舒适的特点,能够满足玩家对于游戏操作的要求。

3. 办公场合在办公场合,独立式键盘也有着很好的应用前景。

其结构稳固,按键手感舒适,可以提高办公人员的工作效率,并减少长时间使用键盘造成的手部疲劳。

二、矩阵式键盘的应用场合1. 多媒体控制矩阵式键盘通常体积较小,布局紧凑,适合用于多媒体设备的控制。

在数字音乐控制台上就常常使用矩阵式键盘来控制音乐的播放、切换等操作。

2. 工业自动化设备在工业自动化设备中,常常需要使用键盘来进行设备的参数设置和控制。

而矩阵式键盘适合布局灵活,结构紧凑,适用于工业环境的特点,因此在这些场合下有很好的应用表现。

3. 其他特殊场合除了上述提到的应用场合外,矩阵式键盘还可以用于一些特殊的场合,比如医疗设备、安防设备等领域。

独立式键盘和矩阵式键盘各自在不同的应用场合中发挥着重要的作用。

在选择键盘时,用户需要根据自己的实际需求和使用场景来选择适合的键盘类型,以便更好地提高工作和生活的效率。

在现代社会,随着科技的不断发展和应用范围的扩大,人们对输入设备的要求也越来越高。

键盘作为计算机最基本的输入设备,其种类和类型也越来越多样化。

除了独立式键盘和矩阵式键盘之外,还有触摸键盘、薄膜键盘、无线键盘等多种类型,每种键盘都有其特定的应用场合。

独立式键盘因其较长的按键行程和舒适的手感,被广泛应用于专业领域,如程序员、作家、编辑等需要长时间键盘输入的人裙。

而在专业音乐领域,独立式键盘同样得到了广泛的应用。

独立按键及矩阵键盘控制LED灯课件

独立按键及矩阵键盘控制LED灯课件

THANKS
电路。
当按键被按下时,按键的两个触 点之间会短路,从而接通电路; 当按键释放时,触点断开,电路
断开。
独立按键通常用于简单的输入控 制,如开关一个LED灯。
独立按键控制LED灯的电路连接
01
将LED的正极连接到按键的常闭 触点上,LED的负极连接到地线 。
02
当按键没有被按下时,LED灯不 亮;当按键被按下时,LED灯亮 起。
控制家电设备
独立按键和矩阵键盘可以用于控制各种家电设备,如灯光、空调、电视等,实现一键控制和智能 化管理。
实现人机交互
通过独立按键和矩阵键盘,用户可以方便地与智能家居系统进行交互,实现语音控制、手势控制 等多种交互方式。
实现家庭安全
独立按键和矩阵键盘可以用于设置安全报警系统,如门窗报警、烟雾报警等,提高家庭安全防范 能力。
应用场景的比较
独立按键
适用于按键数量较少,布局较为分散 的场合,如遥控器、计算器等。
矩阵键盘
适用于按键数量较多,布局较为紧凑 的场合,如电脑键盘、游戏机手柄等 。
优缺点的比较
独立按键
01
缺点:占用引脚多,不适合大量按键的应 用场景。
03
02
优点:每个按键独立控制,电路简单,易于 实现。
04
矩阵键盘
优点:可节省引脚数量,适用于大量按键 的应用场景。
05
06
缺点:电路较为复杂,需要行列扫描或解 码电路才能实现。
04
独立按键及矩阵键盘在智能 家居中的应用
智能家居概述
1 2
3
智能家居定义
智能家居是指通过互联网、物联网等技术,将家庭中的各种 设备连接到一起,实现智能化控制和管理,提高生活便利性 和舒适度。

51单片机学习之5-独立按键和矩阵键盘

51单片机学习之5-独立按键和矩阵键盘

51单片机学习之5-独立按键和矩阵键盘
第14集
键盘的原理
键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。

非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)
独立键盘的电路图。

因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。

当检测到IO口为0时即可判断该按键已经按下。

按键按下时会有一个抖动的
过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。

因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。

例程:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitKey=P3;//按键
sbitLed=P1;//Led灯
voiddelay(uintz);
/********主函数********/
voidmain()。

矩阵按键控制说明

矩阵按键控制说明

矩阵按键控制一、矩阵按键电路结构1、独立按键2、矩阵按键(4×4键盘)3、按键防抖分析:二、按键处理流程三、工作方式:查询法、中断法四、按键程序设计按键输入程序的设计通常需要完成以下任务:1、判断有无按键按下由于直接进行按键扫描,需要的时间比较长。

如果对程序性能有较高要求,通常需要另外编写判断有无按键按下的函数。

仅判断有无按键按下,无需进行扫描,这样程序执行速度就快得多。

当有按键按下时,再调用按键扫描程序来取键值。

2、消除按键抖动干扰矩阵键盘消接抖与独立按键一样,检测到有按键按下后,延时10ms左右,再确认是否有键按下,如两次都检测到有键按下,才确认为有按键按下。

特别说明,并不是所有按键动作都必须消除按键抖动。

当按键要处理的事情与按键的次数有关时,必须消键抖动。

连续按一次或多次键,对要完成的事情没有影响时,可以不消键抖动。

3、识别被按下的键值。

确认有按键按下后,调用取键值函数获取键值。

4、等待按键释放。

只有键释放了,才完成了一次“按键”动作。

至于是先等待按键释放,再处理按键的工作;还是先处理按键的工作,再等待按键释放,要根据工作的要求来决定。

五、引脚控制:行线、列线根据实际采用跳线来连接。

六、控制程序举例/****** 4*4键扫描程序开始 ******/sbit keyC0=P0^0;sbit keyC1=P0^1;sbit keyC2=P0^2;sbit keyC3=P0^3;sbit keyR0=P2^4;sbit keyR1=P2^5;sbit keyR2=P2^6;sbit keyR3=P2^7; uchar key_get(){uchar k=255; //键值暂存,无键返回255keyC0=keyC1=keyC2=keyC3=keyR0=keyR1=keyR2=keyR3=1; //拉高位线电平keyR0=0; //第1行if(keyC3==0)k=0;else if(keyC2==0)k=1;else if(keyC1==0)k=2;else if(keyC0==0)k=3;keyR0=1;keyR1=0; //第2行if(keyC3==0)k=4;else if(keyC2==0)k=5;else if(keyC1==0)k=6;else if(keyC0==0)k=7;keyR1=1;keyR2=0; //第3行if(keyC3==0)k=8;else if(keyC2==0)k=9;else if(keyC1==0)k=10; //0xAelse if(keyC0==0)k=11; //0xBkeyR2=1;keyR3=0; //第4行if(keyC3==0)k=12; //0xCelse if(keyC2==0)k=13; //0xDelse if(keyC1==0)k=14; //0xEelse if(keyC0==0)k=15; //0xFkeyR3=1;return k; //返回键值}/****** 4*4键扫描程序结束 ******/void main(){bit keyDown=0;while(1){if(keyDown==0&&key_get()!=255) //防抖消除功能{delay(200);if(key_get()!=255){jianzhi=key_get();keyDown=1;switch(jianzhi) //判断键值{case 0:yuan1++;break; //对应键值的操作功能case 1:yuan5++;break; //对应键值的操作功能case 2:yuan10++;break; //对应键值的操作功能}}}}}。

按键功能实验报告总结(3篇)

按键功能实验报告总结(3篇)

第1篇一、实验背景按键作为电子设备中常见的输入装置,其功能丰富,应用广泛。

本实验旨在通过设计和实现一系列按键功能,加深对按键工作原理的理解,并提高电子设计实践能力。

二、实验目的1. 掌握按键的基本原理和电路设计方法。

2. 熟悉按键在不同应用场景下的功能实现。

3. 培养电子设计实践能力,提高问题解决能力。

三、实验内容1. 实验器材:51单片机最小核心电路、按键、LED灯、电阻、电容、面包板等。

2. 实验内容:(1)单按键控制LED灯闪烁(2)按键控制LED灯点亮与熄灭(3)按键控制LED灯亮度调节(4)按键实现数字时钟调整(5)按键实现多功能计数器(6)按键实现密码输入与验证四、实验步骤1. 根据实验要求,设计电路图,并选择合适的元器件。

2. 使用面包板搭建实验电路,包括单片机、按键、LED灯、电阻、电容等。

3. 编写程序,实现按键功能。

4. 对程序进行调试,确保按键功能正常。

5. 实验完成后,撰写实验报告。

五、实验结果与分析1. 单按键控制LED灯闪烁实验结果:按下按键,LED灯闪烁;松开按键,LED灯停止闪烁。

分析:本实验通过单片机定时器实现LED灯的闪烁。

当按键按下时,定时器开始计时;当定时器达到设定时间后,LED灯点亮;定时器继续计时,当达到设定时间后,LED灯熄灭。

如此循环,实现LED灯的闪烁。

2. 按键控制LED灯点亮与熄灭实验结果:按下按键,LED灯点亮;再次按下按键,LED灯熄灭。

分析:本实验通过单片机的I/O口控制LED灯的点亮与熄灭。

当按键按下时,单片机将I/O口置为高电平,LED灯点亮;当按键再次按下时,单片机将I/O口置为低电平,LED灯熄灭。

3. 按键控制LED灯亮度调节实验结果:按下按键,LED灯亮度逐渐增加;松开按键,LED灯亮度保持不变。

分析:本实验通过单片机的PWM(脉宽调制)功能实现LED灯亮度的调节。

当按键按下时,单片机调整PWM占空比,使LED灯亮度逐渐增加;松开按键后,PWM占空比保持不变,LED灯亮度保持不变。

51单片机:独立按键与矩阵按键控制数码管

51单片机:独立按键与矩阵按键控制数码管

51单⽚机:独⽴按键与矩阵按键控制数码管⼀,独⽴按键注意⼀下⼏点>按下的时候,电压被拉低,所以IO⼝要传低电平( 0x0 )>按下的时候要消除抖动 ( 延时10ms ),在判断,是否还是低电平,再做业务处理下⾯这段程序,就是通过⼀个独⽴按键连接到p1⼝,控制静态数码管的⼀段进⾏亮和灭的切换。

#include <reg52.h>sbit key_control = P1^0;sbit led = P0^0;typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}void key_press(){if( key_control == 0x0 ) {delay( 1110 );if( key_control == 0x0 ){led = ~led;}while( !key_control );}}void main (){/*while( 1 ){if( key_control == 0x0 ) {delay( 1110 ); //⼤概10msif ( key_control == 0x0 ) {led = 1;}}else if( key_control == 0x1 ) {delay( 1110 );if ( key_control == 0x1 ) {led = 0;}}}*/led = 0;while( 1 ) {key_press();}}⼆,当按键⽐较多的时候,⽤矩阵按钮,因为如果不⽤矩阵按钮,⼀个独⽴按键需要⼀个IO⼝,浪费资源。

如: 16个独⽴按键需要16个io⼝,⽽16个矩阵按键(4x4,⼀共8个管脚)需要8个IO⼝下⾯的程序,通过16个矩阵按钮,控制静态数码管,显⽰0~F#include <reg52.h>#define GPIO_DIG P0 //段选数码管#define GPIO_KEY P1 //矩阵按键typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}u8 key_value;//静态数码管段码u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92,0x82 , 0xF8 , 0x80 , 0x90 , 0x88 , 0x83,0xC6 , 0xA1 , 0x86 , 0x8E};void key_down(){u8 count = 0;//⾏列扫描判断哪个键被按下GPIO_KEY = 0x0F; //⾼四位全部输出低电平,低四位输出⾼电平-->判断被按下的按钮所在的列if( GPIO_KEY != 0x0F ) { //有按键按下delay( 1110 ); //消除抖动if( GPIO_KEY != 0x0F ){switch( GPIO_KEY ){case0x07:key_value = 0; //矩阵第1列的按钮被按下break;case0x0B:key_value = 1; //矩阵第2列的按钮被按下break;case0x0D:key_value = 2; //矩阵第3列的按钮被按下break;case0x0E:key_value = 3; //矩阵第4列的按钮被按下break;}GPIO_KEY = 0xF0; //⾼四位输出⾼电平,低四位输出低电平-->判断被按下的按钮所在的⾏switch( GPIO_KEY ){case0x70:key_value = key_value; //矩阵第1⾏的按钮被按下break;case0xB0:key_value = key_value + 4; //矩阵第2⾏的按钮被按下break;case0xD0:key_value = key_value + 8; //矩阵第3⾏的按钮被按下break;case0xE0:key_value = key_value + 12; //矩阵第4⾏的按钮被按下break;}GPIO_DIG = character[key_value];//如果⼀直按下按键,等待500ms,强制退出while( ( count < 50 ) && ( GPIO_KEY != 0xF0 ) ) {count++;}}}}void main (){while( 1 ) {key_down();}}。

独立按键和矩阵按键

独立按键和矩阵按键

第八章独立按键和‎矩阵按键我们和单片‎机之间进行‎信息交互,主要包含两‎大类,输入设备和‎输出设备。

前边讲的L‎E D 小灯、数码管、点阵都是输‎出设备,这节课我们‎学习一下最‎常用的输入‎设备——按键。

在本节课的‎学习过程中‎我们还会穿‎插介绍一点‎硬件设计的‎基础知识。

8.1 单片机最小‎系统电路解‎析8.1.1 电源我们在学习‎过程中,很多指标都‎是直接用的‎概念指标,比如我们说‎+5V代表1‎,GND代表‎0等等这些‎。

但在实际电‎路中是没有‎这么精准的‎,那这些指标‎允许范围是‎什么呢?随着我们所‎学的内容不‎断增多,大家要慢慢‎培养一种阅‎读手册的能‎力。

比如我们使‎用STC8‎9C52R‎C单片机的‎时候,我们找到他‎的手册的1‎1页,第二个选项‎,工作电压:5.5V-3.4V(5V单片机‎),这个地方就‎说明我们这‎个单片机正‎常的工作电‎压是个范围‎值,只要电源V‎C C在5.5V到3.4V之间都‎可以正常工‎作,电压超过5‎.5V是绝对‎不允许的,会烧坏单片‎机,电压如果低‎于3.4V,单片机不会‎损坏,但是也不能‎正常工作。

而在这个范‎围内,最典型、最常用的电‎压值就是5‎V,这就是后面‎括号里“5V单片机‎”这个名称的‎由来。

除此之外,还有一种常‎用的工作电‎压范围是2‎.7V-3.6V、典型值是3‎.3V的单片‎机,也就是所谓‎的“3.3V单片机‎”了。

日后随着大‎家接触的东‎西慢慢增多‎,对这点会有‎更深刻的理‎解。

现在我们再‎顺便多了解‎一点,大家打开7‎4HC13‎8的数据手‎册,会发现74‎H C138‎手册的第二‎页也有一个‎表格,上边写了7‎4HC13‎8的工作电‎压范围,最小值是4‎.75V,额定值是5‎V,最大值是5‎.25V,可以得知它‎的工作电压‎范围是4.75V-5.25V。

这个地方讲‎这些目的是‎让大家清楚‎的了解,我们获取器‎件工作参数‎的一个最重‎要,也是最权威‎的途径,就是通过器‎件的数据手‎册。

独立键盘工作原理

独立键盘工作原理

独立键盘工作原理
独立键盘是一种不与计算机主板直接连接的外部输入设备,主要用于替换原有键盘或提供更舒适的打字体验。

它通过蓝牙或有线连接与计算机进行通信。

独立键盘工作原理可以分为以下几个方面:
1. 键盘矩阵:独立键盘内部有一个键盘矩阵,该矩阵是键盘上所有按键的布局。

它由多个行和列的导线组成。

每个按键都与矩阵中的一个交叉点相连。

2. 按键扫描:当用户按下一个按键时,键盘会扫描键盘矩阵,检测到相应的按键。

扫描过程通常从一行开始,逐列扫描,直到找到用户按下的按键。

3. 按键编码:在检测到按键后,键盘会将按键的位置编码成一个唯一的数值或代码。

这个编码通常通过USB或蓝牙进行传输给计算机。

4. 数据传输:编码的按键信息通过 USB 或蓝牙协议传输给计算机。

如果键盘使用有线连接,它会直接将编码发送到计算机的主板。

如果键盘使用蓝牙连接,它会将编码通过蓝牙无线传输给计算机。

5. 计算机处理:计算机接收到按键信息后,通过操作系统的驱动程序将编码转换为相应的字符或功能。

这样,用户按下的按键就能在计算机上产生相应的效果。

独立键盘相比于一体键盘,具有更好的灵活性和更多的功能扩展性。

它可以与不同的计算机设备兼容,也可以通过更换键帽、调配按键布局等方式进行个性化定制。

同时,通过采用不同的开关类型,独立键盘还可以提供不同的按键手感和反馈。

单片机C编经典例程(独立、矩阵按键,动、静数码管显示)

单片机C编经典例程(独立、矩阵按键,动、静数码管显示)

独立键盘/****************************************************************************** * 按键控制程序* 连接方法:JP10(P2)与JP1 (LED灯)连接,* JP11(P0)与JP5(按键接口)连接* * 开始点亮P1LED* 按P01 LED向右移一位* * 按P00 LED向左移一位* 连续按动按钮LED会不停的左移或右移******************************************************************************** /#include <reg51.h>#include <intrins.h>unsigned char scan_key();void proc_key(unsigned char key_v);void delayms(unsigned char ms);sbit K1 = P0^0; //对应按钮K1sbit K2 = P0^1; //对应按钮K2main(){unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1){key_s = scan_key();if(key_s != key_v){delayms(10);key_s = scan_key();if(key_s != key_v){key_v = key_s;proc_key(key_v);}}}}unsigned char scan_key(){unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;}void proc_key(unsigned char key_v){if((key_v & 0x01) == 0){P2 = _crol_(P2,1);}else if((key_v & 0x02) == 0){P2 = _cror_(P2, 1);}}void delayms(unsigned char ms) // 延时子程序{unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}矩阵键盘******************************************************************************* *描述: * * 矩阵键盘数码管显示键值** 排线连接方法:JP8(P1)与JP4(矩阵键盘接口)连接P0与JP3(静态数码管)连接* * 矩阵键盘定义:** P1.1-P1.4为列线,P1.4-P1.7为行线* * 喇叭接P1.5口矩阵键盘P1口,* * 注意:请将JP165短路冒断开* ******************************************************************************* #include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar dis_buf; //显示缓存uchar temp;uchar key; //键顺序吗void delay0(uchar x); //x*0.14MS#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};// 此表为LED 的字模unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5 E,~0x79,~0x71};/*************************************************************//* *//* 延时子程序*//* *//*************************************************************/void delay(uchar x){ uchar j;while((x--)!=0){ for(j=0;j<125;j++){;}}}/*************************************************************//* /* 键扫描子程序(4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行*//* P1.1 P1.2 P1.3为列*/*************************************************************/void keyscan(void){ temp = 0;P1=0xF0; //高四位输入行为高电平列为低电平delay(1);temp=P1; //读P1口temp=temp&0xF0; //屏蔽低四位temp=~((temp>>4)|0xF0);if(temp==1) // p1.4 被拉低key=0;else if(temp==2) // p1.5 被拉低key=1;else if(temp==4) // p1.6 被拉低key=2;else if(temp==8) // p1.7 被拉低key=3;elsekey=16;P1=0x0F; //低四位输入列为高电平行为低电平delay(1);temp=P1; //读P1口temp=temp&0x0F;temp=~(temp|0xF0);if(temp==2) // p1.1 被拉低key=key+0;else if(temp==4) // p1.2 被拉低key=key+4;else if(temp==8) // p1.3 被拉低key=key+8;elsekey=16;dis_buf = key; //键值入显示缓存dis_buf = dis_buf & 0x0f;}/*************************************************************//* *//*判断键是否按下*//* *//*************************************************************/void keydown(void){P1=0xF0;if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan(); //调用按键扫描程序}}/*************************************************************//* *//* 主程序*//* *//*************************************************************/main(){P0=0xFF; //置P0口P1=0xFF; //置P1口delay(10); //延时while(1){keydown(); //调用按键判断检测程序P0 = LED7Code[dis_buf%16]&0x7f; //LED7 0x7f为小数点共阴和共阳此处也是不一样; %16表示输出16进制}}/************************************************************/标题: 试验数码管上如何显示数字(共阳极) * 连接方法:P0 与JP3 用8PIN排线连接*请学员认真消化本例程,用单片机脚直接控制数码管* #include <reg51.h>#include <intrins.h>#define NOP() _nop_() /* 定义空指令*/void delay(unsigned int i); //函数声名// 此表为LED 的字模unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5 E,~0x79,~0x71};main(){unsigned int LedNumVal=1 ,C ; //定义变量while(1){if (++C>= 300){ LedNumVal++ ; //每隔300个扫描周期加一次C =0; //每隔300个扫描清零}// 将字模送到P0口显示P0 = LED7Code[LedNumVal%10]&0x7f; //LED7 0x7f为小数点共阴和共阳此处也是不一样;delay(150); //调用延时程序}}/****************************************************************** ** 延时程序** ******************************************************************/void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}*******************************************************************************标题: 试验数码管上显示数字( 单片机直接实现位选共阴极) * * 连接方法:P0与J12 用8PIN排线连接P1与JP16 用排线连接***************************************************************************** 请学员认真消化本例程,用573锁存器控制和单片机脚直接位选控制(非译码器控制)数码管******************************************************************************** #include <reg51.h>#include <intrins.h>void delay(unsigned int i); //函数声名char DelayCNT;//定义变量//此表为LED 的字模, 共阴数码管0-9 -unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制//此表为8个数码管位选控制, 共阴数码管1-8个-unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表的方法控制/************主函数**********************/main(){unsigned int i,LedNumVal=1 ; //变量定义unsigned int LedOut[10]; //变量定义DelayCNT=0;while(1){if(++DelayCNT>=20) //控制数字变化速度{DelayCNT=0; //20个扫描周期清零一次++LedNumVal; //每隔20个扫描周期加一次}LedOut[0]=Disp_Tab[LedNumVal%10000/1000];LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumVal%10];LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位LedOut[7]=Disp_Tab[LedNumVal%10]; //个位for( i=0; i<9; i++){P0 = LedOut[i];P1 = dispbit[i]; //使用查表法进行位选/* switch(i) //使用switch 语句控制位选{case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;} */delay(150); //扫描间隔时间太长会数码管会有闪烁感}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}。

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

第八章独立按键和矩阵按键我们和单片机之间进行信息交互,主要包含两大类,输入设备和输出设备。

前边讲的LED小灯、数码管、点阵都是输出设备,这节课我们学习一下最常用的输入设备——按键。

在本节课的学习过程中我们还会穿插介绍一点硬件设计的基础知识。

8.1 单片机最小系统电路解析8.1.1 电源我们在学习过程中,很多指标都是直接用的概念指标,比如我们说+5V代表1,GND代表0等等这些。

但在实际电路中是没有这么精准的,那这些指标允许范围是什么呢?随着我们所学的内容不断增多,大家要慢慢培养一种阅读手册的能力。

比如我们使用STC89C52RC单片机的时候,我们找到他的手册的11页,第二个选项,工作电压:5.5V-3.4V(5V单片机),这个地方就说明我们这个单片机正常的工作电压是个范围值,只要电源VCC在5.5V到3.4V之间都可以正常工作,电压超过5.5V是绝对不允许的,会烧坏单片机,电压如果低于3.4V,单片机不会损坏,但是也不能正常工作。

而在这个范围内,最典型、最常用的电压值就是5V,这就是后面括号里“5V单片机”这个名称的由来。

除此之外,还有一种常用的工作电压范围是2.7V-3.6V、典型值是3.3V的单片机,也就是所谓的“3.3V单片机”了。

日后随着大家接触的东西慢慢增多,对这点会有更深刻的理解。

现在我们再顺便多了解一点,大家打开74HC138的数据手册,会发现74HC138手册的第二页也有一个表格,上边写了74HC138的工作电压范围,最小值是4.75V,额定值是5V,最大值是5.25V,可以得知它的工作电压范围是4.75V-5.25V。

这个地方讲这些目的是让大家清楚的了解,我们获取器件工作参数的一个最重要,也是最权威的途径,就是通过器件的数据手册。

8.1.2 晶振晶振通常分为无源晶振和有源晶振两种类型,无源晶振一般称之为crystal(晶体),而有源晶振则叫做oscillator(振荡器)。

有源晶振是一个完整的谐振振荡器,他是利用石英晶体的压电效应来起振,所以有源晶振需要供电,当我们把有源晶振电路做好后,不需要外接电路,它就可以主动产生振荡频率,并且可以提供高精度的频率基准,信号质量比无源信号好。

而无源晶振自身无法振荡起来,它需要芯片内部的振荡电路一起工作才能振荡,它允许不同的电压,但是信号质量和精度较有源晶振差一些。

相对价格来说,无源晶振要比有源晶振价格便宜很多。

无源晶振两侧通常都会有两个电容,一般其容值都选在10pF~40pF之间,如果手册中有具体电容大小的要求则要根据要求来选电容,如果手册没有要求,我们用20pF 就是比较好的选择,这是一个长久以来的经验值,具有极其普遍的适用性。

我们来认识下比较常用的两种晶振的样貌,如图8-1和图8-2所示。

图8-1 27Mhz有源晶振图8-2 11.0592M无源晶振有源晶振通常有4个引脚,VCC,GND,晶振输出引脚和一个没有用到的悬空引脚。

无源晶振有2个或3个引脚,如果是3个引脚的话,中间引脚是晶振的外壳,使用时要接到GND,两侧的引脚就是晶体的2个引出脚了,这两个引脚作用是等同的,就像是电阻的2个引脚一样,没有正负之分。

对于无源晶振,就是用我们的单片机上的两个晶振引脚接上去即可,而有源晶振,只接到单片机的晶振的输入引脚上,输出引脚上不需要接,如图8-3和图8-4所示。

关于晶振的更多资料可参考:/dianzi/300.html上面有更深层的原理剖析与详细的分类.图8-3 无源晶振接法图8-4 有源晶振接法8.1.3 复位电路我们先来分析一下我们的复位电路,如图8-5所示。

图8-5 单片机复位电路当这个电路处于稳态时,电容起到隔离直流的作用,隔离了+5V,而左侧的复位按键是弹起状态,下边部分电路就没有电压差的产生,所以按键和电容C11以下部分的电位都是和GND相等的,也就是0V电压。

我们这个单片机是高电平复位,低电平正常工作,所以正常工作的电压是0V电压,完全OK,没有问题。

我们再来分析从没有电到上电的瞬间,电容C11上方是5V电压,下方是0V电压,根据我们初中所学的知识,这个时候电容C11要进行充电,正离子从上往下充电,负电子从GND往上充电,这个时候电容对电路来说相当于一根导线,全部电压都加在了R31这个电阻上,那么RST端口位置是+5V电压,随着电容充电越来越多,即将充满的时候,电流会越来越小,那RST端口上的电压值等于电流乘以R31的阻值,也就会越来越小,一直到电容完全充满后,线路上不再有电流,这个时候RST和GND的电位就相等了也就是0V了。

从这个过程上来看,我们加上这个电路,单片机系统上电后,RST引脚会先保持一小段时间的高电平而后变成低电平,这个过程就是上电复位的过程。

那这个“一小段时间”到底是多少才合适呢?每种单片机不完全一样,51单片机手册里写的是持续时间不少于2个机器周期的时间。

复位电压值,每种单片机不完全一样,我们按照通常值0.7Vcc作为复位电压值,复位时间的计算过程比较复杂,我这里只给大家一个结论,时间t=1.2RC,我们用的R是4700,C是0.0000001,那计算得知t是564us,远远大于2个机器周期(2us),在电路设计的时候一般留够余量就行。

按键复位(即手动复位)有2个过程,按下按键之前,RST的电压值是0V,当按下按键后电路导通,同时电容也会在瞬间进行放电,RST电压值变化为4700Vcc/(4700+18),会处于高电平复位状态。

当松开按键后就和上电复位类似了,先是电容充电,后电流逐渐减小直到RST电压变0V的过程。

我们按下按键的时间通常都会有上百毫秒,这个时间足够复位了。

按下按键的瞬间,电容两端的5V电压(注意不是电源的5V和GND之间)会被直接接通,此刻会有一个瞬间的大电流冲击,会在局部范围内产生电磁干扰,为了抑制这个大电流所引起的干扰,我们这里在电容放电回路中串入一个18欧的电阻来限流。

如果有的同学已经开始DIY设计自己的电路板的时候,那单片机最小系统的设计现在已经有了足够的理论依据了,可以考虑尝试了。

如在制作过程有有问题可到:单片机论坛/bbs/求助作者会不定期回复的,基础比较薄弱的同学先不要着急,继续跟着往下学,把课程都学完了再动手操作也不迟,磨刀不误砍柴工。

8.2 函数的调用随着我们编程的程序量的增多,如果把所有的语句都写到main函数中,一方面程序会写的比较乱,另外一个方面,当我们一个功能需要多次执行的时候,我们就得不断重复写语句,这个时候,就引入了函数调用的概念。

一个程序一般由若干个子程序模块组成,一个模块实现一个特定的功能,在C语言中,这个模块就用函数来表示。

一个C程序一般由一个主函数和若干个其他函数构成。

主函数可以调用其他函数,其他函数也可以相互调用,但其它函数不能调用主函数。

在我们的51单片机程序中,还有中断服务函数,是当相应的中断到来后自动调用执行的,不需要也不能由其他函数调用。

函数调用的一般形式是:函数名(实参列表)函数名就是需要调用的函数的名称,实参列表就是根据实际调用函数要传递给被调用函数的参数列表,不需要传递参数的只加括号就可以,传递多个参数时要用逗号隔开。

在这里我以上节课的点阵I❤U的纵向移动的程序改动一下,大家先了解一下基本的函数调用。

另外,大家不要偷懒,一定把这个程序抄下来做一下实验加深一下自己的印象。

#include <reg52.h>sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned char code graph[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};unsigned char index = 0; //图片刷新索引void refresh(); //函数声明void main(){P0 = 0xFF; //P0口初始化ADDR3 = 0; //选择LED点阵ENLED = 0; //LED显示总使能TMOD = 0x01; //设置定时器0为模式1TH0 = 0xFC; //定时器初值,定时1msTL0 = 0x67;TR0 = 1; //打开定时器0ET0 = 1; //使能定时器0中断EA = 1; //打开总中断开关while(1);}void refresh(){static unsigned char j = 0;P0 = 0xFF; //LED点阵动态刷新switch (j){case 0: ADDR0=0; ADDR1=0; ADDR2=0; break; case 1: ADDR0=1; ADDR1=0; ADDR2=0; break; case 2: ADDR0=0; ADDR1=1; ADDR2=0; break; case 3: ADDR0=1; ADDR1=1; ADDR2=0; break; case 4: ADDR0=0; ADDR1=0; ADDR2=1; break; case 5: ADDR0=1; ADDR1=0; ADDR2=1; break; case 6: ADDR0=0; ADDR1=1; ADDR2=1; break; case 7: ADDR0=1; ADDR1=1; ADDR2=1; break; default: break;}P0 = graph[index+j];j++;if (j >= 8){j = 0;}}void InterruptTimer0() interrupt 1{static unsigned char tmr = 0;TH0 = 0xFC; //溢出后进入中断重新赋值TL0 = 0x67;refresh(); //函数调用tmr++; //图片刷新频率控制if (tmr >= 250) //每隔250ms刷新一帧{tmr = 0;index++;if (index >= 32){index = 0;}}}这个程序是对函数的简单调用,但是有以下三个细节需要大家注意一下:1、函数调用的时候,不需要加函数类型。

在中断函数内调用刷新函数的时候我们只写了refresh(); 而没有加void。

2、调用函数与被调用函数的位置关系,C语言规定:函数在被调用之前,必须先被定时或声明。

相关文档
最新文档