STC89C52单片机实现流水灯的三种编程方式详解
效果图
实现流水灯的第一种方式
/*
来回点亮LED的第一种方法
*/
#include <reg52.h>//包含51一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int
void delay_10ms(uchar i)
{
//毫秒级延时函数
//在12MHZ下晶振下,大约延时10ms/次
uchar a,b,c;
for(c = i; c > 0; --c)
for(b = 129; b > 0; b--)
for(a = 38; a > 0; a--);
}
void main()
{
while(1)
{
uchar i,j,led;
led = 0xfe;//1111 1110 初始化函数
P1 = led;
delay_10ms(30);
for (i=0; i<7; i++)
{
led = led << 1 | 0x01;
P1 = led;
delay_10ms(30);
}
led = 0x7f;
for (j=0; j<8; j++)
{
led = led >> 1 | 0x80;
P1 = led;
delay_10ms(30);
}
}
}
实现流水灯的第二种方式
/*
循环点亮LED方法二
*/
#include <reg52.h>//包含51一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int
void delay_10ms(uchar i)
{
//毫秒级延时函数
//在12MHZ下晶振下,大约延时10ms/次
uchar a,b,c;
for(c = i; c > 0; --c)
for(b = 129; b > 0; b--)
for(a = 38; a > 0; a--);
}
void main()
{
int a[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//D0 D1 D2 D3 D4 D5 D6 D7
int b[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//D7 D6 D5 D4 D3 D2 D1 D0
uint i,j,led;
while(1)
{
delay_10ms(100);//延时100ms
for (i = 0; i < 8; i++)
{
led = a[i];
P1 = led;
delay_10ms(50);
}
delay_10ms(50);//延时 +50ms
for (j = 0; j < 8; j++)
{
led = b[j];
P1 = led;
delay_10ms(50);
}
}
}
实现流水灯的第三种方式
/*
循环点灯方法三
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay_10ms(uchar i)
{
//毫秒级延时函数
//在12MHZ下晶振下,大约延时10ms/次
uchar a,b,c;
for(c = i; c > 0; --c)
for(b = 129; b > 0; b--)
for(a = 38; a > 0; a--);
}
void main()
{
uchar temp,i,j;
temp = 0xfe;
P1 = temp;
while(1)
{
for (i=0; i<7; i++)
{
temp = _crol_(temp,1);
delay_10ms(30);
P1 = temp;
}
for (j=0; j<7; j++)
{
temp = _cror_(temp,1);
delay_10ms(30);
P1 = temp;
}
}
}
对于单片位移操作的一些说明
1、左移位操作符:<<
每执行一次左移指令,被操作数将最高位移入单片机PSW寄存器的CY位,CY位中原来数据丢失,最低位补0,其他位依次向左移一位。
2、左移位操作符:<<
每执行一次左移指令,被操作的数将最低位移入单片机PSW寄存器的CY位,CY位中原来的数据丢失,最高位补0,其他位依次向右移一位。
3.循环左移
循环左移,最高位移入最低位,其他位依次左移一位。C语言没有专门的指令,通过移位指令与简单逻辑运算可以实现循环左移,或直接利用c51库函数_crol_实现。
4、循环右移
循环右移,最高位移入最低位,其他位依次右移一位。C语言没有专门的指令,通过移位指令与简单逻辑运算可以实现循环右移,或直接利用c51库函数_cror_实现。