手把手教你学51单片机:函数进阶与按键

发布者:Yinyue1314最新更新时间:2021-11-29 来源: eefocus关键字:51单片机  按键 手机看文章 扫描二维码
随时随地手机看文章

一、单片机最小系统

单片机最小系统由电源、晶振、复位电路组成。


(1)常见的电源电压值是5v,工作电压典型值是3.3v。


(2)晶振通常为无源晶振和有源晶振两种。


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


无源晶振自身无法振荡起来,它需要芯片内部的振荡电路一起工作才能震荡,它允许不同的电压,但是信号质量和精度较有源晶振差一些。无缘晶振两侧通常会有两个电容,一般容值都在10~40pf,常用20pf。


(3)复位电路


KST-51电路板中,电路稳定时,电容起隔离直流作用,且是高电平复位,低电平正常工作。

二、函数的调用

函数调用的一般形式是:


函数名(实参列表)


(1)函数调用时不需要加函数类型。


(2)函数被调用之前必须先被定义或声明。编程规范:一般推荐main函数写在最前面,然后定义各个功能函数,而中断函数一般写在最后。在文件开头所有函数之前,开辟一块区域叫做函数声明区,用来把被调用的函数声明一下。


(3)函数声明时必须加函数类型,函数的形式参数,最后加上一个分号表示结束。


三、函数的形式参数和实际参数

在调用一个有参数的函数时,函数名后边括号中的参数叫做实际参数,简称实参。


被调用的函数在进行定义时,括号里的参数叫做形式参数,简称形参。


1、函数定义中指定的形参,在未发生函数调用时不占内存,只有函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放,形参是局部变量。

2、实参可以是常量,也可以是简单或者复杂的表达式,但是要求他们必须有确定的值,在调用发生时将实参的值传递给形参。

3、形参必须要指定数据类型,和定义变量一样,因为它本来就是局部变量。

4、实参和形参的数据类型应该相同或者赋值兼容。和变量赋值一样,当形参和实参出现不同类型时,则按照不同类型数值的赋值规则进行转换。

5、主调函数在调用函数之前,应对被调函数做原型声明。

6、实参向形参的数据传递是单向传递,不能由形参再回传给实参。也就是说,实参值传递给形参后,调用结束,形参单元被释放,而实参单元仍保留并且维持原值。


四、按键

4.1独立按键

独立按键原理图如上,通过检测 KeyIn管教的电平从而判断按键是否按下。

大部分单片机的IO口均是使用MOS管而非三极管,但两者原理类似。图中方框内指单片机电路部分,方框外的就是上拉电阻和按键。需要读取外部数据是需要先给该引脚写“1”,这样才能读取到外部按键信号。


当内部输出是个低电平,经过一个反相器变成高电平,NPN 三极管导通,那么单片机的内部 IO 口就是个低电平,这个时候,外部虽然也有上拉电阻的存在,但是两个电阻是并联关系,不管按键是否按下,单片机的 IO 口上输入到单片机内部的状态都是低电平,我们就无法正常读取到按键的状态了。


从上面的分析就可以得出一个结论,这种具有上拉的准双向 IO 口,如果要正常读取外部信号的状态,必须首先得保证自己内部输出的是 1,如果内部输出 0,则无论外部信号是 1还是 0,这个引脚读进来的都是 0。


4.2 矩阵按键

把矩阵按键当作独立按键进行检测。比如令Keyout1为低电平, Keyout2、Keyout3、Keyout4均为高电平,就相当于把矩阵按键的第一行当作独立按键来检测。


4.3 按键消抖

(1)延时:检测到按键状态变化后,先等待一个10ms 的延时,抖动消失后再进行一次按键状态监测,如果与之前检测状态相同,就可以确认按键已经稳定动作了。


程序中间加了这种 delay 延时操作后,很可能某一事件发生了,但是我们程序还在进行 delay 延时操作中,当这个事件发生完了,程序还在 delay 操作中,当我们 delay 完事再去检查的时候,已经晚了,已经检测不到那个事件了。为了避免这种情况的发生,我们要尽量缩短 while(1)循环一次所用的时间,而需要进行长时间延时的操作,必须想其它的办法来处理。


(2)用定时中断检测同一状态的次数


我们启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段

关键字:51单片机  按键 引用地址:手把手教你学51单片机:函数进阶与按键

上一篇:KST-51单片机:c语言编程实现数码管动态显示秒表的倒计时
下一篇:KST51单片机:通过中断实现矩阵按键的次数检测与消抖

推荐阅读最新更新时间:2024-11-10 10:25

