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

news2024/11/5 19:44:35

1、项目分析

  • 让输入/输出口的P1.0连接一盏LED灯进行点亮。

2、技术准备

1 LED组成

在这里插入图片描述

  • 说明
    • 二极管有 P型 和 N型材料构成,通常是:硅/锗 掺杂其他元素(硼、磷等)
      • 电子是带负电的,是负电荷的载体,电子流是从负极流向正极
      • 电流则从正极流向负极。
    • 当N型材料连接电源负极(正向连接),则电子会从流向P型材料的空穴,则会有电流流过【正向偏置】;
    • 当N型材料连接电源正极(反向连接),由于没有多余的空穴,则不会有电子跃迁至P型材料,则不会有电流流过【反向偏置】;
    • 则说明二极管具有单向导电的特性
  • 扩展
    • 如果二极管是由 硅 制成,需要一个约 0.7V的电压,才会有电流流过,则即便是二极管正向连接,也不会有电流流过。
    • 如果二极管是由 锗 制成,需要一个约 0.3V的电压,才会有电流流过,则即便是二极管正向连接,也不会有电流流过。
    • 如果反向链接,则不同材质的二极管所能承受的电压,可以高达 100V,电流可达 1A

2 介绍

  1. LED发光二极管

    • 它是半导体二极管的一种,可以把电能转化成光能;常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。
  2. LED的工作原理。

    • LED的工作是有方向性的,只有当正级接到LED阳极,负极接到LED的阴极的时候才能工作,如果反接LED是不能正常工作的。

      在这里插入图片描述

  3. LED的原理图解析

    • 开发板上面LED的原理图如右图,LED的阳极串联一个电阻,然后连接到电源VCC,而LED的阴极连接到单片机的P1口,如果你想点亮一盏LED就对把单片机相对应的IO赋为低电平(0)。

      在这里插入图片描述

3 C语言知识点

1 标识符

  • 标识符:

    • 用来标识源程序中某个对象的名字,这些对象可以是数据类型名、函数名、变量名、数组名等。
  • 组成

    1. 标识符由字母、数字和下划线组成。
    2. 第一个字符必须是字母或下划线。
    3. 不能使用C语言中的关键字。
    4. 由于C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名标识符。
    // 正确标识符
    name    Name  num1   oldName
        
    // 错误标识符
    3ku    
    

2 关键字

  • 标准C语言定义了32个关键字
    在这里插入图片描述

  • 常用关键字
    • char
    • int
    • unsigned
    • for
    • while
    • if
    • sbit
    • interrupt

3 变量与常量

  • 常量

    • 又称为标量,它的值在程序执行过程中不能改变的量,常量的数据类型有整型、浮点型、字符型和字符串型等。

    • 实际使用中用 #define定义(宏定义)const 在程序中经常用到的常量,这样一方面有助于提高程序的可读性,另一方面也便于程序的修改和维护。

       #define PI 3.14		               //以后的编程中用PI代替浮点数常量3.14,便于阅读
       #define SYSCLK 12000000	           //长整型常量用SYSCLK代替12MHz时钟
       #define TRUE  1			           //用字符TRUE,在逻辑运算中代替1
       #define STAR '*'			           //用STAR表示字符 '*'
       #define uint unsigned int	       	   //用uint 代替unsigned int
       
       const int MAX_SIZE = 100;
      

  • 变量

    • 变量是一种在程序执行过程中,其数值不断变化的量。
  • 注意

    • C51规定变量必须先定义后使用

      unsigned int i;
      i = 10;
      printf("i=%d", i);
      
      unsigned int i = 10;
      

