STC89C52单片机实现流水灯的三种编程方式详解

效果图

实现流水灯的第一种方式

/*
来回点亮LED的第一种方法
*/
#include <reg52.h>//包含51一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int

void delay_10ms(uchar i)
{
	//毫秒级延时函数
	//在12MHZ下晶振下,大约延时10ms/次
    uchar a,b,c;
	for(c = i; c > 0; --c)
	    for(b = 129; b > 0; b--)
			for(a = 38; a > 0; a--);
}

void main()
{
		
	while(1)
	{
		uchar i,j,led;
		led = 0xfe;//1111 1110 初始化函数
		P1 = led;
		delay_10ms(30);
		for (i=0; i<7; i++)
		{
			led = led << 1 | 0x01;
			P1 = led;
			delay_10ms(30);
		}
		led = 0x7f;
		for (j=0; j<8; j++)
		{
			led = led >> 1 | 0x80;
			P1 = led;
			delay_10ms(30);
		}
	}
}

实现流水灯的第二种方式

/*
循环点亮LED方法二
*/
#include <reg52.h>//包含51一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int

void delay_10ms(uchar i)
{
	//毫秒级延时函数
	//在12MHZ下晶振下,大约延时10ms/次
    uchar a,b,c;
	for(c = i; c > 0; --c)
	    for(b = 129; b > 0; b--)
			for(a = 38; a > 0; a--);
}

void main()
{
	int a[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
				//D0  D1   D2    D3   D4   D5   D6   D7
	int b[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
				//D7   D6  D5   D4    D3   D2   D1   D0
	uint i,j,led;
	while(1)
	{
		delay_10ms(100);//延时100ms
		for (i = 0; i < 8; i++)
		{
			led = a[i];
			P1 = led;
			delay_10ms(50);
		}

		delay_10ms(50);//延时 +50ms
		for (j = 0; j < 8; j++)
		{
			led = b[j];
			P1 = led;
			delay_10ms(50);
		}
	}
}

实现流水灯的第三种方式

/*
循环点灯方法三
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

void delay_10ms(uchar i)
{
	//毫秒级延时函数
	//在12MHZ下晶振下,大约延时10ms/次
    uchar a,b,c;
	for(c = i; c > 0; --c)
	    for(b = 129; b > 0; b--)
			for(a = 38; a > 0; a--);
}

void main()
{
	 uchar temp,i,j;
	 temp = 0xfe;
	 P1 = temp;
	 while(1)
	 {
	 	for (i=0; i<7; i++)
		{
			temp = _crol_(temp,1);
			delay_10ms(30);
			P1 = temp;
		}
		for (j=0; j<7; j++)
		{
			temp = _cror_(temp,1);
			delay_10ms(30);
			P1 = temp;
		}
	 }
}

对于单片位移操作的一些说明

1、左移位操作符:<<
每执行一次左移指令,被操作数将最高位移入单片机PSW寄存器的CY位,CY位中原来数据丢失,最低位补0,其他位依次向左移一位。

2、左移位操作符:<<
每执行一次左移指令,被操作的数将最低位移入单片机PSW寄存器的CY位,CY位中原来的数据丢失,最高位补0,其他位依次向右移一位。

3.循环左移
循环左移,最高位移入最低位,其他位依次左移一位。C语言没有专门的指令,通过移位指令与简单逻辑运算可以实现循环左移,或直接利用c51库函数_crol_实现。

4、循环右移
循环右移,最高位移入最低位,其他位依次右移一位。C语言没有专门的指令,通过移位指令与简单逻辑运算可以实现循环右移,或直接利用c51库函数_cror_实现。

物联沃分享整理
物联沃-IOTWORD物联网 » STC89C52单片机实现流水灯的三种编程方式详解

发表回复