【单片机基础】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_实现。
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明n.n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值