初学单片机,流水灯的实现是必不可少的,下面将介绍流水灯的原理及使用STC-ISP软件延时计算器生成的延时代码实现流水灯的四种方法,最后介绍如何将延时函数模块化。
目录
一、流水灯原理
二、循环
三、移位运算符
四、库函数
五、数组
六、延时函数模块化
1、Delay.h
2、Delay.c
3、 main.c
一、流水灯原理
LED的阳极串联一个电阻,然后连接电源VCC,而LED的阴极连接到单片机的P2口,当引脚(P2口)输出高电平即正极(5V)时,LED不亮;当引脚输出低电平即负极(0V)时,LED亮。通过高低变换把电压输出到引脚,从而将LED以流水灯的形式表现出来。
51单片机使用的是TTL电平,规定高电平为5V,低电平为0V。
在写代码时一般用1表示高电平,用0表示低电平。
二、循环
#include <REGX51.H>
#include <INTRINS.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
} //延时代码
void main()
{
while(1)
{
P2 = 0xFE;//1111 1110
Delay(500);
P2 = 0xFD;//1111 1101
Delay(500);
P2 = 0xFB;//1111 1011
Delay(500);
P2 = 0xF7;//1111 0111
Delay(500);
P2 = 0xEF;//1110 1111
Delay(100);
P2 = 0xDF;//1101 1111
Delay(100);
P2 = 0xBF;//1011 1111
Delay(100);
P2 = 0x7F;//0111 1111
Delay(100);
}
}
通过调节Delay中的数字来控制每个LED灯的延时时间。
三、移位运算符
#include <REGX51.H>
#include <intrins.h>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
} //延时代码
void main()
{
unsigned char k=0;
P2 = 0x01;
while(1)
{
P2 = ~(0x01<<k);//0000 0001~1111 1110
Delay(500);
k++;
if(k == 8)
{
k = 0;
}
}
}
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
注意:移位运算符的操作数不能为负数,如 Num >> -1 错误 |
四、库函数
#include <REGX51.H>
#include <INTRINS.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
} //延时代码
void main()
{
P2 = 0xFE;
while(1)
{
Delay(500);
P2 = _crol_ (P2, 1);
}
}
_crol_ (a , b) | 将a进行b位的左位移 |
向左循环时,从左边出去会从右边重新补入 | |
_cror_ (c , d) | 将c进行d位的右位移 |
向右循环时,从右边出去会从左边重新补入 |
五、数组
#include <REGX51.H>
#include <INTRINS.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
} //延时代码
unsigned char led[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
void main()
{
unsigned char i;
while(1)
{
for(i = 0; i < 8; i++)
{
P2 = led[i];
Delay(500);
}
}
}
六、延时函数模块化
模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其他.c文件想使用其中的代码时,只需要#include “XXX.h”文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。
以上一段代码为例:
1、Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
2、Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
3、 main.c
#include <REGX51.H>
#include <INTRINS.H>
#include "Delay.h"
void main()
{
P2 = 0xFE;
while(1)
{
Delay(500);
P2 = _crol_ (P2, 1);
}
}
文章为个人总结,技术文章来源:https://www.toymoban.com/news/detail-447907.html
有限,如有错漏还要麻烦各位看官指正。文章来源地址https://www.toymoban.com/news/detail-447907.html
到了这里,关于【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!