开发板上LED灯相关的电路图

这是P2相关7个引脚的电路图,在默认情况下它是直接接着VCC的,即默认为高电平。

可以看到,8个LED灯分别是和单片机上P20~P27这8个引脚联系起来的,即一端是VCC,另一端是单片机上的端口,这样我们只需要将引脚端电平置为低电平即可将对应的LED点亮。

点灯

这里我们尝试先点亮从左到右数第一个LED灯,从电路图上看我们只需要将P20引脚的输出置为0(即设为低电平)即可,代码如下:

#include<REG52.H>

sbit led = P2^0;

int main() {
while (1) {
led = 0;
}
}

代码说明:首先我们需要引入单片机的头文件REG52.H,里面包含了许多寄存器的地址:

我们可以使用类似sbit led = P2^0;来指定P2寄存器的某一位,例如这里我们指定P2寄存器的第一个bit。然后我们在main函数中将其的值设置为0,即可看到第一个LED灯点亮:

LED闪烁

我们先设置一个延时函数deley()

void deley(u16 x) {
while (x--) {}
}

即在这里面一直执行x--操作,按照这个型号单片机的执行速度,大概一个基本语句的执行为10μs,则若输入参数为x,则该函数可以延时\(10μs*x=x*10^{-5}s\),故若我们希望延时0.5s,我们需要填入50000。

代码(约1s闪烁一次):

#include<REG52.H>

typedef unsigned int u16;
typedef unsigned char u8; sbit led = P2^0; void deley(u16 x) {
while (x--) {}
} int main() {
while (1) {
led = 0;
deley(50000);
led = 1;
deley(50000);
}
}

运行结果:

tips: 推荐一个GIF制作网站:https://www.tutieshi.com/video/,免费制作GIF,为良心网站点赞!

LED流水灯

#include<REG52.H>
#include<INTRINS.H> typedef unsigned int u16;
typedef unsigned char u8; #define LED P2 void deley(u16 x) {
while (x--) {}
} void defaultDeley() {
deley(50000);
} int main() {
u8 i = 0;
LED = 0xfe; // 1111 1110
defaultDeley();
while (1) {
for(i=0;i<7;i++){
LED = LED << 1;
LED+=1;
defaultDeley();
}
// 0111 1111
for(i=0;i<7;i++){
LED >>= 1;
LED+=0x80;
defaultDeley();
}
// 1111 1110
}
}

这里我们直接操作P2寄存器,我们希望一开始第一个灯点亮,因此设置P2的值为0b1111 1110,即0xfe,然后我们可以进行移位操作使0位不断变化,即:

1111 1110

1111 1101

1111 1011

...

所以循环的代码应为:

LED <<= 1;
LED += 1;

这样即可实现向左点灯。

向右点灯也是类似的,循环代码为:

LED >>= 1;
LED+=0x80;

于是这样就完全实现了流水灯。

运行效果:



(后面还有几秒钟,但GIF要超过csdn的限定大小了。。。)

其他效果

灯光二进制计数器

核心代码:

int main() {
u8 full = 0xff;
u8 cnt;
while (1) {
cnt = -1;
while (1) {
// cnt: 0000 0000 -> 0000 0001
// LED: 1111 1111 -> 1111 1110
cnt +=1;
LED = full - cnt;
defaultDeley();
if (cnt == 0xff) {
break;
}
}
}
}

思路是让一个变量从0开始计数到0xff,LED对应的bit是0发光1熄灭的,这刚好是和我们的计数变量的二进制位模式相反,因此使用LED = 0xff - cnt进行取反,进而使LED显示与计数变量的变化对应起来。

运行效果:



但是此时的灯光计数器最低位在最左边,看起来不太舒服,因此希望修改最低位在最右边

那么我们仍然使用cnt作为计数变量,它将从0x00变化到0xff,然后我们再思考建立cnt到LED的映射关系:

看前面的变化规律:

cnt: 0000 0000 -> 0000 0001 -> 0000 0010

LED: 1111 1111 -> 0111 1111 -> 1011 1111

可以发现,LED的值应为cnt的二进制位模式反转后的补码,

LED = 0xff - reverse(cnt);

这样,我们很容易就可以写出控制代码:

int main() {
u8 full = 0xff;
u8 cnt = 0;
while (1) {
cnt = -1;
while (1) {
// cnt: 0000 0000 -> 0000 0001 -> 0000 0010
// LED: 1111 1111 -> 0111 1111 -> 1011 1111
// LED = full - (reverse(cnt));
cnt +=1;
LED = full - (reverse(cnt));;
defaultDeley();
if (cnt == 0xff) {
break;
}
}
}
}

其中二进制位模式的翻转函数为(输入一个数,返回它二进制位模式反转值):

u8 reverse(u8 x) {
int cnt = 8;
int res = 0;
while (cnt--) {
res <<= 1;
res += x % 2;
x >>= 1;
}
return res;
}

运行效果:

进阶版流水灯

效果:



思路:原来的最基本的流水灯部分我们已经建立了bit为1时对应的灯亮的映射,即LED = 0xff - val;,然后为了实现这个效果,我们的val变量的变化情况应该如下所示:

0000 0000
0000 0001
0000 0010
...
1000 0000
1000 0001
1000 0010
...
...
1111 1111

这样我们操作时可以看做是两个变化的东西,一个是左边的“1”,代表已经到达终点的1,另一个是右边不断左移的“1”,因此这两个部分可以放在两个变量中分别存储,这里设为leftPart和rightPart。

