单片机Day04---流水灯

发布于:2025-04-17 ⋅ 阅读:(79) ⋅ 点赞:(0)

目录

一、先研究原理图:

二、思路梳理:

三、一些说明:

1.头文件的使用:

2.重定义一般这两个一起使用:

3.如果想对整个LED灯操作,就定义整个LED端口

4.复习延时函数的用法:

5.变量定义:

两个i取值不同的原因:

6.记得0是让LED灯亮。 

7.函数的使用:

_crol_ 函数: 

_cror_ 函数:

 8.intrins.h什么时候用这个:

9.怎么实现移位:

四、程序实现:

方法一:

方法二:


 

一、先研究原理图:

二、思路梳理:

先让这个灯的第一个亮,然后延时函数,然后再让第二个灯亮第一个灯灭,再延时函数。

比较难的操作:移位。

三、一些说明:

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


网站公告

今日签到

点亮在社区的每一天
去签到