51 点亮LED

C51——C51点亮led、控制led闪烁 /led1为变量名,起啥名都行 重要的是引脚位置。//定义所对应的引脚。//给引脚3.7一个低电平,让其亮。//计数延迟500ms。//计数延迟500ms。//根据原理图可知,低电平点亮。//4*129*119会越界。.0592MHz在stc-isp中选择。c51点亮一个led灯。C51控制led闪烁。 阅读详情

51 点亮LED

LED

中文名:发光二极管

外文名:Light Emitting Diode

简称:LED

用途:照明、广告灯、指引灯、屏幕

特性:电流从正极(长引脚)进,负极(短引脚)出

STC89C52RC的LED模块(图源:普中科技参考手册)

在这里插入图片描述

LED两侧链接又电阻,起限流作用(限流电阻,防止LED因电流过大而烧毁)

由二极管的特性可知,控制LED即为控制单片机引脚输出高低电平(5V/0V),当输出为低电平时,LED处有电流通过,亮起

MCU核心引脚出处对应的电阻(图源:普中科技参考手册)

在这里插入图片描述

单片机控制设备的方式

MCU集成有CPU,代码在CPU中执行

MCU中还有寄存器(一种存储器),寄存器以8个为一组,每一位寄存器后面的导线上,有一个驱动器(用于增大电流),导线最终连接到IO口(1为高电平,0为低电平)

即CPU通过控制寄存器来控制硬件

点亮第一颗LED

添加单片机信息

由于Keil 5中没有包含STC生产的单片机的信息,为了方便操作,我们需要通过 stc-isp 软件带有的功能向 Keil 5 中添加相应的信息

在这里插入图片描述

添加过后在 Keil5 中即能看到STC生产的单片机的对应型号

在这里插入图片描述

程序写入

P2是单片机控制LED的IO口,我们需要控制LED的亮灭即控制P2口输出的0和1

在写程序的时候直接输入原始二进制数据,程序会把它识别成10进制,即我们需要把二进制数据转换成16进制形式(和二进制的转换较为方便)写入

需要添加头文件使程序识别P2(可以在第一行右键直接添加)

#include<STC89C5xRC.H>
//添加单片机对应的头文件使程序识别相应接口

void main()
{
	P2 = 0xFE;
	// 1111 1110
	//16进制为0xfe
	//10进制为245
}


//用常规的C程序写法好像也可以(这个项目可以,其它没试过)
#include<STC89C5xRC.H>

int main()
{
	P2 = 0xfe;
	return 0;
}

我们可以使用计算器的程序员模式进行快速的进制转换

在这里插入图片描述

只要单片机开始工作后,程序不会自动停止执行,而是在主函数执行完毕后再次执行,因此我们可以采用死循环的方式让单片机反复执行一个循环使程序停下来

#include<STC89C5xRC.H>

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

LED闪烁

让LED闪烁即写一个控制LED不断开关的程序

#include<STC89C5xRC.H>

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

此时,我们看到的现象是LED常量,但亮度不如我们第一次点亮LED,此时的LED实际是在快速闪烁,为此,我们需要添加一个延时使闪烁的现象更加明显

我们可以通过stc-isp中“软件延时计算器”的功能来生成我们所需要的延时对应的函数

在这里插入图片描述

#include <STC89C5xRC.H>
#include <INTRINS.H>

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

	_nop_();
	//需要添加头文件<INTRINS.H>
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


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

此时LED会以1s为周期闪烁

通过自定义延时实现流水灯

#include <STC89C5xRC.H>

void Delay1ms(unsigned int xms)    //@12.000MHz
{
    unsigned char data i, j;
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}

void main()
{    while(1)
    {
    P2 = 0xFE;
    Delay1ms(100);
    P2 = 0xFD;
    Delay1ms(100);
    P2 = 0xFB;
    Delay1ms(100);
    P2 = 0xF7;
    Delay1ms(100);
    P2 = 0xEF;
    Delay1ms(100);
    P2 = 0xDF;
    Delay1ms(100);
    P2 = 0xBF;
    Delay1ms(100);
    P2 = 0x7F;
    Delay1ms(100);
    }

}

利用C语言操作单片机的基础知识

数据类型

类型是否有符号关键字位数可表示范围
整形有(signed) short16-32768~32767
(signed) int16-32768~32767
(signed) long32-2147483648~2147483647
无unsigned short int160~65535
unsigned int160~65535
unsigned long int320~4294967295
浮点型(实型)有float323.4e-38~3.4e38
double641.7e-308~1.7e308
字符型有char8-128~127
无unsigned char80~255

运算符