4 数据类型

  • 变量都有相应的数据类型。

    在这里插入图片描述


  • char 字符类型

    • char 类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。
    • 分无符号字符类型 unsigned char 和有符号字符类型 signed char,默认值为 signed char 类型。
      • unsigned char 类型用字节中所有的位来表示数值,所能表达的数值范围是 0~255。
      • signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128~+127。
      • unsigned char 常用于处理 ASCII 字符或用于处理小于或等于 255 的整型数。

  • int 整型

    • int 整型长度为两个字节,用于存放一个双字节数据。
    • 分有符号 int 、整型数signed int 和无符号整型数 unsigned int,默认值为 signed int 类型。
    • signed int 表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。
    • unsigned int 表示的数值范围是 0~65535。

  • long 长整型

    • long 长整型长度为四个字节,用于存放一个四字节数据。
    • 分有符号 long 长整型 signed long 和无符号长整型 unsigned long,默认值为 signed long 类型。
    • signed int 表示的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。
    • unsigned long 表示的数值范围是 0~4294967295。
  • float 浮点型

    • float 浮点型在十进制中具有 7 位有效数字,是符合 IEEE-754 标准的单精度浮点型数据,占用四个字节。

  • 指针型

    • 指针型是一种特殊的数据类型,其本身就是一个变量,但在其中存放的是另一个数据的地址。

    • 在C51中,指针的长度一般是3个字节。根据所指向的变量类型的不同指针变量也有不同的类型,指针变量的类型也就表示了该指针指向的地址中的数据的类型。


  • bit 位标量

    • bit 位标量是C51的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。

    • 它的值是一个二进制位,不是 0 就是 1,位变量的值可以取0 (false)或1 (true)。对位变量进行定义的语法如下:

      bit flag1;
      bit send_en=1;
      

  • sfr 特殊功能寄存器

    • 单片机内的各种控制寄存器、状态寄存器以及I/O端口锁存器、定时器、串行端口数据缓冲器是内部数据存储器的一部分,离散地分布在80H~FFH的地址空间范围内,这些寄存器统称特殊功能寄存器(SFR,Special Function Registers )。

    • sfr类型的长度为一个字节,其定义方式如下:

      • sfr 特殊功能寄存器名 = 地址常量;
    • 说明

      • “地址常量”就是所定义的特殊功能寄存器的地址。

        sfr	TMOD=0x89;		/*定义定时器/计数器方式控制寄存器TMOD的地址为89H*/
        sfr	P1=0x90;	          /*定义P1口的地址为90H*/
        
    • 注意

      • 在关键字sfr后面必须是一个名字,名字可以任意选取,但应符合一般的习惯。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H~0FFH)。

  • sfr16 16位特殊功能寄存器

    • 在新一代的8051单片机中,特殊功能寄存器在功能上经常组合成16位来使用。

    • 为了有效地访问这种16位的特殊功能寄存器,可采用关键字sfrl6。

    • sfrl6类型的长度为两个字节,其定义语法与8位SFR相同,但16位SFR的低端地址必须作为sfr16的定义地址.

      sfr16 T2=0CCH;       //定义TIMER2,其地址为T2L=0CCH、T2H=0CDH。
      

  • sbit 可寻址位

    • sbit 同样是C51中一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址位或特殊功能寄存器中的可寻址位。例如:

      // PSW是可位寻址的SFR,其中各位可用sbit定义。
      sbit CY=0Xd7;		/*定义进位标志CY的地址为D7H*
      sbit AC=0xD0^6;		/*定义辅助进位标志AC的地址为D6H*/
      sbit RS0=0XD0^3;	/*定义RS0的地址为D3H*/
      
    • 注意

      • sfr和sbit只能在函数外使用,一般放在程序的开头

      • 实际上大部分特殊功能寄存器及其可位寻址的位的定义在reg51.h、reg52.h 等头文件中已经给出,使用时只需在源文件中包含相应的头文件,即可使用SFR及其可位寻址的位;而对于未定义的位,使用前必须先定义。例如:

        #include<reg52.h>
        
        sbit P10=P1^0;
        sbit P12=P1^2;
        
        PSW=0x08;
        

3、程序实现

实验1:点亮开发板上的第1个LED灯

  • 从LED原理图上看,只要P1.0输出为低电平就可以点亮LED灯。
#include <reg52.h>   // 包含头文件,在“reg52.h”上右键单击,并打开,可以看到它里面的定义
                  
sbit led=P1^0;   // 定义一个LED 为P1.0 IO口

void main()     
{  
    led=1;    // 单片机IO P1.0脚输出一个高电平,发光管不亮
	led=0;    // 单片机IO P1.0脚输出一个低电平,点亮发光管。 高电平(1)为5V  低电平为0。
	while(1);
}
  • 实验效果

    • 软件设计不用汇编,一律采用C语言,便于理解和扩展。

    在这里插入图片描述

