Bootstrap

[单片机]KeilC51简单流水灯制作与原理

P1.单行最简流水灯示例

首先先看原理图,下面为对应解释

  • 最好使用低电平驱动,所谓低电平驱动就是引脚部分为低电平,就如图中电路所示,VCC处于LED右侧,故LED右侧高电平而其左侧低电平,符合条件
  • 这里使用八个LED,自上而下排列, 注意这里我们使用P0口,因为其电压最大方便观察
  • P0口为P0.0-P0.7,所以注意序号的标注!

请添加图片描述


代码时间
这里使用keil C51进行编写,首先看向文件头部

  1. 需要添加头文件<reg51.h>,里面包含了大多数我们需要用到的函数,比如我们接下来要用到的_crol_()函数
  2. 定义两个宏,是为了下文编写数据更加方便
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

编写延迟代码(非常重要!建议牢记!经常使用!)

  1. 特别注意,我们这里t<255是因为uchar类型的最大范围就是0-255,不要溢出了!!!
  2. uint i形参的存在就是为了让我们改变延迟的倍数的
  3. 对应不同的机型,for循环的次数至少要达到20000次,延迟时长才能基本符合人眼观察需要
void delay_ms(uint i)
{
	uchar t;
	while(i--)
	{
		for(t=0;t<255;t++);
	}
}

流水灯主体代码

  1. P0=0xfe代表着激活P0口上的地址为0xfe的子口,因为P0下属有8个孔,而0xfe地址对应的就是P0.0口
  2. 之后进入循环,调用我们的延迟函数并传入实参60,大家可以任意调节
  3. crol(P0,1)表示将P0口的地址左移一位(参一为欲处理的口,参二为移动位数),然后将结果赋予会P0口,以此来达到激活下一个LED的目的
  4. 如此循环往复,必定会回到起始地址0xfe,此刻即形成流水灯

注意区分_crol_()函数和左移符号<<
左移函数_crol_()表示将其高位取出补到低位的左移!
而左移符号<<表示删除高位而低位补零,最终将导致地址全部变成零,解决该问题需要二进制操作,所以我们这里不使用此方法!
(注:与此同时还有_cror_()表示右移,这和下一个流水灯案例有关)

void main()
{
	P0=0xfe;
	while(1){
		delay_ms(60);
		P0=_crol_(P0,1);
	}
}

这是完整的代码

#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

void delay_ms(uint i)
{
	uchar t;
	while(i--)
	{
		for(t=0;t<255;t++);
	}
}

void main()
{
	P0=0xfe;
	while(1){
		delay_ms(60);
		P0=_crol_(P0,1);
	}
}

之后返回proteus,双击单片机,弹出窗口的program file选择我们刚刚编译好的hex文件即可,确认以后点击proteus左下角播放即可看到结果



;