MCU-51:让LED闪烁起来

news2024/11/13 3:54:22

目录

  • 一、LED闪烁
    • 1.1 编写代码
    • 1.2 延时函数
    • 1.3 由0和1控制实现
  • 二、LED流水灯
    • 2.1 流水灯基础版
    • 2.2 移位法实现LED流水灯

一、LED闪烁

昨天我们初识单片机,点亮了一个灯开启了我们51单片机的学习之旅。那么今天我们来一步步深入学习。

1.1 编写代码

会了点亮一个灯,那么闪烁应该就是一亮一灭循环,那代码应该如下

#include <REGX52.H>
void main()
{
	while(1)
	{
		P2=0xFE;
	  P2=0xFF;
	}
}

将以上代码进行编译并无问题。
但是将以上代码烧写到单片机,你会发现单片机LED灯一直长亮。
这是为什么?使我们的代码有问题吗?
其实不是,代码正确,只是单片机晶振频率是12MHz,是M哦,那么一秒会闪几万次,我们的肉眼根本看不到
所以要在程序中加入延时函数

1.2 延时函数

延时函数有两种方法:
第一种方法:通过STC内的工具实现
选择软件演技计算器进行代码生成
在这里插入图片描述
延时代码如下

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

将以上代码加入到刚刚写的程序中

#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0xFE;
		Delay500ms();
	  P2=0xFF;
		Delay500ms();
	}
}

注意需要包含头文件

#include <INTRINS.H>

在while函数中进行调用

while(1)
	{
		P2=0xFE;
		Delay500ms();
	  P2=0xFF;
		Delay500ms();
	}

将以上代码编译烧进单片机,奇迹就出现了。

第二种方法:通过函数调用配合while语句实现

void delay(unsigned int i)
{
	while(i--);	
}

学过C语言的都知道什么意思,这里就不解释了
完整代码如下

#include <REGX52.H>
void delay(unsigned int i)			
{
	while(i--);	
}

void main()
{
	while(1)
	{
		P2=0xFE;
		delay(50000);
	  P2=0xFF;
		delay(50000);
	}
}

这是不是比第一种方法代码要简单的多,越简单,计算越快

1.3 由0和1控制实现

代码如下,每一行代码都有解释,这里不做解释

#include <reg52.h>			 //定义单片机的一些特殊功能寄存器
sbit led=P2^0;				//定义指定LED灯的管脚
 
void delay(unsigned int i)			//延时函数。unsigned int定义无符号整型,范围0-655535
{
	while(i--);	//i=1时,大约延时10us
}
 
void main()       //主函数,程序从这里开始执行
{
	while(1)
	{
		led=0;        //0表示低电平,共阳极二极管点亮
		delay(50000); //大约延时450ms
		led=1;        //1表示高电平,LED熄灭
		delay(50000); //大约延时450ms	
	}		
}

二、LED流水灯

2.1 流水灯基础版

8个LED灯的定义,以共阳极为例,让某一个灯点亮就是让这个LED灯为低电平。从左到右依次为01111111、10111111、11011111、11101111、11110111、11111011、11111101、11111110。其中1就是高电平、0位低电平,为低电平时LED点亮。
代码如下

#include <reg52.h>			 //定义单片机的一些特殊功能寄存器
 
sbit led1=P2^0;				//定义指定LED灯的管脚
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;
 
void delay(unsigned int i)			//延时函数。unsigned int定义无符号整型,范围0-655535
{
	while(i--);	//i=1时,大约延时10us
}
 
void main()       //主函数,程序从这里开始执行
{
	while(1)
	{
		led1=0;        //0表示低电平,led1点亮
		delay(5000); 
		led1=1;        //1表示高电平,led1熄灭
		delay(5000); 	
		led2=0;        //0表示低电平,led2点亮
		delay(5000); 
		led2=1;        //1表示高电平,LED2熄灭
		delay(5000); 	
		led3=0;        //0表示低电平,LED3点亮
		delay(5000); 
		led3=1;        //1表示高电平,LED3熄灭
		delay(5000); 	
		led4=0;        //0表示低电平,LED4点亮
		delay(5000); 
		led4=1;        //1表示高电平,LED4熄灭
		delay(5000); 	
		led5=0;        //0表示低电平,LED5点亮
		delay(5000); 
		led5=1;        //1表示高电平,LED5熄灭
		delay(5000);	
		led6=0;        //0表示低电平,LED6点亮
		delay(5000); 
		led6=1;        //1表示高电平,LED6熄灭
		delay(5000); 
		led7=0;        //0表示低电平,LED7点亮
		delay(5000); 
		led7=1;        //1表示高电平,LED7熄灭
		delay(5000); 	
		led8=0;        //0表示低电平,LED8点亮
		delay(5000); 
		led8=1;        //1表示高电平,LED8熄灭
		delay(5000); 	
	}		
}

