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

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 intconst 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 --> 0x55P1 = 0x55;       while (1)       // 主循环中添加其他需要一直工作的程序{}
}

4、提示

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

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

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

相关文章

青训1_1105_03 最小替换子串长度

.md 文章目录 请添加图片描述一 问题描述测试样例示例 二 思路个人思路(ERROR)思路&#xff08;right&#xff09; !!解题思路 详细答案三、理解1、 理解嵌套循环:也就是连续子串的所有可能性位置-看懂了2、问题又来了&#xff0c;即使确定了能得到不同长度连续子串&#xff0c…

222页PPT集团公司供应链管理SOP计划管理流程规划

S&OP&#xff08;Sales & Operations Planning&#xff09;&#xff0c;即销售与运营计划&#xff0c;也被称为产销协同&#xff0c;是一种综合性的企业管理方法。以下是对S&OP计划管理流程规划的详细内容&#xff1a; 一、S&OP的基本概念与目的 S&OP是一…

第三十五篇:HTTP报文格式,HTTP系列二

HTTP 是超⽂本传输协议&#xff0c;也就是HyperText Transfer Protocol。 前面我们讲到第三章中网络协议的定义&#xff0c;网络协议的定义&#xff1a;网络协议是通信计算机双方必须共同遵从的一组约定。就像两个人要进行交流&#xff0c;如果不制定一套约定&#xff0c;一方…

华夏教育集团《梦回延安》全国巡演河南站纪实

传承红色精神&#xff0c;推动中国式家校共育。日前&#xff0c;由华夏教育集团太阳谷华夏学校携手河南少年先锋学校、世纪先锋学校联合推出的大型红色舞台剧《梦回延安》在河南省人民会堂精彩亮相。 河南是中华文明的发祥地之一&#xff0c;此次《梦回延安》舞台剧首次走出辽宁…

Idea如何推送项目到gitee

第一步&#xff1a;先在你的gitee创建一个仓库 第二步&#xff1a; 点击推送 点击定义远程&#xff0c;将URL换成你仓库的&#xff0c;填好你的用户名和密码 可以看到已经推送到仓库了

Leecode:977. 有序数组的平方

题目 ——Leecode:977. 有序数组的平方 目录 题目 ——Leecode:977. 有序数组的平方 题目分析 暴力解法&#xff1a; 双指针解法&#xff1a; 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排…

动态规划-两个数组的dp问题——44.通配符匹配

1.题目解析 题目来源&#xff1a;44.通配符匹配——力扣 测试用例 2.算法原理 1.状态表示 本题属于两个数组的dp问题&#xff0c;这里需要使用p中的字符消去s中的字符且p中有特殊字符可以匹配s中的普通字符&#xff0c;属于寻找相同子序列的变式&#xff0c;所以需要一个二维d…

Linux命令 - 目录与文件基本操作

文章目录 1 文件系统树2 几个特殊的目录3 绝对路径与相对路径4 文件系统中跳转与浏览4.1 文件系统中跳转4.2 查看目录内容4.2.1 ls命令详解4.2.2 确定文件类型示例 5 操作目录与文件5.1 强大的通配符5.2 复制目录/文件5.3 移动/重命名目录/文件5.4 删除目录/文件5.5 创建目录5.…

基于STM32的自动化植物浇灌系统教学

引言 随着城市化进程的加快&#xff0c;越来越多的人开始关注家庭园艺与植物养护。基于STM32的自动化植物浇灌系统可以帮助用户在忙碌的生活中顺利管理植物的水分需求。本教学文章将指导您如何利用STM32构建一个简单实用的植物浇灌系统&#xff0c;实现自动浇水功能。 环境准备…

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年

自2019年5G牌照发放开始&#xff0c;经过五年发展&#xff0c;我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩&#xff0c;5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示&#xff0c;5G行业应用已融入76个国民经…

【CRM系统选型指南:国内八大主流工具比较】

本文将对十大主流CRM系统进行比较&#xff1a;纷享销客、Zoho CRM、Pipedrive、简信CRM、HubSpot CRM、八百客CRM、金蝶CRM、浪潮CRM、销售易CRM 本文将深入评比2024年主流的CRM系统&#xff0c;帮助你了解各系统之间的主要区别、优缺点以及当前的发展趋势。通过详细的比较和分…

node.js的exports使用误区解释

exports和module.exports指向同一个对象&#xff0c;最终共享的结果&#xff0c;以module.exports指向的对象为准。 exports 和 module.exports 使用误区 使用require()导入的模块&#xff0c;使用的永远是module.exports指向的对象 实例1 exports.age 23 module.exports {n…

Maven项目的基础配置:利用IDEA将SpringBoot的项目打包成war文件

文章目录 引言Maven项目的聚合与继承(依赖管理)把项目打包成war包其他打包配置引言 利用IDEA将SpringBoot的项目打包成war文件Maven项目的聚合与继承(依赖管理)Maven项目的聚合与继承(依赖管理) 把项目打包成war包 利用IDEA将SpringBoot的项目打包成war文件:要配置启动…

Nuxt.js 应用中的 nitro:config 事件钩子详解

title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…

51c大模型~合集14

我自己的原文哦~ https://blog.51cto.com/whaosoft/11603879 # LLM 结构化数据生成原理 如何结合人工规则让 LLM 输出符合 JSON 格式的数据。 目前 LLM&#xff08;Large Language Model&#xff09;从文本补全到内容创作&#xff0c;都展示出了强大的生成能力。然而通过 L…

CSRA的LINUX操作系统24年11月2日下午上课笔记

压缩和解压缩&#xff1a;zip 、gzip、bz、xz # zip 压缩 # 压缩文件夹 # 解压缩 # unzip -v 查看压缩包中的内容 # bzip2 dir1/* :将dir1中的所有文件压缩 # gzip # 压缩文件夹 # 解压缩 tar 归档命令&#xff1a; # 创建tar包 tar -c*f # 释放tar包 tar -xf[c] # c …

MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符

一、问题 MyBatis 返回 Map 或 List时&#xff0c;时间类型数据&#xff0c;默认为LocalDateTime Springboot 响应给前端的LocalDateTime&#xff0c;默认含有’T’字符&#xff0c;如何统一配置去掉 二、解决方案 1、创建配置类&#xff0c;对ObjectMapper对象进行定制&am…

数据结构算法篇--递归(c语言版)

目录 1.递归 1.1求阶乘&#xff1a; 1.2.斐波那契数 1.3. 求幂 1.递归 在C语言中&#xff0c;递归是一种函数调用自身的方法&#xff0c;用来解决一些具有重复性质的问题。例如&#xff0c;计算阶乘、斐波那契数列等问题都可以通过递归实现。 递归在书写的时候&#xff0…

在vue3的vite网络请求报错 [vite] http proxy error:

在开发的过程中 代理proxy报错: [vite] http proxy error: /ranking/hostRank?dateType1 Error: connect ETIMEDOUT 43.xxx.xxx.xxx:443 网络请求是http的: // vite.config.ts import { Agent } from node:http;server: {host: 0.0.0.0,port: port,open: true,https: false,…

西南科技大学C++作业1——组合依赖关系实验代码

目录 一、实现效果预览 二、实验要求 三、实现代码 book.h book.cpp borrow.h borrow.cpp library.h library.cpp student.h student.cpp main.cpp 一、实现效果预览 二、实验要求 作业1:类与类关系设计(组合或依赖) 目 的: 1) 巩固类的定义,成员变量、成员方…