类别运算符意义类别运算符意义
算数+加逻辑&&逻辑与
-减||逻辑或
*乘!逻辑非
/除位运算<<按位左移
%取余>>按位右移
=赋值&按位与
判断>大于|按位或
>=大于等于^按位异或
<小于~按位取反
<=小于等于
==等于
!=不等于

关于位运算操作符的详细信息,见作者的另一篇博文

C 20231004 操作符-优快云博客

基本语句

判断语句
if(逻辑表达式1)
{
	语句体1;
}
else if(逻辑表达式2)
{
	语句体2;
}
else
{
	语句体3;
}

//含义:
//如果逻辑表达式1成立,则执行第一个大括号中的语句
//如果逻辑表达式2成立,则执行第二个大括号中的语句
//注意:else if 可以有多个
//如果逻辑表达式1、2均不成立,则执行第三个大括号中的语句
循环语句
//while循环:
while(逻辑表达式)
{
	循环体;
}
//含义:
//若逻辑表达式成立,则反复执行循环体,每执行一次对逻辑表达式进行一次判断

//for循环:
for(初始化;判断(逻辑表达式);调整)
{
	循环体;
}
//含义:对变量进行初始化并判断,若判断成立则进入循环,并在每次循环后进行调整,在循环结束后进行下一次判断
//其相对于while更简洁的原因就是在while语句中,初始化、判断、调整三个部分是分开的

//do...while语句
do
{
	循环体;
}
while (逻辑表达式);
//含义:先执行一次循环体,并在结束后判断是否进行下一次循环
选择语句
//switch语句:
switch(整形表达式):
{
    //语句项;
    case a:
    语句;
    break;
    case b:
    语句;
    break;
    default:
    语句;
}

//含义:
//当switch后的整形表达式输出整形时,执行对应case中的语句
//break跳出switch语句(只能跳出自己所在的):若无break,则会从进入的地方一直向下执行(break的实际效果时把语句列表划分为不同的分支部分)
//利用default输出case中没有的选择:(每个switch语句只能出现一个default)
//注意:
//switch语句必须用整形(包括字符(ASCII))
//default可以放在switch语句中的任意位置,包括case前面
//case没有顺序要求
//switch允许嵌套使用

独立按键控制LED

轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开

左右两边的两个触点分别链接,按下时金属片被压扁,将左右两组触点相连,此时相当于四个触点相连

STC89C52RC上的独立按键(图源:沃兹济派德)

在这里插入图片描述

STC89C52RC上独立按键模块的连接方式(图源:普中科技参考手册)

在这里插入图片描述


