51单片机Day03---让一个LED灯闪烁

目录

1.研究原理图:

2.一些小知识(重定义的使用):

[(1)在单片机中,unsigned int 常用于以下场景:](#(1)在单片机中,unsigned int 常用于以下场景:)

[(2)unsigned char:](#(2)unsigned char:)

3.思路构造:

4.代码完成:

5.出现的问题:

(1)延时函数:

(2)重定义的使用举例说明:

(3)更完善:

6.代码完善并实现:


1.研究原理图:

先找到本实验要用到哪一块:

2.一些小知识(重定义的使用):

(1)在单片机中,unsigned int 常用于以下场景:

循环计数 :在编写循环语句时,用于记录循环执行的次数。比如通过 for 循环控制 LED 闪烁特定次数,unsigned int 可确保计数值始终为非负数。

事件计数 :统计外部事件发生的次数,像记录按键被按下的次数、传感器触发的次数等 。例如,用单片机检测按钮按下次数并在数码管上显示,就可使用 unsigned int 类型变量来记录次数。

数组索引:用于访问数组元素时指定索引位置,索引必然是从 0 开始的非负整数,unsigned int 能满足此需求。比如在单片机采集温度数据并存储在数组中,后续要访问数组中特定位置的数据时,索引就可用 unsigned int 类型 。

延时函数参数:在编写延时函数时,常使用 unsigned int 类型参数来指定延时时间。

存储测量数据:当单片机采集传感器数据(如温度、湿度、压力等 ),若数据不需要表示负数,可使用 unsigned int 存储。例如,采集温度传感器数据,温度值不会出现负数(在特定测量场景下 ),就可以用 unsigned int 存储测量值。

数据传输计数 :在进行数据通信时,统计发送或接收的数据字节数等,unsigned int 可用来记录数据量,确保计数为非负。

(2)unsigned char:

(本题中并未用到unsigned char,之后若用到会再提)

ASCII 码存储 :在处理字符相关操作时,可用来存储 ASCII 码字符。ASCII 码表中字符编码范围是 0 - 127(扩展 ASCII 码到 255 ),unsigned char 能完整覆盖。比如在单片机串口通信中,接收或发送的字符数据常用 unsigned char 存储。

字符串操作 :单片机中表示字符串时,每个字符元素通常用 unsigned char 类型。如定义字符串 unsigned char str[] = "Hello"; ,通过对数组中 unsigned char 类型元素操作,可实现字符串的显示、比较、复制等功能 。

直接操作字节位unsigned char 只有 8 位,可方便对这 8 位进行位操作,如与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)等。比如控制一个 8 位的 LED 灯组,每个灯的亮灭状态对应一位,用 unsigned char 变量表示灯组状态,通过位操作就能轻松控制各灯亮灭 。

串口通信数据传输 :在串口通信中,每次传输的数据单元通常是 8 位(1 字节 ),unsigned char 正好适配。无论是发送端将数据按字节发送,还是接收端按字节接收数据,都常用 unsigned char 存储。

SPI、I2C 等通信协议 :这些通信协议传输的数据也常以字节为单位,使用 unsigned char 存储传输数据,便于与协议规范匹配,实现数据的正确收发和处理 。

3.思路构造:

先选择一个LED灯,进行重定义,延时函数,主函数。

主函数思路:

让这个灯亮,然后调用延时函数,再让这个灯灭,再调用延时函数。

4.代码完成:

#include <REGX51.H>

sbit LED=P2^2;

typedef unsigned int u16;

typedef unsigned char u8;

void delay(u16 t)(这里有问题!!!)

{

while(t--);

}

void main()

{

LED=0;

delay(5000);

LED=1;

delay(5000);

}

5.出现的问题:

(1)延时函数:

本人这样写会导致延时的时间不固定

void delay_10us(u16 t)
{
while(t--);
}

这样写比较好,意思是10微秒的倍数,也就是说,u16后面会是一个非负的整数,整个句子的含义就是多少个10微秒。

(2)重定义的使用举例说明:

typedef(注意拼写) unsigned int u16;

这就像C语言一样,u16就像一个变量类型名字,之后可以把他当成一个类型。

类比C语言:int a;(定义变量时)

(3)更完善:

可以让灯的亮灭在一个循坏之中

6.代码完善并实现:

#include <REGX51.H>

sbit LED=P2^2;

typedef unsigned int u16;

typedef unsigned char u8;

void delay_10us(u16 t)

{

while(t--);

}

void main()

{

while(1)

{

LED=0;

delay_10us(5000);

LED=1;

delay_10us(5000);

}

}

相关推荐
广药门徒27 分钟前
PADS 为什么router里面两元件放置在一个地方不会报错
嵌入式硬件
振浩微433射频芯片3 小时前
433MHz在智能家居中的应用大全(二):智能安防篇——安全不容“信号死角”
网络·单片机·嵌入式硬件·物联网·智能家居
dadaobusi3 小时前
手搓单片机
单片机
xingzhemengyou14 小时前
STM32 CAN总线通信:从原理到实战开发指南
stm32·单片机·嵌入式硬件
游乐码4 小时前
c#泛型约束
开发语言·c#
weixin_446023565 小时前
C语言:面向过程、应用底层开发、跨平台的通用程序设计语言
c语言·跨平台·数据类型·底层开发·面向过程
辰哥单片机设计5 小时前
STM32项目分享:宠物喂食(蓝牙升级版)
stm32·嵌入式硬件·宠物
hoiii1875 小时前
C# 基于 LumiSoft 实现 SIP 客户端方案
前端·c#
FreakStudio5 小时前
MicroPython LVGL基础知识和概念:底层渲染与性能优化
python·单片机·嵌入式·电子diy
无敌昊哥战神6 小时前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法