最基础最原始的流水灯方式,就是单纯让LED按照顺序依次点亮,从而达到流水灯的效果,看似笨拙、程序繁多,却突出流水灯的思想和原理,为后面库函数、左移右移、数组索引法奠定基础。

2.2 移位法实现LED流水灯

从左开始循环

#include <reg51.h>
 
void delay(unsigned int i)   //延时函数
{
    while(i--);
}
 
void main(void)   //主函数,程序从这里开始执行
 {
     int j;   //引入变量,定义字符
     while(1)
    {
        P2=0xfe;   //即11111110,将8个LED的状态赋值给P2
        delay(50000);
	for(j=0;j<8;j++)  //循环8次,因为有8个LED灯
         {
            P2=P2<<1 | 0x01; //实现程序左移1位,或运算,有1为1,全0为0
            delay(50000);
         }
     }
 }

那么右循环就是与上面相反

#include <reg51.h>
 
void delay(unsigned int i)   //延时函数
{
    while(i--);
}
 
void main(void)   //主函数,程序从这里开始执行
 {
     int j;   //定义字符
     while(1)
    {
        P2=0x7f;   //即01111111,将8个LED的状态赋值给P2
        delay(50000);
	for(j=0;j<8;j++)  //循环8次,因为有8个LED灯
         {    
            P2=P2>>1 | 0x80; //实现程序右移1位,或运算,有1为1,全0为0
            delay(50000);
         }
     }
 }

还有其他方法可以实现流水灯,小伙伴们自己探索吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式分享~IO相关1 ##

这里仅总结一下IO控制相关 单片机IO直接驱动继电器 上图是随便找到的两个不同型号的继电器。继电器就是个开关&#xff0c;这个开关是由它内部的线圈控制的&#xff0c;给线圈通电&#xff0c;继电器就吸合&#xff0c;开关就动作了。绝大部分的继电器反面都会有如下图一样的…

win10 git 标准化commit工具commitizen安装教程

1、 安装nodjs https://nodejs.org/en/ 下载最新版本 安装完成后&#xff0c;修改环境变量 默认 nodejs是有的&#xff0c;需要自己添加npm路径 2、安装commitizen 在桌面上右键打开power shell 查看node 和npm的版本&#xff0c;npm最好升级一下 升级命令问题 npm inst…

【HDR】曝光融合(Exposure Fusion)

文章目录0 前言1 算法细节1.1 Naive1.1.1 主要思想1.1.2 权重计算1.1.3 融合1.2 Multi-resolution2 实验3 参考0 前言 在曝光融合&#xff08;Exposure Fusion&#xff09;算法问世之前&#xff0c;多曝光序列合成用于显示的HDR需要两个步骤&#xff0c;第一步是将多张不同曝光…

MySql加密存储的数据,如何模糊搜索?

背景 蔚来被勒索 225 万美元&#xff0c;大量数据遭泄露&#xff01; 根据网络上流传的截图显示&#xff0c;黑客似乎掌握着蔚来内部员工数据 22800 条、车主用户身份证数据 399000 条、用户地址数据 6500000 条、注册用户数据 4850000 条、企业及企业代表联系人数据 10000 条…

dpdk编译

ubuntu网卡信息配置 虚拟机中除去最开始的一块网卡&#xff0c;再另外添加两块网卡&#xff0c;如下图所示 修改Ubuntu20_x64.vmx里面的配置信息 将ethernet0.virtualDev "e1000"里面的e1000更改成vmxnet3,因为e1000只支持网卡单队列&#xff0c;vmxnet3支持网卡对…

5G无线技术基础自学系列 | 5G移动性KPI

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G移动类KPI用来评估NR网络的移动性能&…

29. 如何通过 ABAP 代码给 SAP OData 元数据增添注解

笔者的这篇 SAP UI5 开发教程文章&#xff0c;* SAP UI5 应用开发教程之一百二十九 - 如何给 SAP UI5 SmartField 添加 Value Help 功能&#xff0c;有朋友留言&#xff1a; 你好&#xff0c;请教一个问题&#xff0c;请问如何在odata里面通过annotations添加一个自定义注解&am…

2022年哪些工具适合设计企业产品手册?

