单片流水灯

流水灯代码

#include<REGX51.H>
#include <INTRINS.H>

int main()
{

	while(1)
	{
	P0=0XFE;
	for(i=0;i<30000;i++);
	P0=0XFD;
	for(i=0;i<30000;i++);
	P0=0XFB;
	for(i=0;i<30000;i++);
	P0=0XF7;
	for(i=0;i<30000;i++);
	P0=0XEF;
	for(i=0;i<30000;i++);
	P0=0XDF;
	for(i=0;i<30000;i++);
	P0=0XBF;
	for(i=0;i<30000;i++);
	P0=0X7F;
	for(i=0;i<30000;i++);
	}
}

这里的流水灯的延迟时间是确定的,如果我们想要一个可以自定义流水灯延时时间的过程。这时就需要我们对延迟程序的优化;

void Delayms(unsigned int xms)   
{

	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
			
		}
		while(--i);
		xms=xms-1;
	}


}

我们自定义一个延迟函数,在代码中引用,便可以达到我们想要的效果;

在延迟程序中,对自定义的变化中,相比于定义成unsigned int 变量。在单片机中定义成unsigned  char型更好。

然后对于不同的延迟时间要求,也有相对更合适的类型。

1,_nop_() 适用于us级的少量延时

标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。

在keil C51中,直接调用库函数:#include // 声明了void _nop_(void);

2,一般延时大于10us

一,定义的C51中循环变量,尽量采用无符号字符型变量。

二,在FOR循环语句中,尽量采用变量减减来做循环。

三,在do…while,while语句中,循环体内变量也采用减减方法

3,延时更长,达到MS级,这时需要嵌套循环

循环嵌套的方法常用于达到ms级的延时。 对于循环语句同样可以采用for,do…while,while结构来完成,

每个循环体内的变量仍然采用无符号字符变量。

#include<REGX51.H>
#include <INTRINS.H>
void Delayms(unsigned int xms)   //偏差500ms
{

	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
			
		}
		while(--i);
		xms=xms-1;
	}


}

int main()
{
	
	while(1)
	{
	P0=0XFE;
	Delayms(50);
	P0=0XFD;
	Delayms(50);
	P0=0XFB;
	Delayms(50);
	P0=0XF7;
	Delayms(50);
	P0=0XEF;
	Delayms(50);
	P0=0XDF;
	Delayms(50);
	P0=0XBF;
	Delayms(50);
	P0=0X7F;
	Delayms(50);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值