流水灯代码
#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);
}
}