51单片机用三种方法实现流水灯
一、数组流水灯
定义一组数组分别对应点亮LED1~7
然后利用for循环赋值给p2从而实现流水灯
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数组
// 函数功能:毫秒延时
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P2 = table[i];
delay(300);
}
}
}
二、移位函数流水灯
先定义p2为1111 1110
然后利用_crol_和_cror_函数进行移位
_crol_循环往左移一位,地位的补去高位,cror 循环往右移一位,高位的补去低位
#include <reg52.h>
#include <intrins.h>//_crol_和_crol_的头文件
#define uint unsigned int
#define uchar unsigned char
uchar temp;
void delay(uint z)
{
uint x,y;
for(x = z;x > 0;x--)
for(y = 114;y > 0;y--);
}
void main()
{
temp = 0xfe;
P2 = temp;
delay(100);
while(1)
{
temp = _crol_(temp, 1);//循环往左移一位,地位的补去高位
P2 = temp; //_cror_ 循环往右移一位,高位的补去低位
delay(100);
}
}
三、移位运算符流水灯
先定义p2为1111 1111
然后用for循环<<和>>进行移位
<<将p2的值左移1位(高位丢弃,低位补0),>>将p2的值右移1位(低位丢弃,高位补0)
#include<reg52.h> //单片机头文件
void delay(unsigned int xms);//延时函数声明
void main()
{
unsigned char i,j;//定义无符号字符型变量i和j(范围为0~255)
while(1) //重复执行while循环体的程序
{
i=0xff; //给i赋值1111 1111
P2=i; //给P2端口赋i的值
delay(500); //延时500ms
for(j=0;j<8;j++)//循环8次
{
i=i<<1; //将i的值左移1位(高位丢弃,低位补0)
P2=i; //将i的值赋给P2端口
delay(500); //延时500ms
}
}
}
void delay(unsigned int xms)
{
unsigned int i,j; //定义无符号整形变量i(范围为0~65535)
for(i=xms;i>0;i--) //执行xms次即延时x毫秒
for(j=115;j>0;j--); //延时1ms(给i赋1ms的延时值,循环体为空时执行i--指令115次为1ms)
}