产品手册是什么&#xff1f; 产品手册是因特网发展的成果&#xff0c;是一种以移动端为基础进行在线营销的新内容&#xff0c;其中包含了对原有的纸质商品、小册子、促销软文、邀请函等现有促销资料进行数字化的更新。 产品手册是从传统的纸质公司样本书中升级而来的&#xf…

Git 入门

文章目录0. 前言学习目标参考教程链接1. Git概念1.1 什么是Git1.2 Git 的下载1.3 Git三大区域1.4 远程仓库2. Git的使用2.1 图形化操作2.1.1 IDEA图形化操作2.1.2 GitKraken(可选)2.2 命令行操作2.2.1 Git 配置2.2.2 分支命令2.2.3 拉取与推送3. 总结0. 前言 学习目标 了解 G…

面试官:你来说一下Spring IOC容器的创建过程

这篇文章主要讲解 IOC 容器的创建过程&#xff0c;让你对整体有一个全局的认识&#xff0c;文章没有复杂嵌套的 debug 流程&#xff0c;相对来说比较简单。 不 BB&#xff0c;上文章目录。 1. 基础知识 1.1 什么是 Spring IOC &#xff1f; IOC 不是一种技术&#xff0c;只是…

数据结构抽象数据类型的表示和实现

抽象数据类型(Abstract Data Type&#xff0c;ADT)是指一个数学模型以及定义在此数学模型上的一组操作。例如&#xff0c;“整数”是一个抽象数据类型&#xff0c;其数学特性和具体的计算机或语言无关。“抽象”的意义在于强调数据类型的数学特性。抽象数据类型和数据类型实质上…

Halcon常用算子(库函数)整理

目录一. 常规操作类1.1 tuple_length()1.2 tuple_find_first()1.3 tuple_gen_const()二. 机器视觉操作类2.1 read_image()2.2 get_image_size()2.3 intensity()2.4 zoom_image_factor()2.5 median_image()2.6 Gauss_filter()2.7 fft_generic()2.8 convol_fft()2.9 sub_image()2…

大白话给你讲明白数据仓库

数据仓库的本质就是完成从面向业务过程数据的组织管理到面向业务分析数据的组织和管理的转变过程。 数据仓库类比粮食仓库 业务过程数据的组织管理实际上就是由各种业务系统来完成的&#xff0c;比如ERP、CRM、OA等各类业务系统&#xff0c;解决的是基本的业务流程管理。通过…

PS的安装、背景、背景练习、雪碧图、线性渐变、径向渐变、电影卡片练习——06fontbackground

目录 一、PS的安装 二、背景(background-color、background-image、 background-repeat、background-position、background-clip、background-origin、background-size、background-attachment) 三、背景练习(背景重复—导航条的背景颜色是渐变的) 四、背景练习&#xff08…

【数据结构】深度讲解栈、栈的应用举例、栈和递归的实现教你全面认识栈

目录一.栈1.栈的概念及结构2.栈的实现stack.hStack.c二.栈的应用举例1.数制转换2.有效的括号3.迷宫求解三.栈与递归的实现1.栈和递归2.迷宫问题递归实现3.汉诺塔栈实现一.栈 入栈出栈展示&#xff1a; 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许…

【Web开发】Python实现Web服务器(Ubuntu下安装Flask)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

【ESP32+freeRTOS学习笔记-(三)任务】

目录1、任务相关基本概念1.1 任务函数原型1.2 任务句柄TaskHandle_t 及任务控制块TCB_t1.3 任务状态1.4 优先级(Task Priorities)2 创建任务2.1 xTaskCreate2.2 xTaskCreateStatic()3 延迟函数使任务进入阻塞状态vTaskDelay()函数vTaskDelayUntil&#xff08;&#xff09;函数4…

【C++初阶】vector的模拟实现

文章目录vector的介绍vector的模拟实现成员变量Member functionsconstructor&#xff08;构造函数&#xff09;destructor&#xff08;析构函数&#xff09;operatorIteratorsbeginendCapacitysizecapacityreserveresizeElement accessoperator[]Modifierspush_backpop_backins…

手办商城系统|Springboot+vue+ElementUI手办商城系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

C语言重点解剖预处理要点速记

1.宏定义字符串的时候一定要带上双引号。 2.程序的翻译&#xff0c;就是把文本代码翻译成二进制代码。分为4个阶段&#xff0c;即预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接。 3.预处理&#xff1a;头文件展开&#xff0c;去注释&#xff0c;宏替换&#xff0c…