[单片机]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左下角播放即可看到结果



  • 48
    点赞
  • 270
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zhillery

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

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

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

打赏作者

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

抵扣说明:

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

余额充值