实验2:点亮开发板上的4个LED灯(第1、3、5、7个灯)

#include "reg52.h" 

sbit led1=P1^0;	
sbit led3=P1^2;
sbit led5=P1^4;
sbit led7=P1^6;								  

void main()
{
	led1=0;	   //参照电路图可知,P1^0为低电平,可以让led1点亮。
	led3=0;
	led5=0;
	led7=0;
	while(1);   //此处设置一个死循环,让程序停留在这里,防止跑飞。
}
#include<reg52.h> 

sbit LED0=P1^0; // 用sbit 关键字 定义 LED到P1.0端口,
sbit LED1=P1^1; 
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main ()
{
                  //此方法使用bit位对单个端口赋值
	LED0=0;     //将P1.0口赋值 0,对外输出低电平
	LED1=1;
	LED2=0;
	LED3=1;
	LED4=0;
	LED5=1;
	LED6=0;
	LED7=1;
	while (1)         //主循环
	{
	                  //主循环中添加其他需要一直工作的程序
	}
}

实验3:点亮开发板上的4个LED灯(第2、4、6、8个灯)

  • 定义所有端口: P1、P2、P3、P4,用来表示 P1、P2、P3、P4 的 I/O 口。

    IO口P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0
    取值01010101
    效果
  • 思考:P1 数据值转为十六进制是多少? ox55

#include <reg52.h> 

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
    // 0101 0101 --> 0x55
    P1 = 0x55;       

    while (1)       // 主循环中添加其他需要一直工作的程序
    {}
}

4、提示

  • 为了方便每次程序编译成功后,就自动把 hex 文件烧录到MCU中,则可以勾选图中2个选项。
    在这里插入图片描述

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

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

相关文章

开源库 FloatingActionButton

开源库FloatingActionButton Github:https://github.com/Clans/FloatingActionButton 这个库是在前面这个库android-floating-action-button的基础上修改的&#xff0c;增加了一些更强大和实用的特性。 特性&#xff1a; Android 5.0 以上点击会有水波纹效果 可以选择自定义…

Ubuntu 24.04上启用 root 用户通过 SSH 和图形界面进行登录

一、启用 root 用户的密码登录 设置 root 用户密码&#xff1a; 在终端中输入以下命令为 root 用户设置一个密码&#xff1a; testtest-virtual-machine:~$ sudo passwd root [sudo] test 的密码&#xff1a; 新的密码&#xff1a; 无效的密码&#xff1a; 密码是一个回文…

深度学习基础知识-损失函数

目录 1. 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2. 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09; 3. Huber 损失 4. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 5. KL 散度&#xff08;Kullback-Leibler Divergence&…

