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

目录

1.研究原理图:

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

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

(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);
  }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值