单片机:流水灯

文章介绍了如何使用STC89C52单片机的P2接口控制灯的亮灭,通过逐位设置为0的方法,以二进制减法来实现。给出的代码示例展示了如何动态改变接口电平,使得相应位置的灯亮起,每次将一位设为0,通过延时函数控制闪烁节奏。

STC89C52单片机中P2接口是8位接口,每一位接口中1表示高电平,0表示低电平,只有当是低电平时电路导通灯才会亮,列表来看

0/10(亮)1(不亮)
0/10(亮)1(不亮)
0/10(亮)1(不亮)
0/10(亮)1(不亮)
0/10(亮)1(不亮)
0/10(亮)1(不亮)
0/10(亮)1(不亮)
0/10(亮)1(不亮)

现在我们思考一下如何将每一位依次变为0,我们想到11111111,这是一个2进制数255,11111111减去2^0(1)可以将最后一位变成0即11111110,此时最后一位所控制的灯是亮的,11111111减去2^1可以将倒数第二位变成0即11111101;依此类推想让哪一位变成0只需要11111111减去对应的2^n即可(注:11111111指二进制数字

有了这样的思路,我们可以写出如下代码

#include <REGX52.H>
#include <INTRINS.H>//_nop_();的原型所在的头文件
void Delay1000ms()//延时函数		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 154;
	k = 122;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void main()
{
	int x=1,count=0xff;
	P2=count-x;
	x*=2;
	while(1){
		if(P2-x<0){//重置
			x=1;
		}
		Delay1000ms();//延时
		P2=count-x;//对应位变0(亮指定的灯)
		x*=2;
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值