基于vue框架的的考研信息共享平台v0eyp(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;国家政策,用户,院校政策,院校信息,考研资料,资料分类,考研论坛 开题报告内容 基于Vue框架的考研信息共享平台开题报告 一、研究背景与意义 随着考研人数的逐年增长&#xff0c;考研学生对高效、便捷、个性化的信息获取需求愈发强烈。…

区别:矩阵合同和矩阵酉相似

矩阵的合同和酉相似在许多方面具有相似性&#xff0c;但也有明显的区别。 定义 矩阵合同&#xff1a;给定矩阵 A 和 B &#xff0c;若存在一个非奇异矩阵 P &#xff0c;使得 则称矩阵 A 和 B 是合同的。合同变换常用于实对称矩阵的特征问题等。 酉相似&#xff1a;给定矩阵 …

海的回忆:海滨学院班级记忆录技术实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

半个月,练完这50个Python实战项目你就牛了!

今日精选50个Python实战项目&#xff0c;边做边学&#xff0c;让Python技能突飞猛进&#xff01; 好记性不如烂笔头&#xff0c;实践是提升技能的王道&#xff01;这70个项目涵盖广泛&#xff0c;难度亲民&#xff0c;特别适合Python新手入门与进阶。它们不仅实用性强&#xf…

贪心算法习题其三【力扣】【算法学习day.20】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

【Python游戏开发】石头剪刀布游戏(附完整Python完整代码)

石头剪刀布游戏:Pygame实现 结果图前言核心函数思考步骤实现原理和公式代码实现结论结果图 前言 石头剪刀布是一种经典的猜拳游戏,简单易玩但却蕴含着一定的策略性。本文将介绍如何使用Python和Pygame库开发一个简单的石头剪刀布游戏,并探讨其中的核心功能实现和思考过程。 …

Python | Leetcode Python题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution:def countArrangement(self, n: int) -> int:f [0] * (1 << n)f[0] 1for mask in range(1, 1 << n):num bin(mask).count("1")for i in range(n):if mask & (1 << i) and (num % (i …

阿里云k8s-master部署CNI网络插件遇到的问题

问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件&#xff0c;可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行&#xff0c;k8s-master都是Not ready的状态 ca…

【数据结构与算法】第8课—数据结构之二叉树(堆)

文章目录 1. 树1. 什么是树&#xff1f;1.2 树的相关概念1.3 树的表示法 2. 二叉树2.1 特殊的二叉树2.2 二叉树的性质2.3 二叉树的存储结构 3. 实现顺序结构二叉树3.1 堆的概念3.2 堆的实现3.2.1 堆的数据结构3.2.2 堆的初始化3.2.3 堆插入数据3.2.4 删除堆顶数据3.2.5 堆的判空…

基于MATLAB人脸检测的汽车疲劳驾驶检测

课题介绍 疲劳驾驶导致汽车交通事故逐年增加&#xff0c;为了提升驾车的安全性&#xff0c;需对驾驶员疲劳状态实时监测并及时提醒. 为了提高疲劳驾驶判断效率及准确率&#xff0c;本文运用Viola-Jones 框架特征矩阵进行人脸预判断&#xff1b;预判断过程中为了减少Haar 值计算…

【p2p、分布式,区块链笔记 Torrent】WebTorrent的上传和下载界面

上传 upload.html client.seed <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件上传与哈希值&l…

vue3uniapp实现自定义拱形底部导航栏,解决首次闪烁问题

前言&#xff1a; 我最初在网上翻阅查找了很多方法&#xff0c;发现大家都是说在page.json中tabbar中添加&#xff1a;"custom": true,即可解决首次闪烁的问题&#xff0c;可是添加了我这边还是会闪烁&#xff0c;因此我这边改变了思路&#xff0c;使用了虚拟页面来解…

软考系统分析师知识点三一:案例知识点二

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 倒计时&#xff1a;6天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第三阶段&#xff1a;总结案例知识点&#xff0c;并作为论文的框架知识…

WorkFlow源码剖析——Communicator之TCPServer(上)

WorkFlow源码剖析——Communicator之TCPServer&#xff08;上&#xff09; 前言 上一篇博客已经介绍了一下WorkFlow GO-Task的实现原理。本文会介绍一下WorkFlow Tcp Server端的一些实现细节以及有趣的思想。因为这部分涉及的内容有点多&#xff0c;一些有趣的细节也希望能完…

嵌入式硬件电子电路设计(一)开关电源Buck电路

目录 Buck电路基本结构 1. 开关闭合&#xff08;SW 闭合&#xff09; 2. 开关断开&#xff08;SW 断开&#xff09; 3. 开关控制和占空比 MP1584电路分析 其他Buck芯片的电路参考 Buck电路基本结构 下图是简化之后的BUCK电路主回路。下面分析输出电压的产生K闭合后&…

UE4_Niagara基础实例—13、通过纹理采样来创造粒子

效果&#xff1a; 知识点&#xff1a; 1、纹理采样目前仅支持GPU粒子运行&#xff08;Texture sampling is only supported on the GPU at the moment.&#xff09; 2、网格位置输出每个粒子在网格中的归一化位置。我们使用该值来采样纹理&#xff0c;就像它是UV一样&#xff…

多个锚点定位时的锚点优选方法(附公式和python代码讲解)

以下是将上述 MATLAB 代码转化为 Python 代码的版本。我们使用 NumPy 库进行数值计算&#xff0c;并使用 itertools 库生成锚点组合。 1. 基于几何分布的选择 锚点的几何分布影响定位的可辨识性。选择位置均匀分布的锚点组合可以提高定位精度。具体来说&#xff0c;锚点之间的…