700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)

复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)

时间:2019-06-23 12:48:52

相关推荐

复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)

思路1:

根据流水灯实现原理,即 IO 口由低往高或者由高往低逐个输出低电平特点,那么我们可以将移位操作以及循环结合进来。

进入 main 函数后首先定义一个变量 i,然后进入 while 循环,由于要实现 8个 LED 从 D1->D8 循环点亮,因此可以使用 for 循环语句循环 8 次,每循环一次,点亮的小灯向右移动一个,而 D1-D8 是连接到 P2.0-P2.7 的,因此输出的低电平要左移一位,因此可以使用 LED_PORT=~(0x01<<i);语句实现。0X01<<i 表示 i增加 1 次,0x01 中的 1 就移动多少位,因为 1(高电平)不会让 LED 点亮,需要取反后变为低电平 0 才能点亮,所以最后的结果需要取反后给 LED_PORT 口,并且每次循环都要延时一段时间,这样才能分辨出来 LED 在实现流水灯。

代码如下:

原始代码如下:

#include"reg52.h"

typedef unsigned char u8;

typedef unsigned int u16;

#define LED_PORT P2

void delay_time(u16 ten_us)

{

while(ten_us--);

}

void time()

{

while(1)

{

u8 i=0;

for(i=1;i<=8;i++)

{

LED_PORT=(~0x01<<1);//循环亮灯

delay_time(50000);//延时

}

}

}

思路2:

使用左移_crol_、右移_cror_函数

除了使用 for 循环语句实现移位,KEIL C51 软件内还有对应的移位库函数,

左移函数是_crol_(),右移函数是_cror_(),要使用这两个函数在我们的程序中

必须包含 intrins.h 头文件。这两个移位函数大家可以百度了解下,其内部实现

过程是看不到的,该移位函数实现的移位功能就相当于一个队列内循环移动,如

果是左移,那么最高位就被移到最低位了,次高位变为最高位,依次类推。

代码如下:

原始代码如下:

#include"reg52.h"

#include"intrins.h"

//使用corl和cror函数需要头文件

typedef unsigned char u8;

typedef unsigned int u16;

#define PORT_LED P2

u8 delay_time(u16 ten_us)

{

while(ten_us--);

}

void main()

{

while(1)

{

u8 i=0;

for(i=0;i<=8;i++)//左移

{

PORT_LED=(_crol_(PORT_LED,1));

//crol是左移操作函数,需要传参

//第一个参数是目标值,第二个是移动几个

delay_time(50000);

}

for(i=0;i<7;i++)//右移

{

PORT_LED=(_cror_(PORT_LED,1));

//crol是右移操作函数,需要传参

//第一个参数是目标值,第二个是移动几个

delay_time(50000);

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。