这样我们设计外层循环中leftPart每次的变化为:leftPart>>=1; leftPart+=0x80;,而内层循环中rightPart变化,为:rightPart<<=1;,且循环次数用变量leftMoveTimes进行存储,一开始值为7,代表可以左移7次,然后每次外循环后-=1。

核心代码:

void showAndDeley(u8 res) {
LED = 0xff - res;
defaultDeley();
} int main() {
u8 rightPart , res, i;
u8 leftMoveTimes;
u8 leftPart;
start:
LED = 0xff; leftPart = 0;
leftMoveTimes = 7;
rightPart = 0;
res = leftPart | rightPart ;
showAndDeley(res);
while (1) { // 外循环
rightPart = 1;
res = leftPart | rightPart ;
showAndDeley(res);
for(i = 0; i< leftMoveTimes; i++){ // 内循环
rightPart <<= 1;
res = leftPart | rightPart ;
showAndDeley(res);
}
if (leftMoveTimes ==0) {
goto start; // 重新开始运行
}
leftPart>>=1;
leftPart+=0x80;
leftMoveTimes--;
}
}

单片机学习(二)开发板LED灯的控制的更多相关文章

  1. 学习嵌入式开发板的Android平台体系结构和源码结构

    本文转自迅为论坛资料:http://www.topeetboard.com 推荐学习嵌入式开发板平台:iTOP-4412开发板 下面这张图出自Google官方,展示了Android系统的主要组成部分. ...

  2. 如何选择单片机和Android-LInux-ARM开发板?

    源: 如何选择单片机和Android-LInux-ARM开发板?

  3. 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯

    关于单片机型号的介绍: STC89C52RC40C-PDIP 0721CV4336..... STC:STC公司 89:89系列 C:COMS 52(还有51,54,55,58,516,):2表示存储 ...

  4. RK3399 友善NanoPC-T4开发板使用sysfs方法控制status LED状态灯-【申嵌视频-RK3399篇】

    实验1:sysfs 操作方法控制NanoPC-T4开发板上LED灯 (status LED状态灯:GPIO0_B5/LED1_OUT)root@NanoPC-T4: cd /sys/class/led ...

  5. Visual Studio 2022 开发 STM32 单片机 - 环境搭建点亮LED灯

    安装VS2022社区版软件 选择基础的功能就好 安装VisualGDB软件(CSDN资源) 按照提示一步一步安装就好 VisualGDB激活软件(CSDN资源) 将如下软件放在VisualGDB的安装 ...

  6. s3c6410开发板LED驱动程序设计详细…

    2 下面来看看tiny6410关于LED的原理图如图(1)所示: 图1    LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c ...

  7. [学习嵌入式开发板]iTOP-4412实现NFS网络文件系统

    本文转自迅为:http://www.topeetboard.com 学习平台:iTOP-4412开发板 本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统. 我们使用的软硬件环境是 ...

  8. 学习itop4412开发板有哪些资料可学习?能否学会

    1.光盘资料 下面简单的做一下了解,在需要使用这些资料的时候,会针对性的做详细介绍. 将文件以及文件夹按照“名称+递增”的方式排列,如下: 01_PCB_SCH_DATASHEET-- -----开发 ...

  9. 学习4412开发板gdb和gdbserver的调试

    因为有很多的小伙伴是从单片机转过来的,用惯了单片机上的JLINK调试程序,换到Linux上非常的不习惯.确实,如果能设置断点,单步调试,查看变量,那确实是太爽了,那么在我们的Linux可以做到吗,答案 ...

随机推荐

  1. MySQL—Dos命令操作数据库

    MySQL 是一个关系型数据库,存在表的概念 结构,数据库可以存放多张表,每个表可以存放多个字段,每个字段可以存放多个记录 Dos命令操作数据库 PhpStudy使用终端打开数据库 第一次打开默认的密 ...

  2. Salesforce LWC学习(三十五) 使用 REST API实现不写Apex的批量创建/更新数据

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.224.0.api_rest.meta/api_rest/resources_compo ...

  3. Pandas高级教程之:统计方法

    目录 简介 变动百分百 Covariance协方差 Correlation相关系数 rank等级 简介 数据分析中经常会用到很多统计类的方法,本文将会介绍Pandas中使用到的统计方法. 变动百分百 ...

  4. 《PHP设计模式大全》系列分享专栏

    <PHP设计模式大全>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第 ...

  5. PHP大文件分片上传的实现方法

    一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识 ...

  6. 开发必备linux命令大全-稳赚不亏

    我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...

  7. c++中的继承关系

    1 什么是继承 面向对象的继承关系指类之间的父子关系.用类图表示如下: 2 为什么要有继承?/ 继承的意义? 因为继承是面向对象中代码复用的一种手段.通过继承,可以获取父类的所有功能,也可以在子类中重 ...

  8. CentOS 7 文件权限之访问控制列表(ACL)

    Linux的ACL是文件权限访问的一种手段.当拥有者所属组其他人(own,group,other)不能满足给一个单独的用户设置单独的权限时,ACL的出现就很好的解决了该问题. 比如其他用户own,不属 ...

  9. Datax环境搭建

    Datax是一个在异构的数据库/文件系统之间高速交换数据的工具,本次搭建Datax环境,需要说明以下,我的jdk版本是1.7的,所以需要对jdk继续升级. 一.环境准备 软件环境:CentOS 6 系 ...

  10. 12、Java——异常

    ​  1.异常处理方案: 异常抛出 : throws 把异常抛出到上一层,谁调用谁解决 异常捕获 : try..catch try{ 有可能出现异常的代码; }catch(FileNotFoundEx ...