草庐IT

C51单片机LED点亮,LED闪烁和流水灯

唔肯木工 2023-04-13 原文
        学习单片机最简单的外设莫过于 IO 口的高低电平控制,通过控制 51 单片机的 GPIO 使开发
板上的 LED 灯点亮,闪烁,流水灯以及双向流水灯

1、GPIO概念

        GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其
输入和输出。51 单片机芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数
据采集的功能。 GPIO 最简单的应用应该是点亮 LED 灯,只需通过软件控制 GPIO 输出高低电平
即可。当然 GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是
否按下。
        有以下几类引脚:
(1)电源引脚:引脚图中的 VCC、 GND 都属于电源引脚。
(2)晶振引脚:引脚图中的 XTAL1、XTAL2 都属于晶振引脚。
(3)复位引脚:引脚图中的 RST 属于复位引脚,不做其他功能使用。
(4)下载引脚:51 单片机的串口功能引脚(TXD、RXD)可以作为下载引脚使用。
(5)GPIO 引脚:引脚图中带有 Px.x 等字样的均属于 GPIO 引脚。从STC89C52开发板的引脚图
可以看出,GPIO 占用了芯片大部分的引脚,共达 32 个,分为了 4 组,P0、P1、 P2、P3,每组
为 8 个 IO,而且在 P3 组中每个 IO 都具备额外功能,只要通过相应的寄存器设置即可配置对应的
附加功能,同一时刻,每个引脚只能使用该引脚一个功能。对于每个引脚的具体功能需要查看相关
的数据手册。下面是我在STC89C52手册上查到的部分引脚功能说明。

2、LED简介

        LED 即发光二极管。它具有单向导电性,通过 5mA 左右电流即可发光,电流越大,其亮度越
强,但若电流过大,会烧毁二极管,一般我们控制在 3 mA-20mA之间,通常我们会在 LED 管脚上
串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限
流电阻”。单色LED只有两根引脚,这两根引脚有正、负极之分。多色的LED为 3 根引脚。发光二
极管分为直插式发光二极管和贴片式发光二极管实物图。发光二极管正极又称阳极,负极又称阴
极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。

LED对电压也是有要求的,二极管都有导通电压,LED的供电电压如果没有达到这个导通电压值,

LED无法点亮,当LED导通时,电流才开始流过LED,且电流越大,亮度越强(但不能超过最大作电流)。

 

(1)OA 段。这是正向死区。UA 为开启LED发光的电压。

(2)AB 段。这是工作区。在这一区段, 一般是随着电压增加电流也跟着增加, 发光亮度也跟着增大。

(3)OC 段。这是反向死区,发光二极管加反向电压是不发光的(不工作),但有反向电流。这个反向电流通常很小,一般在几微安之内。

(4)CD 段。这是反向击穿区,LED的反向电压一般不要超过10V,最大不得超过 15V,最大反向电压。超过这个电压,就会出现反向击穿,导致发光二极管报废。

STC89C52开发板上LED模块电路如下:

可以看到图中D1-D8 连接到单片机的 P20-P27 口。并且图中 LED 采用共阳接法,即所有 LED 阳
极管脚接电源 VCC,阴极管脚通过一个限流电阻接到 P2 口上。开发板引脚上电默认为高电平1,要
让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭。如果要想 51 单片机控制
LED,就必须通过单片机管脚在 P2 口上输出低电平。

 3、点亮D1指示灯

        查看开发板原理图LED D1指示灯对应的是引脚是P2_0,所以只需要给P2_0输出一个低电平就能使D1亮

#include <REGX52.H>

sbit LED = P2^0;//将P2.0定义为LED

void main()
{
	LED = 0;//点亮LED1
    while(1)
	{}
}

4、LED闪烁

        LED已经点亮,想要它出现闪烁就是使LED一亮一灭,只需循环让 D1 指示灯先亮一会后熄灭,使

