单片机教程(五):流水灯实验原理及实践(三种方法)

**切己工夫只恨少,会心言语岂须多。-明•冯从吾**

单片机教程(五):流水灯实验原理及实践(三种方法)

  • 一、理论教程
  • 二、实践教程
    • 方法一:循环
    • 方法二:位移运算符
    • 方法三:调用库函数

一、理论教程

我们知道使这个Led灯亮起时给的为低电平,比如要让Led1亮起就写入P1^0 = 0;
而我们要实现流水灯操作,则需要使得每一个电平依次为0,同时其他灯的电平为高电平也就是1
同时因为视觉暂留原理,我们必须使用延时函数进行延时
延时函数可以通过stc-isp软件进行生成

Led灯亮起原理详见>>单片机教程(三):点亮LED理论及实践教程

stc-isp烧录软件下载地址:https://wwmi.lanzouo.com/ik6i01mcentc
密码:cxcx

二、实践教程

方法一:循环

使用每次都进行Led灯的配置,书写复杂

#include 
#include 
 
void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

 
void main()
{
	while(1)
	{
	   P1 = 0xFE;//1111 1110
		    Delay1000ms();
		P1 = 0xFD;//1111 1101
			Delay1000ms();
		P1 = 0xFB;//1111 1011
			Delay1000ms();
		P1 = 0xF7;//1111 0111
			Delay1000ms();
		P1 = 0xEF;//1110 1111
			Delay1000ms();
		P1 = 0xDF;//1101 1111
			Delay1000ms();
		P1= 0xBF;//1011 1111
			Delay1000ms();
		P1 = 0x7F;//0111 1111
			Delay1000ms();
	}
		
}

方法二:位移运算符

<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

注意:移位运算符的操作数不能为负数,如 Num >> -1 错误

#include 
#include 
unsigned char k=0;

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void main(void)
{
	while(1)
	{
		P1 = ~(0x01 << k);
		Delay500ms();
		k  = k<=8?k+1:0;
	}
}

方法三:调用库函数

函数名 作用
_crol_(a,b) 将a进行b位的左位移
_cror_(c,d) 将c进行d位的右位移
特点:循环时,从右边出去会从左边重新补入,从左边出去会从右边重新补入
#include 
#include 
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

 
void main()
{
	P1 = 0xFE;
	while(1)
	{
		Delay500ms();
		P1 = _crol_ (P1, 1);
	}
}

三种代码的文件—>https://download.csdn.net/download/chenxing631/88795991
---->>>51单片机教程资料汇总

你可能感兴趣的:(51单片机教程,单片机,嵌入式硬件,学习,51单片机,经验分享)