您的位置:首页 > 财经 > 产业 > 赣州今日网络科技有限公司_衢州网站设计制作_搜索指数在线查询_英文网站推广

赣州今日网络科技有限公司_衢州网站设计制作_搜索指数在线查询_英文网站推广

2025/3/3 17:58:38 来源:https://blog.csdn.net/m0_61712829/article/details/145964596  浏览:    关键词:赣州今日网络科技有限公司_衢州网站设计制作_搜索指数在线查询_英文网站推广
赣州今日网络科技有限公司_衢州网站设计制作_搜索指数在线查询_英文网站推广

本文围绕51单片机开发中的独立按键控制技术展开,系统讲解其硬件结构、电平检测原理与C51编程实现方法。文章从开发板独立按键的物理构造与电路连接入手,剖析按键按下与松开时的电平变化规律,并结合单片机I/O口寄存器操作原理,阐释如何通过代码读取按键状态。

目录

一、独立按键相关内容

二、C51 数据运算与基本语句


一、独立按键相关内容

本节要讲的是独立按键。在开发板上,独立按键位于左下角标注 “独立键盘” 处,是四个黑色的按键,右边是 4*4 的矩阵键盘,将在后续讲解,本节仅聚焦于这四个按键。

本章(P3)要实现的代码功能如下:

其一,K1 控制第一个 LED 的亮灭,按下时 LED 亮,松开时熄灭;

其二,K1 控制第一个 LED,按下时无操作,松手时控制 LED 状态取反,即按一下亮,再按一下灭;其三,按一下 K1,实现 8 个 LED 进行二进制递增显示;

其四,按 K1 时,第一个 LED 产生移位,按 K2 时 LED 向右移,按 K1 时向左移。

下面先介绍按键。开发板上使用的是四个角的轻触按键,其相当于电子开关,按下时接通,松开时断开。内部由金属弹片实现通断。按键有四个引脚,为了解其连接方式,可将按键拆开,内部主要有底座、鼓起来的金属弹片(按下变平,松手恢复)、按键头和金属盖。进一步破拆下面部分,能看出相同一边的两个引脚内部由金属片完全连接,无论是否按下都导通,且向外伸出接触点。金属弹片在中间,松手时不接触,按下时弹片被压扁,使三个接触点连接。即按下时 4 个引脚全部连接,松手时两边分别连接,中间断开。

接着看开发板原理图中键盘的连接方式。独立按键在原理图右下角,只画了两个引脚,按下连接,松开断开。

左边有四个按键,其公共一端都接到 GND(电源负极),另一端引出四个编号 。这些编号连接到 MCU ,即一端接 GND,另一端接 I/O 口。

单片机上电时,所有 I/O 口默认是高电平,若按键未按下,I/O 口保持高电平;按下则变为低电平。

单片机的寄存器可向 I/O 口写值,也能检测 I/O 口电平并读回寄存器。通过读取寄存器的值,若为高电平(1)表示按键松开,若为低电平(0)则表示按键按下。

————————

下面进行工程演示。新建工程,点击 “Project”,选择保存位置并新建文件夹 “3 - 1 独立按键控制 LED 亮灭”,起工程名,选择器件 AT89C52,添加一个.c 文件。

先写出上节点亮 LED 的代码,添加头文件和主函数,上节点亮 LED 代码为 “P2 = 0xfe”,其中 “0x” 是十六进制前缀,“fe” 转化为二进制是最低位为 0,其他位为 1。

勾选生成 HEX 文件

将 tab 缩进调成 4 个

编译无错误无警告后下载代码,可看到 LED 点亮,这是通过控制寄存器实现的。

寄存器 8 个为一组,直接操作 P2 需同时给 8 位赋值,若只想操作最低位,可利用头文件中的位寄存器。添加 “” 头文件,操作 “P2_0”(表示 P2 的最低位),赋值 “P2_0 = 0” 可点亮 LED,赋值 “P2_0 = 1” (非0即1,给2也是1)则熄灭。