这个状态持续下去但是要想使我们人眼想要观察到需要设置一定的延时,利用人眼的余晖效应

#include <REGX52.H>

sbit LED = P2^0;

typedef unsigned int u16;//对系统默认数据类型进行重命名
typedef unsigned char u8;

void Delay(u16 ten)    //延迟函数
{
	while(ten--);
}

void main()
{
	while(1)
	{
		LED = 0;    //点亮
		Delay(50000);//大约延迟450ms
		LED = 1;    //熄灭
		Delay(50000);
	}
}

5、 LED流水灯

        LED流水灯之前我记录过一次,这次想在记录一次就当复习了。要实现 LED 流水灯,只需循环

让 D1-D8 指示灯逐个点亮。要实现循环点亮,最容易想到的方法:点亮 D1 且把 D2-D8 熄灭,延

时一段时间后再点亮 D2 且把 D1、 D3-D8 熄灭,延时一段时间后再点亮 D3 且把 D1-D2、D4-D8

熄灭,如此循环下去,IO 口由低往高或者由高往低逐个输出低电平特点。在这里有两种方法实现,一

种是利用二进制逻辑位移使不同引脚低电平,另一种是利用库函数intrins.h中的位移函数。

这种是最笨的方法,依次让每一个LED逐次亮灭

#include <REGX52.H>

sbit LED1 = P2^0;
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;

typedef unsigned int u16;


void Delay(u16 ten)
{
	while(ten--);
}
void main()
{

	while(1)
	{
		//通过高低电平
		LED1 = 0;
		Delay(50000);
		LED1 = 1;
		Delay(50000);
		
		LED2 = 0;
		Delay(50000);
		LED2 = 1;
		Delay(50000);
		
		LED3 = 0;
		Delay(50000);
		LED3 = 1;
		Delay(50000);
		
		LED4 = 0;
		Delay(50000);
		LED4 = 1;
		Delay(50000);
		
		LED5 = 0;
		Delay(50000);
		LED5 = 1;
		Delay(50000);
		
		LED6 = 0;
		Delay(50000);
		LED6 = 1;
		Delay(50000);
		
		LED7 = 0;
		Delay(50000);
		LED7 = 1;
		Delay(50000);
		
		LED8 = 0;
		Delay(50000);
		LED8 = 1;
		Delay(50000);

	}
}

 通过位移来实现亮灭

#include <REGX52.H>
#define LED_PORT	P2;
typedef unsigned int u16;
typedef unsigned char u8;
void Delay(u16 ten)
{
	while(ten--);
}
void main()
{
    u8 i;
	while(1)
	{
		//通过位移实现
		for(i=0;i<8;i++)
		{
		    P2 = ~(0x80>>i); //1000 0000 -->0000 0001然后取反
			Delay(50000);
		}
		for(i=0;i<8;i++)
		{
			P2 = ~(0x01<<i); //0000 0001 -->1000 0000然后取反
			Delay(50000);
		}

	}
}

通过库函数intrins.h实现

#include <REGX52.H>
#include "intrins.h"

#define LED_PORT	P2;
typedef unsigned int u16;
typedef unsigned char u8;

void Delay(u16 ten)
{
	while(ten--);
}
void main()
{
    u8 i;
	P2 = 0xFE;
	while(1)
	{
			
		for(i=0;i<7;i++)//移动的是0的位置
		{
			P2 = _crol_(P2,1);//左移
			Delay(50000);
		}
		for(i=0;i<7;i++)
		{
			P2 = _cror_(P2,1);//右移
			Delay(50000);
		}
		for(i=0;i<8;i++)//移动的是1的位置
		{
			P2 = ~(_cror_(0x01,i));//右移
		    Delay(50000);
		}
		for(i=0;i<8;i++)
		{
			P2 = ~(_crol_(0x80,i));//左移
			Delay(50000);
		}
	}
}

