目录
(1)在单片机中,unsigned int 常用于以下场景:
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);
}
}