第一个按键控制功能的实现:按下点亮,松开熄灭。利用 C 语言的 if 语句,K1 连接在 P31 口,若 “P31 == 0”(判断相等),表示按键按下,执行点亮 LED 的代码;若 “P31 != 0”,表示按键松开,执行熄灭 LED 的代码。需注意,if 语句要放在 while 循环里,否则代码可能只执行一遍,无法实现预期功能。

完整代码如下:

#includevoid main(){while(1){if(P3_1==0 || P3_0==0) //如果K1按键或K2按键按下{P2_0=0; //LED1输出0,点亮}else{P2_0=1; //LED1输出1,熄灭}}}

二、C51 数据运算与基本语句

C51 是 C 语言在 51 单片机上的应用,其中的数据运算和基本语句是单片机编程常用的干货内容。上节介绍了进制转换和 C51 数据类型,数据类型像小盒子用来装数据,如整型只能装整数,有符号整型可装负数但表示范围有一半用于表示负数,无符号整型只能装正整数。

数据运算可分为四类:

  1. 算术运算:包括加减乘除和取余。加减乘除与常规数学运算类似,但整数除法会丢失小数部分。例如 “int a = 5, b = 2, c; c = a /b;” 执行后,c 的值为 2。取余运算符用于获取除法运算中的余数,如 “c = 5 % 2;” 执行后,c 的值为 1。取余运算可用于判断一个数能否被另一个数整除,若 “123 % 10 == 0”,则 123 能被 10 整除,否则不能。赋值运算符 “=” 是将右边的结果赋给左边的变量,不能用于解方程。
  2. 判断运算:判断运算符包括 “==”(等于)、“>”(大于)、“>=”(大于等于)、“ 1” 和 “2 >= 1” 的判断条件都成立。
  3. 逻辑运算:基本逻辑运算有与(&&)、或(||)、非(!)。例如 “if (P3_1 == 0 && P3_0 == 0)” 表示 K1 和 K2 同时按下时执行相应操作;若改为 “if (P3_1 == 0 || P3_0 == 0)”,则只要 K1 或 K2 任意一个按下就会执行操作。
  4. 位运算:在单片机中应用广泛,包括按位左移(>)、按位与(&)、按位或(|)、按位异或(^)和按位取反(~)。按位左移是将数据的各二进制位向左移动,高位溢出,低位补 0;按位右移则相反,低位溢出,高位补 0。按位与是对两个数据的对应位进行逻辑与操作,全真才为真;按位或是有 1 即为 1;按位异或是对应位不同为 1,相同为 0;按位取反是将数据的每一位取反,0 变 1,1 变 0。

————————

C51 基本语句主要有 if、while、for 和 switch 四种,其中 if 和 switch 用于选择,for 和 while 用于循环。

  1. if 语句:格式为 “if (逻辑表达式) {语句体 1} else {语句体 2}”,若逻辑表达式成立,执行语句体 1,否则执行语句体 2,else 部分可省略。
  2. while 循环:若逻辑表达式成立,执行循环体,执行完后再次判断逻辑表达式是否成立,若成立则继续执行,直到表达式不成立跳出循环。例如 “while (1)”,由于 1 永远为真,会不断循环执行循环体内容。
  3. for 循环:格式为 “for (初始化;逻辑表达式;更改条件) {循环体}”。先执行初始化语句,再判断逻辑表达式,若成立则执行循环体,执行完循环体后执行更改条件,然后再次判断逻辑表达式,直到表达式不成立跳出循环。初始化语句只执行一次,逻辑表达式、循环体和更改条件可能会被多次执行。例如 “for (int i = 0; i < 8; i++)” 会循环 8 次,每次循环中 i 的值从 0 递增到 7。
  4. switch case 语句:用于多重判断,格式为 “switch (变量) {case 常量 1: 语句体 1; break; case 常量 2: 语句体 2; break; … default: 语句体;break;}”。将变量与 case 后的常量一一比较,若相等则执行相应语句体,若所有常量都不相等,则执行 default 后的语句体,default 部分可省略。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com