文章目录

  • 开发板上LED灯相关的电路图
  • 点灯
  • LED闪烁
  • LED流水灯
  • 其他效果
    • 灯光二进制计数器
    • 进阶版流水灯

开发板上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−5s10μs*x=x*10^{-5}s10μs∗x=x∗10−5s,故若我们希望延时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 P2void deley(u16 x) {while (x--) {}
}void defaultDeley() {deley(50000);
}int main() {u8 i = 0;LED = 0xfe;     // 1111 1110defaultDeley();while (1) {for(i=0;i<7;i++){LED = LED << 1;LED+=1;defaultDeley();}// 0111 1111for(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 1110cnt +=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. Tiny4412开发板 LED灯的控制

    exynos4412裸版控制led灯. 1.查看电路图. 2.查看4412手册.找到对应的寄存器. 3.配置对应的寄存器. 一.再开发板上我们的外部设备led,在核心板.所以我们需要打开核心板电路图. ...

  2. tiny4412开发板LED灯驱动写法

    简介 led灯成本很低,操控简单,在嵌入式产品中不可或缺,可以作为调试标识,状态指示等等,高级用法还可以作为呼吸灯进一步增强其美观性.本章介绍只控制led灯的亮灭,tiny4412开发板有四个LED灯 ...

  3. [ESP32/ESP8266专题笔记-6] ESP8266开发板-Micropython-WS2812灯的控制

    WS2812全彩LED简介 所谓基于WS2812B的LED灯珠,就是将一个控制芯片封装进全彩LED灯珠中,配合单独的通信协议可以实现对单个灯的全彩控制 WS2812 全彩LED灯珠封装实物图 WS28 ...

  4. 三,天猫精灵SDK驱动开发板LED

    1,启动流程: bootload->main(8710SDK)->aosmaintask->application->application_start 创建项目出现如下错误: ...

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

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

  6. c语言c51单片机点亮8个灯,单片机课程设计-8个LED灯来回点亮

    <单片机课程设计-8个LED灯来回点亮>由会员分享,可在线阅读,更多相关<单片机课程设计-8个LED灯来回点亮(20页珍藏版)>请在人人文库网上搜索. 1.目录第一章 绪论-3 ...

  7. S3C6410开发板LED驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...

  8. 瑞萨RA2L1开发板流水灯

    瑞萨RA2L1开发板流水灯 概述 硬件 开发环境 创建项目 配置GPIO 代码 调试结果演示 概述 正如编写普通程序中的第一个helloworld程序一样,单片机里第一个入门程序自然是点个灯.前几天得 ...

  9. 学习用树莓派驱动LED灯闪烁

    学习用树莓派驱动LED灯闪烁 [前沿] ·认识GPIO编码 ·准备实验材料 ·实验电路连接 ·编写驱动程序 ·讲解其它的驱动方式(扩展篇) [实际操作] 一.认识GPIO编码 学习如何用树莓派驱动LE ...

最新文章

  1. Openshift创建Router和Registry
  2. C# 动态调用WebService
  3. 数据库入门浅析:ASP.NET与MySQL连接
  4. 2017年会是Serverless爆发之年吗?
  5. 启动mysql 1067_启动mysql遇到1067问题
  6. 面试必会之LinkedList源码分析
  7. 嵌入式转linux服务器,嵌入式Linux中的Web服务器应用
  8. Gstreamer调试命令(五)
  9. python中求2-1000的完数_C++求2→1000之间的完数。
  10. python 对象是什么概念
  11. 微信小程序用自己的服务器视频打开很慢,微信小程序视频播放加载很慢
  12. 2020.10期权合约产品研究报告 | TokenInsight
  13. 《MLB棒球创造营》:走近棒球运动·纽约扬基队
  14. 【更改google chrome浏览器路径的方法】
  15. C#中汉字按照首字拼音排序
  16. 【SmartDental】小组第一次会议纪要
  17. flashfxp中文下载,5步掌握flashfxp中文下载软件的使用技巧
  18. 【转】Mp4 Faq
  19. 手机上怎么将图片转换成PDF
  20. 淘晶驰串口屏入门(三)按钮、双态按钮、状态开关、图片、切图、触摸热区

热门文章

  1. Laravel Lang的初次使用,以及如何多个文件或目录管理语言
  2. 组合式 API----Vue3学习
  3. android搜索热词(热门标签)流式布局的实现
  4. Scanner的使用
  5. 使用requests 爬取唯美意境图片
  6. 计算0到100之间的奇数和偶数的和
  7. 【半监督医学图像分割 2021 TMI】SimCVD 论文翻译
  8. (十一) 跨平台修图软件GIMP及其批处理插件
  9. mac clion 下 stdio.h file not found
  10. 电视 显示器 电影 分辨率规定