一、流水灯电路原理
流水灯电路原理图见图1,单片机部分没画出来。八个发光二极管LED1-LED8分别接在51单片机的P0.0-P0.7接口上,单片机输出“0”时,发光二极管亮,按着LED1→LED2→LED3→LED4→LED5→LED6→LED7→LED8的顺序依次点亮。只需要将P0口的某位依次变为低电平就行了。我们这里用了头文件intrins.H中的_crol_(A,B),_cror(A,B)函数,功能为循环移动。

图1:LED流水灯原理图
二、程序编写
/************************************
* 名称 : Main()
* 功能 : 实现灯的闪烁
* 输入 : 无
* 输出 : 无
* 说明 :也可以使用例1的的方法来关闭数码管
*************************************/
void Main(void)
{
uchar i;
P2 = 0x00;
while(1)
{
P0 = 0x7f; //P0.7亮亮
for(i=0; i<7; i++) //移位7次
{
P0 = _cror_(P0, 1); //_crol_()在intrins.h中定义了,用于循环右移
Delay(15);
}
P0 = 0xfe;
for(i=0; i<7; i++)
{
P0 = _crol_(P0, 1); //用于循环左移
Delay(15);
}
}
}
下面是简单的介绍下intrins.h这个C51的内部函数:
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作8051 NOP 指令
_testbit_ 测试并清零位8051 JBC 指令
函数名: _crol_,_irol_,_lrol_
原型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
功能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令相关
函数名: _cror_,_iror_,_lror_
原型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令相关
比如:P0 = _cror_(P0, 1);就是字符右循环1位。