单片机接点的时候,所有IO都是高电平,当按键按下时,就相当于接地,变成低电平(即我们可以通过读取相应IO口的电平来识别按键是否被按下。

由于头文件STC89C5xRC.H并未对每个接口8个位数进行单独定义,我们可以在头文件中自行对其定义

//声明独立的位数
sbit P2_0 = 0XA0;
sbit P2_1 = 0XA1;
sbit P2_2 = 0XA2;
sbit P2_3 = 0XA3;
sbit P2_4 = 0XA4;
sbit P2_5 = 0XA5;
sbit P2_6 = 0XA6;
sbit P2_7 = 0XA7;

后来我发现,STC89C5xRC.H对单个位数是有定义的,但是没加下划线,所以在调用的时候可以把下划线去了

实现按下独立按键亮起

#include <STC89C5xRC.H>

void main()
{
    //P2 = 0xfe;
    P2_0 = 1;
    
    while(1)
    {
       if(P31 == 0)
           //判断按键状态
    {
        P2_0 = 0;
    }
    else
    {
        P2_0 = 1;
    }
    }
}

独立按键控制LED状态

当我们按下按键时,由于按键的机械结构(金属片),会产生抖动

按键的抖动:对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动

按键的消抖:

  1. 硬件消抖:通过添加装置
  2. 软件消抖:通过代码延时

我们一般使用软件消抖

#include<STC89C5xRC.H>

void Delay(unsigned int xms)    //@12.000MHz
{
    unsigned char data i, j;

    while(xms > 0)
    {
        i = 2;
        j = 239;
    do
    {
        while (--j);
    } while (--i);
    xms--;
    }
}
//生成一个1ms的延时并自行改造成适应任何延时要求的函数

void main()
{
    while(1)
    {
        if(P31 == 0)
        {
        Delay(20);
        // 按键消抖
        while(P31 == 0);
        //如果不松手,就会一直在这个循环里面
        //这里如果不写循环,那么会在按键按下时切换,现象是在按下时LED快速闪烁
        Delay(20);
        //松手检测
        P2_0 = ~P2_0;
        }
    }
}

独立按键控制LED显示二进制

#include <STC89C5xRC.H>
//这里我将延时1ms的函数放入了头文件中便于使用,只要传入一个数字便可得到对应ms的延时

void main()
{
    unsigned char LED_num = 0;
    //较旧的C语言标准规定,变量要在函数的开头定义,若改变位置,会显示变量未定义
    //较新的标准(如C99)支持在任意位置定义变量
    while(1)
    {
        if(P31 == 0)
        {
             Delay(20);
            //这里把Delay作为一个函数放进STC89C5xRC.H里面了,方便后续直接调用
            while (P31 == 0);
            Delay(20);
            //P2默认位1111 1111,即全为高电平
            P2 = ~LED_num;
            LED_num++;
        }
       
    }
}
//放入头文件的函数
void Delay(unsigned int xms)    //@12.000MHz
{
    unsigned char data i, j;

    while(xms > 0)
    {
        i = 2;
        j = 239;
    do
    {
        while (--j);
    } while (--i);
    xms--;
    }
}

在这里插入图片描述

独立按键控制LED移位

#include <STC89C5xRC.H>

void main()
{
    unsigned char LED_num = 0;
    P2 = ~0x01;
    // 亮起第一个灯
    while(1)
    {
        //按下K1时,亮灯右移
        if(P31 == 0)
        {
            Delay(20);
            while(P31 == 0);
            Delay(20);
            
            if (LED_num == 7)
            {
                LED_num = 0;
            }
            else
            {
                LED_num++;
            }
            P2 = ~(0x01 << LED_num);

        }

        //当按下K2时,亮灯左移
        if(P30 == 0)
        {
            Delay(20);
            while(P30 == 0);
            Delay(20);
            
            if(LED_num == 0)
            {
                LED_num = 7;
            }
            else
            {
                LED_num--;
            }
            P2 = ~(0x01 << LED_num);
            
        }
    }
}
51单片机系列之---点亮LED灯 51单片机点亮led灯 阅读详情

相关推荐

入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例

学习嵌入式开发板STM32之前,我们先来回顾学习一下proteus仿真软件以及C51单片机的简单调试。

Liu-FE的博客 1万+

单片机Proteus软件仿真二(按键控制LED灯逐个点亮)

按键控制LED灯逐个点亮

u010152658的博客 5987

51单片机第一个程序:点亮LED的详细步骤

手把手教你完成51单片机点亮一个led灯的第一个程序,从电路连接到代码烧录,每一步都清晰易懂,适合初学者快速上手入门嵌入式开发。

weixin_31597759的博客 1116

模块化编程+LCD1602调试工具——“51单片机”

模块化编程+LCD1602调试工具

weixin_74957752的博客 1168

51单片机 LED点亮、闪烁以及流水灯实现

51单片机学习初体验,点亮第一只LED灯和让其闪烁,用四种方法实现流水灯。

叶庭云 成为自己的光 1万+

BERTopic安装指南:hdbscan依赖问题全解析(附解决方案)

本文详细解析了安装BERTopic时常见的hdbscan依赖报错问题,深入剖析了C++编译环境缺失、Python版本兼容性以及包管理渠道混用三大核心原因。针对Windows、macOS和Linux不同系统,提供了创建虚拟环境、使用conda安装预编译包、安装C++编译工具等具体解决方案,帮助用户顺利安装BERTopic并开始文本主题建模实践。

weixin_29061041的博客 213

c语言编程单片机中的sbit,单片机sfr和sbit的用法

描述单片机sfr和sbit详解sfr用于将一个单片机的特殊功能寄存器(special function register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to)该寄存器。sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。STC该系列单片机的特殊功能寄存器布局如下:看过图1这么多特...

weixin_42298969的博客 5643

手把手教你:如何为自制的STM32H7飞控板适配PX4固件(基于NuttX)

本文详细介绍了如何为自制的STM32H7飞控板适配PX4固件,基于NuttX系统进行移植。从硬件设计规范到软件环境配置,再到PX4固件的移植与调试,提供了完整的实战指南。特别分享了如何复用FMU-v6u参考设计以节省开发时间,并解决了常见问题,帮助开发者快速实现高性能飞控系统的搭建。

weixin_27697385的博客 475

单片机c语言编程sbit,8051单片机的C语言编程

8051的C语言编程和传统的C语言编程是类似的。当然其中有些数据类型是不一样的,我们知道8051支持强大的位寻址能力,因此8051的C语言编程增加了一些新的数据类型,为了不使的8051的能力被浪费。下面给出新增的数据类型。bit ——用于定义1个位变量,用于8051的位寻址空间(仅仅限于内部RAM的20H——2FH的字节空间(00H——7FH的位地址空间)).(不得不说8051的地址重叠搞得人...

weixin_34086545的博客 1850

ITK-snap医学图像标注方法(超级详细)——保姆级

医学3D图像标注方法,非常详细,保姆级

jialiyk的博客 3万+

基于matlab的CNN手写数字图像矫正系统

CNN 是一款强大的图像特征抽象和提取工具,常用于图像分类识别,并取得了较为理想的效果。我们通过 MATLAB 可以方便地设计不同结构、不同深度的 CNN 进行图像分类,最后一层一般设置为分类层(ClassificationLayer)进行类别标签的输出。如果我们将最后一层设计为回归层(RegressionLayer),则可以将其应用于对连续数据的预测,这对于曲线拟合、预测分析都有重要的意义。% 自定义 CNN 回归网络结构layers = [% 输入% 卷积% 池化% 池化% 卷积。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 675

51单片机入门(2)LED点亮的背后

上一节提到了51单片机开发环境的搭建,这节我们开始正式进入51单片机的学习——点亮LED。 所有的控制类芯片学习的第一个实践就是点亮LED,这是最简单、最基本的操作,但这个实现过程却可能概括了单片机的整个工作流程,所以要想学好单片机,点灯实验是一定要掌握的。

Super辉sir的博客 1万+

Feature ‘alsa‘ was enabled, but the pre-condition ‘config.unix && !config.qnx && libs.alsa‘ failed解决

这个问题主要是Qt多媒体插件中缺少了ALSA音频库,所以我们需要自行先编译ALSA 在执行./configure的时候,配置项中ALSA为no Qt Multimedia: ALSA ................................... no GStreamer 1.0 .......................... no GStreamer 0.10 ......................... no Video for Linux .............

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 2587

51单片机使用汇编语言点亮LED灯

本篇博客将介绍如何使用汇编语言点亮51单片机上的LED灯,LED闪烁,LED流水灯。

qq_49516462的博客 5163

Logstash安装部署

1. 部署及安装所用的用户不能是root。

lmj3732018的博客 4294

Pytorch实现EdgeCNN(基于PyTorch实现)

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1万+

51单片机学习笔记之点亮LED灯

51单片机点亮实验

Dg24682538000的博客 2828

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态

执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准,机械臂就能准确地移动到摄像头识别的特定像素位置。这种能力是执行精确拾放任务(如分类、堆垛和分拣)的基础,即使在摄像机的确切位置和方向未知的情况下也是如此。机器人-摄像机系统有两种构型:眼在手内和眼在手外。在眼在手内构型中,摄像头直接安装在机器人手臂的末端执行器上。相反,在眼在手的构型中,摄像头固定在一个静止的物体上,机器人手臂在其视野内。

机器人控制与仿真应用 3349

51单片机点亮LED灯、流水灯

51单片机流水灯

qf66668888的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

51单片机:点亮LED灯

单片机萌新,简单记录下自己的学习历程

m0_65205982的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

51单片机编程学习笔记——点亮LED

因为开发板已经帮我们把很多元器件和引脚连接好了,而我们当前关注的重点不是接引脚,而是编程,所以我们选择购买开发板。下面是我购买板子的商家提供的地址:pwd=1234 提取码:1234。

方亮的专栏 1241

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【51单片机】点亮一个LED

51单片机入门学习之点亮一盏LED小灯

m0_73665080的博客 3177

51单片机教程(四)- 点亮LED灯

LED灯,点亮LED灯

Oblning的博客 2306

【51单片机】点亮LED灯(四种形式)

中文名:发光二极管。 英文名:Light Emitting Diode。 简称:LED。 应用:LED显示屏、交通信号灯、广告灯、液晶屏背光源等。 特点:节能是LED灯最突出的特点、环保、跟其它的灯光源相比之下,LED灯会更加"干净"(干净不是指的是表面,而是这个LED灯它其实是属于一种冷光源)、响应速度快等。

"謓泽"正在路上朝着"攻城狮"方向"前进四"! 4万+

基于51单片机的点亮LED灯

首先我们先来了解一下LED发光二极管,二极管有两个极(正极和负极),要想发光二极管导通点亮,必须要让正极电压>负极电压+二极管导通电压,由开发板的原理图我们可以看出发光二极管的负极通过限流电阻RLED接地为低电平,所以我们只需要让二极管的正极电压为高电平就行了!先来看一下饰演的效果:51单片机点亮LED本篇文章给出了基于51单片机去点亮一个LED灯。下面给出源码地址,欢迎star:github源码文件如果阅读本文对你有用,欢迎一键三连呀!!!您的支持是我最大的动力!nullnull。

soumns丶涛的博客 808

【51单片机】第一个小程序 —— 点亮LED灯

【51单片机】简述单片机,较详述LED,并编写第一个单片机程序

m0_72563041的博客 2494
上一篇: 51 初识单片机
下一篇: 51 数码管
flashier
博客等级 码龄3年 381粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值