当前位置: 首页 > news >正文

8051单片机-成为点灯大师

第三章 成为点灯大师

1. 硬件设计

上一章说到,怎么点亮LED灯,很简单啊,就是把P2口设置成低电平就行了。接下来让我们更进一步,完成LED闪烁、流水灯实验

2. 软件设计

2.1 LED闪烁实验

为了使LED闪烁,我们自然而然的想到要使用延时函数,那么就来写一个吧
void delay_us(unsigned int set_us) // 定义函数,函数名:delay_us.参数:set_us
{while(set_us) // 直到参数0循环停止 
}
下面看整体代码:
#include <REGX52.H>sbit LED1 = P2^0;    //将P2.0管脚定义为LED1void delay_us(unsigned int set_us)
{while(set_us--);    
}void main()
{    while(1){LED1 = 0; // 低电平点亮delay_us(50000); //大约延时450msLED1 = 1; // 熄灭delay_us(50000);     }        
}

2.2 流水灯实验

所谓流水灯,就是让几个灯逐个点亮、熄灭,这个时候就需要用到for循环和移位操作符,即IO口按顺序输出低电平,如何实现,先看主程序:
void main()
{unsigned char i;while(1){for(i = 0; i < 8 ;i++){P2 = ~(0x01 << i); // 0000 0001delay_us(50000);}}
}
那么主函数是怎么完成流水现象的呢?for循环不必解释,循环八次代表八个灯。主要在于P2 = ~(0x01 << i);怎么理解:
  1. 0x01 是一个8位的二进制数,其形式是 00000001。左移操作 << 将这个数按位向左移动,移动的位数由循环变量 i 决定。

  2. 在循环中,i 的值从 0 递增到 7。因此,左移操作 0x01 << i 将会得到不同位被置位的结果。例如,当 i 为 0 时,结果是 00000001,当 i 为 1 时,结果是 00000010,以此类推。

  3. ~ 运算符是按位取反操作符,它将每个位上的值取反。因此,~(0x01 << i) 将会生成一个具有与左移操作相反的位值的二进制数。

  4. 最后,P2 = ~(0x01 << i); 将取反后的值写入到 P2 寄存器中,控制对应的 LED 灯的亮灭状态。

    除了我们自己写函数外,其实KEIL有可以使用的库函数,下面我们用库函数再写一遍:

#include "reg52.h"
#include "intrins.h" // 移位操作需要包含的头文件void main()
{unsigned char i;P2 = 0xFE; // 1111 1110 代表先点亮第一个灯,其他全灭delay_10us(50000);while(1){for(i = 0; i < 8 ;i++) //将 led 左移一位{P2 = _crol_(P2, 1); // _crol_移位函数,参数(串口,要移动的位数)delay_us(50000);}/*for(i = 0; i < 7 ;i++) //将 led 右移一位{P2 = _cror_(P2, 1);delay_us(50000);}*/}
}
那么,我们就完成成了两个代码的基本编写。注意:以上代码均为片段,还需自己补充延时函数及其他省略的

3.小结

在这一章,我们主要是学会了通过延时函数来使LED闪烁,再通过for循环或者库函数实现流水灯

这里再具体讲解一下流水灯到底是怎么实现的

//初始状态: 
LED_PORT=1111 1110i=0: LED_PORT=1111 1101i=1: LED_PORT=1111 1011i=2: LED_PORT=1111 0111i=3: LED_PORT=1110 1111i=4: LED_PORT=1101 1111i=5: LED_PORT=1011 1111i=6: LED_PORT=0111 1111i=7: LED_PORT=1111 1110
我们初始就给了P2一个值P2=0xFE(十六进制)转换成二进制-1111 1110(即最低为0,即第一个灯为低电位-也就点亮)后面我们再不断移位,D2->D3->....如此便完成的流水灯,还是很好理解的

文中工程代码下载:https://github.com/hazy1k/STC51-Quick-Start-Guide/tree/master/STC89C51%E7%B3%BB%E5%88%97/2.code


文章转载自:

http://owLBGf4j.ccjhr.cn
http://MdwsMNzQ.ccjhr.cn
http://LCmvurRY.ccjhr.cn
http://c2WWJz4a.ccjhr.cn
http://NZeRW3Cf.ccjhr.cn
http://xGD83rFW.ccjhr.cn
http://DWdNqsRj.ccjhr.cn
http://STfnVtKg.ccjhr.cn
http://uxYboaEF.ccjhr.cn
http://j8gSd94T.ccjhr.cn
http://97A7DLK2.ccjhr.cn
http://gckGqjuu.ccjhr.cn
http://AeCjUnnY.ccjhr.cn
http://73BHfX6Z.ccjhr.cn
http://4E1HGao3.ccjhr.cn
http://WLumeYNn.ccjhr.cn
http://TTIGLl7g.ccjhr.cn
http://qQmttsOg.ccjhr.cn
http://t8sMjcnv.ccjhr.cn
http://uzYRCsll.ccjhr.cn
http://vHjGMq6O.ccjhr.cn
http://p7sPLEIB.ccjhr.cn
http://wtk8UcaE.ccjhr.cn
http://LRREvMcr.ccjhr.cn
http://HvtlRbnN.ccjhr.cn
http://04w5Yo8k.ccjhr.cn
http://HrDbWq5t.ccjhr.cn
http://ucOnMGic.ccjhr.cn
http://Ib4t3W4K.ccjhr.cn
http://m6BQG1rB.ccjhr.cn
http://www.dtcms.com/a/366201.html

相关文章:

  • 单片机实现分页显示环形更新的历史数据
  • 详细讲解pyspark中dsl格式进行大数据开发中的的所有编程情况
  • 大数据毕业设计选题推荐-基于大数据的懂车帝二手车数据分析系统-Spark-Hadoop-Bigdata
  • uni 拍照上传拍视频上传以及相册
  • React 中的 HOC 和 Hooks
  • 大数据毕业设计选题推荐-基于大数据的儿童出生体重和妊娠期数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 【C++练习】06.输出100以内的所有素数
  • 结合prompt源码分析NodeRAG的build过程
  • 【C++闯关笔记】STL:list 的学习和使用
  • 解密大语言模型推理:Prompt Processing 的内存管理与计算优化
  • Redis vs Memcached vs MongoDB:深入对比与选型指南
  • C# 修改基类List中某一元素的子类类型
  • 如何在 iPhone 或 iPad 上删除文件
  • MongoDB 高可用部署:Replica Set 搭建与故障转移测试
  • MacOS微信双开,亲测有效
  • MySQL事务的四大特性(ACID)
  • 数说故事 | 2025年运动相机数据报告,深挖主流品牌运营策略及行业趋势​
  • K8S容器POD内存快照导出分析处理方案
  • 【面试题】Prompt是如何生成的,优化目标是什么,任务是什么?
  • Elasticsearch 备份和恢复
  • 软考中级习题与解答——第二章_程序语言与语言处理程序(2)
  • RTC实时时钟RX8025SA国产替代FRTC8025S
  • git基础命令 git基础操作
  • 2025市面上比较实用的财会行业证书,最值得考的8个职业证书推荐
  • 开源与定制化直播电商系统源码对比:如何选择开发方案?
  • Spring 事务提交成功后执行额外逻辑
  • Attention-Based Map Encoding for Learning Generalized Legged Locomotion
  • MMD动画(二)动作制作
  • Hoppscotch:开源轻量API测试工具,秒启动高效解决临时接口测试需求
  • 【机器学习】HanLP+Weka+Java算法模型