51单片机计时器实现1000以内的计数功能
#include reg51.h #include intrins.h unsigned char code LED7Code = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0-9字模 0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极7段数码管A-F字模,原来的是错误的. unsigned char num,temp; unsigned int a, b,c; void system_init() { EA=1; //开中断总开关 ET0=1;//加一行,开定时器T0中断 TMOD=0x01; //定时
[单片机]
【STM32】GPIO输入—按键检测
2.1硬件设计 弹性按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一 下子断开,使用按键时会产生如图带波纹信号,需要用软件消抖处理滤波,不方便输入检测。当然有专用的去抖电路,也有专用的去抖芯片,但通常我们用软件延时的方法就能解决抖动问题,没有必要添加多余的硬件电路。 2.2软件设计 同 LED 的工程,为了使工程更加有条理,我们把按键相关的代码独立分开存储,方便 以后移植。在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,这些文件也可根 据您的喜好命名,这些文件不属于 STM32标准库的内容,是由我们自己根据应用需要编写 的。 2.2.1编程要点 使能 GPIO端口时钟;
[单片机]
【STM32】GPIO输入—<font color='red'>按键</font>检测
51单片机学习笔记5 -- 外部中断
1.外部中断概念 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。 2.引脚功能复用 51单片机芯片内部有很多外设,这些外设的引脚都是与IO口复用的。也就是说,一个IO口如果可以复用为内置外设的功能引脚,那么当这个IO口作为内部外设使用的时候,就叫做复用(一般来说,当某个引脚作为复用功能使用时,它将不能作为其他复用功能和普通IO来使用,即单个引脚只能作为普通IO或单个复用功能来使用)。 51单片机也有引脚具备复用功能,如下图P3端口的引脚可复用成串口收发或外部中断 3.中
[单片机]
<font color='red'>51单片机</font>学习笔记5 -- 外部中断
C51单片机指针变量的定义及应用
一。 指针变量的定义 指针变量定义与一般变量的定义类似,其形式如下: 数据类型 [存储器类型1] * [存储器类型2] 标识符; [存储器类型1] 表示被定义为基于存储器的指针。无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下: 存储类型IIdata/data/bdataxdatapdataCode编码值0x000x010xFE0xFF [存储类型2]用于指定指针本身的存储器空间。 1、 char * c_ptr; int *
[单片机]
C<font color='red'>51单片机</font>指针变量的定义及应用
51单片机的内存映射(一)
本文主要讲述51单片机RAM部分的内存映射,其内存空间如下图所示: 51单片机内部有256个字节的RAM空间,低128个字节为工作寄存器组区(0x00H-0x1FH)、位寻址区(0x02H-0x2FH)、通用RAM区(0x30H-0x70H),SFR寄存区(0x80-0xFF)这段空间定义51单片机所有的控制寄存器和状态寄存器。下面我们就以上图中自底向上的顺序逐一介绍一下各区的功能以及访问方法。 工作寄存器区 工作寄存器区为R0-R7,它们各为1个字节,但51单片机一共有4组工作寄存器,单片机在工作过程中只能有一组工作寄存器工作。各个工作寄存器的地址以及工作寄存器组的选择如下图所示: 工作寄存器的功
[单片机]
<font color='red'>51单片机</font>的内存映射(一)
技术科:你知道51单片机如何存储程序吗
MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。 好,说回MCS-51。 对于程序存储器,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内4k ROM的话,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0
[单片机]
技术科:你知道<font color='red'>51单片机</font>如何存储程序吗
51单片机中使用ucos ii的优缺点
引言   早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。但直到最近,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时处理的领域所曰益显现的重要性吸引了人们越来越多的注意力。但是,人们所谈论的往往是一些著名的商业内核,诸如VxWorks、PSOS等。这些商业内核性能优越,但价格昂贵,主要用于16位和32位处理器中,针对国内大部分用户使用的51系列8位单片机,可以选择免费的ucos ii。 ucos ii的特点   1.ucos ii是由Labrosse先生编写的一个开放式内核,最主要的特点就是源码公开。这一点对于用户来说可谓利弊各半,好处在于,一方面它是免费的,另一方面用户可以根据自己的需要对它进行修改。
[单片机]
基于stc51单片机的PS\2键盘通信程序
PS2键盘通信(只写了接收部分因为按键码太多译码可以根据需要选择性翻译) #include //STC12C5AxxS2系列单片机头文件 #include//包函_nop_延时函数的头文件 #define uchar unsigned char//宏定义 #define uint unsigned int//宏定义 //------------------------------------------------------------------------------------- //全局声明部分 sbit CLK=P3^2; //时钟线 sbit DATA=P1^0; //数据线 sbit LED_zs=P0^0; //运
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved