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

51单片机学习——LED功能一系列实现

目录

一、开发前准备

二、点亮LED

三、LED闪烁

四、LED流水灯

五、LED流水灯plus


一、开发前准备

开发工具软件

烧录软件

其次还需要一块51单片机学习开发板及原理图

keil创造project文件及开启生成.hex文件

二、点亮LED

看二位进制对照原理图;

#include <REGX52.H>
void main()
{P1=0xFE;
}

三、LED闪烁

了解数据类型

在STC-isp中,在软件延时计算器中; 

生成C代码后;复制粘贴到keil中;

添加头文件;延迟函数头文件;

include<INTRINS.H>

 循环向左递位

 运行main.c;生成.hex文件,用烧录文件进行烧录;

#include <REGX52.H>
sbit p1_1=P1^0;
unsigned int a;
void main()
{while(1){a=50000;p1_1=0;while(a--);a=50000;p1_1=1;while(a--);}
}

四、LED流水灯

调用延迟函数返回参数;

  1. 初始化temp变量为0xfe,这表示P1端口的高7位是高电平,最低位是低电平。如果P1端口连接了8个LED灯,这意味着除了最右边的LED灯外,其余的LED灯都是关闭状态。

  2. 在主循环中,使用_crol_内建函数将temp的值循环左移一位。这个操作会将temp最低位的值移动到最高位,其余位向左移动。因此,每次调用_crol_后,temp的值都会改变,使得下一个LED灯被点亮。

  3. 调用delay函数来实现延时。这个延时确保LED灯的点亮和熄灭足够慢,从而形成流水灯的动态效果。

  4. 更新P1端口的值,将temp的当前值输出到P1端口,这样LED灯的状态就会根据temp的值改变。

  5. 重复步骤2到4,形成一个连续的流水灯效果。

//Á÷Ë®µÆ
#include <REGX52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp; //8λÎÞ·ûºÅ×Ö·ûÐÍ
void delay(uint z)//ÑÓʱº¯Êý£»µ÷ÓòÎÊý£»ºÁÃ룻
{uint x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);
}void main()
{temp =0xfe;P1=temp;while(1){temp=_crol_(temp,1);delay(600);P1=temp;}
}

五、LED流水灯plus

用生成1ms的函数来实现流水灯,这样就不需要一个一个换数了,和上面类似

#include <REGX52.H>
#include <intrins.h>void Delay1ms(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void main()
{while(1){P1=0xfe;//1111 1110Delay1ms(100);P1=0xfd;Delay1ms(100);P1=0xfb;Delay1ms(100);P1=0xf7;Delay1ms(100);P1=0xff;Delay1ms(100);P1=0xef;Delay1ms(100);P1=0xdf;Delay1ms(100);P1=0xbf;Delay1ms(100);P1=0x7f;Delay1ms(100);//0111 1111}}

这代码用于8051微控制器的C语言程序,实现了一个简单的LED流水灯效果。

1. `#include <REGX52.H>` - 包含针对AT89C52(一种8051系列微控制器)的寄存器定义和特殊功能寄存器(SFR)的头文件。

2. `#include <intrins.h>` - 包含一些内建函数的头文件,比如`_nop_()`(空操作,用于延时)。

3. `void Delay1ms(unsigned int xms)` - 定义了一个名为`Delay1ms`的函数,它接受一个无符号整型参数`xms`,表示需要延时的毫秒数。

4. `unsigned char i, j;` - 在`Delay1ms`函数内部声明了两个无符号字符变量`i`和`j`,用于实现延时。

5. `while(xms)` - 一个循环,当`xms`不为0时继续执行。

6. `i = 2;` - 将`i`初始化为2。

7. `j = 239;` - 将`j`初始化为239。

8. `do { ... } while (--i);` - 一个`do...while`循环,内部是一个`while`循环,执行`j`次,每次`j`递减直到0,然后`i`递减。这个循环用于实现微秒级的延时。

9. `while (--j);` - 内部的`while`循环,直到`j`递减到0。

10. `xms--;` - 每次外层循环结束时,`xms`递减1。

11. `void main()` - 主函数的开始。

12. `while(1)` - 一个无限循环,使得程序持续运行。

13. `P1=0xfe;` - 将P1端口的值设置为`0xfe`(二进制`11111110`),如果P1端口连接了LED灯,这将点亮除了最右边的LED之外的所有LED。

14. `Delay1ms(100);` - 调用`Delay1ms`函数,延时100毫秒。

15. 接下来的几行代码重复上述步骤,但是每次将P1端口的值设置为下一个二进制数,实现LED灯逐个点亮的效果。

16. `P1=0xff;` - 将P1端口的值设置为`0xff`(二进制`11111111`),所有LED灯都熄灭。

17. 最后几行代码是将LED灯从最左边开始逐个点亮,直到所有LED灯都亮起。

整个程序通过改变P1端口的输出值,控制连接到P1端口的LED灯依次点亮和熄灭,从而形成一种流水灯的效果。`Delay1ms`函数用于控制每次LED灯状态改变之间的延时,使得流水灯效果更加明显。这个延时函数是基于8051微控制器在12MHz时钟频率下的实现,实际延时效果可能需要根据具体的时钟频率进行调整。
 

 

http://www.lryc.cn/news/387515.html

相关文章:

  • 互联网大厂核心知识总结PDF资料
  • 设计模式-状态模式和策略模式
  • Java NIO Buffer概念
  • Kubernetes在Java应用部署中的最佳实践
  • IOS Swift 从入门到精通:@escaping 和PreferenceKey
  • 基于PHP技术的校园论坛设计的设计与实现-计算机毕业设计源码08586
  • 开机弹窗缺失OpenCL.dll如何解决?分享5种靠谱的解决方法
  • IIS 服务器安装SSL证书
  • 二叉树第二期:堆的实现与应用
  • python-求出 e 的值
  • 模型微调方法
  • cesium使用cesium-navigation-es6插件创建指南针比例尺
  • go sync包(七)Sync.Map
  • Batch文件中的goto命令:控制流程的艺术
  • 【chatgpt】两层gcn提取最后一层节点输出特征,如何自定义简单数据集
  • Java面试题:讨论你如何保持对Java生态系统中新技术的了解
  • 深度学习之Transformer模型的Vision Transformer(ViT)和Swin Transformer
  • 玩个游戏 找以下2个wordpress外贸主题的不同 你几找到几处
  • React Native优质开源项目推荐与解析
  • 树莓派安装windows系统
  • CSS-position/transform
  • 面试题之一
  • 494. 目标和 Medium
  • 如何实现灌区闸门控制自动化?宏电“灌区哨兵”为灌区闸门控制添“智慧”动能
  • PHP电商系统开发指南数据库管理
  • 基于Vue.js的电商前端模板:Vue-Dashboard-Template的设计与实现
  • 论文解读:【CVPR2024】DUSt3R: Geometric 3D Vision Made Easy
  • springboot助农电商系统-计算机毕业设计源码08655
  • 【windows】电脑如何关闭Bitlocker硬盘锁
  • vue-cli 搭建项目,ElementUI的搭建和使用