使用逻辑左移高位移出(舍弃),低位的空位补0,最高位丢失,最低位补0。使用逻辑右移低位移出

(舍弃),高位的空位补0,最高位补0,最低位丢失。类似数据结构的队列一样,前面走后面来的补

上。而使用左移函数(循环左移)_crol_(移动对象,左移的位数)如果是左移,那么最高位就被移到

最低位了,次高位变为最高位。右移函数和左移函数类似。类似一个循环队列。

#include <REGX52.H>
#include "intrins.h"

#define LED_PORT	P2;
typedef unsigned int u16;
typedef unsigned char u8;
void Delay(u16 ten)
{
	while(ten--);
}
void main()
{
    u8 i;
	P2 = 0xFE;
	while(1)
	{	
		for(i=0;i<7;i++)//0的位置变动
		{
			P2 = _crol_(P2,1);
			Delay(50000);
		}
		for(i=0;i<7;i++)
		{
			P2 = _cror_(P2,1);
			Delay(50000);
		}
	}
}

刚开始P2 = 0xFE; 对应二进制 1111 1110,最低位为0因此最开始的 D1 指示灯会点亮。循环七次

的原因是在进入 main 开始,就已经将 LED_PORT 端口设置了一次状态,即让 D1 点亮,并且我

们是想让 LED 从左至右依次点亮,然后继续又从右至左依次点亮

初始状态:LED_PORT=1111 1110

i=0:LED_PORT=1111 1101

i=1:LED_PORT=1111 1011

i=2:LED_PORT=1111 0111

i=3:LED_PORT=1110 1111

i=4:LED_PORT=1101 1111

i=5:LED_PORT=1011 1111

i=6:LED_PORT=0111 1111

i=7:LED_PORT=1111 1110

如上如有错误,谢谢指正

有关C51单片机LED点亮,LED闪烁和流水灯的更多相关文章

  1. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  2. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  3. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

  4. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  5. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  6. 基于51单片机、DS1302时钟模块的电子闹钟设计 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很

  7. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  8. 一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码) - 2

    1、单片机控制液晶显示模块1602LCD的显示。液晶显示器(LiquidCrystalDisplay,LCD)具有省电、体积小、抗干扰能力强等优点,LCD显示器分为字段型、字符型和点阵图形型。(1)字段型。以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。(2)字符型。专门用于显示字母、数字、符号等。一个字符由5、7或5、10的点阵组成,在单片机系统中已广泛使用(3)点阵图形型。广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。引脚包括8条数据线、3条控制线和3

  9. 微机课设 | 基于STC15单片机的简易数字密码锁设计 - 2

    在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替了传统的机械式密码锁,电子密码锁具有安全性高、成本低、功耗低、易操作等优点。本文主要介绍运用51单片机设计数字密码锁的方法。本设计采用自上而下的数字系统设计方法,将数字密码锁系统分解为若干子系统,并且进一步细划为若干模块,然后用C语言来设计这些模块,通过KEIL软件编译,并且进行实机调试。调试结果表明:该数字密码锁能够效验4位十进制

  10. 51单片机(郭天祥版)——键盘检测原理及应用实现 - 2

    实验中我们使用的是52单片机目录前言一、单片机是什么?二、实验步骤1.独立键盘检测1.2代码如下(示例):1.3图片1.4视频2.矩阵键盘检测2.2代码如下(示例):2.3图片2.4视频总结:以上就是今天要讲的内容,本文仅仅简单介绍了单片机键盘检测的应用实现,而单片机键盘检测相关理论可以参考教材进行学习前言文章内主要概念引自郭天祥老师《新概念51单片机C语言版》一书主要展示郭天祥老师书中第四章键盘检测原理及应用实现。分为仿真、实体两部分。一、单片机是什么?单片机就是在一块硅片上集成了微处理器、存储器及各种输入/输出接口的芯片,这样一块芯片就具有了计算机的属性,因而被成为单片微型计算机,简称单片

随机推荐