独立按键和矩阵按键

合集下载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

独立式键盘与矩阵键盘原理逐行扫描法与行列互换法 键盘编码器芯片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. 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语言规定:函数在被调用之前,必须先被定时或声明。

相关文档
最新文档