目录
一、先研究原理图:
二、思路梳理:
先让这个灯的第一个亮,然后延时函数,然后再让第二个灯亮第一个灯灭,再延时函数。
比较难的操作:移位。
三、一些说明:
1.头文件的使用:
intrins.h
:这个头文件包含了一些 51 单片机的内置函数,如 _crol_
和 _cror_
函数,用于实现循环左移和循环右移操作。
2.重定义一般这两个一起使用:
typedef unsigned int u16;
typedef unsigned char u8;
3.如果想对整个LED灯操作,就定义整个LED端口
#define
语句将 P2
端口定义为 LED_PORT
,方便后续对 P2 端口进行操作。注意这个后面没有分号。
4.复习延时函数的用法:
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
注意括号中的是10微秒的整数倍。
5.变量定义:
从整个LED灯到单个的,移动控制等操作可以用变量i来控制的时候,i是u8类型的
u8 i=0;
注意i的取值范围,是从0开始的吗,到7还是8呢。
两个i取值不同的原因:
方法一的i=0一开始就是初始状态,0的时候意思是,把1移了零位,就是初始状态。
方法二的i=0,意思是一次位移,这个是次数,i变化一次就会移动一位。
6.记得0是让LED灯亮。
7.函数的使用:
_crol_
函数:
将 LED_PORT
的值循环左移一位
LED_PORT=_crol_(LED_PORT,1);
_cror_
函数:
将 LED_PORT
的值循环右移一位
LED_PORT=_cror_(LED_PORT,1);
8.intrins.h什么时候用这个:
位操作与移位操作:_crol_
和 _cror_
分别用于实现无符号字符型数据的循环左移和循环右移。
空操作函数:_nop_()
函数:该函数用于产生一个机器周期的延时,在一些对时序要求严格的场合,如与外部设备进行通信时,可能需要插入一个短暂的延时来满足时序要求,这时就可以使用 _nop_()
函数。
字节交换函数_swap_()
函数:此函数用于交换一个无符号字符型数据的高 4 位和低 4 位。在一些数据处理场景中,若需要对字节的高低位进行交换,就可以使用该函数。
9.怎么实现移位:
LED_PORT=~(0x01<<i);
一开始直接用0xfe的话就没办法用移位符号。左移运算符 <<
会将二进制数向左移动指定的位数,左边移出的位会被丢弃,右边空出的位用 0
补齐。对二进制数 1111 1110
左移 1
位后,得到 1111 1100
。所以移动的数字就别是0.
四、程序实现:
方法一:
#include <REGX51.H>
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P2
void delay_10us(u16 t)
{
while(t--);
}
void main()
{
u8 i=0;
LED=~(0x01);
delay_10us(5000);
while(1)
{
for(i=0;i<8;i++)
{
LED=~(0x01<<i);
delay_10us(5000);
}
}
}
方法二:
#include <REGX51.H>
#include <intrins.H>
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P2
void delay_10us(u16 t)
{
while(t--);
}
void main()
{
u8 i=0;
LED=~(0x01);
delay_10us(50000);
while(1)
{
for(i=0;i<7;i++)
{
LED=_crol_(LED,1);
delay_10us(50000);
}
for(i=0;i<7;i++)
{
LED=_cror_(LED,1);
delay_10us(50000);
}
}
}