51单片机的led部分原理图如上,由p2端口引脚控制,原理不多加赘述。
跑马灯即51单片机上的8个led灯依次亮起。
假设已掌握基础的知识,能点亮一个led灯,再使用一个延时函数即可实现跑马灯。
#include<reg52.h>
#define LED_PORT P2 //宏定义
sbit LED1=P2^0; //定义一个引脚
typedef unsigned char ucahr;
typedef unsigned int uint;
void delay_ms(uint n) //延时函数
{
uint i,j;
for(i=1;i<=n;i++)
{
for(j=200;j>0;j--);
}
}
void display_pmd() //跑马灯函数
{
uint i;
for(i=0;i<=8;i++)
{
LED_PORT=~(0x01<<i); // <<即宏定义的LED_PORT二进制数依次左移,~为取反
delay_ms(50);
}
}
void main() //主函数
{
while(1)
{
display_pmd();
}
}
其中的跑马灯函数diplay_pmd中,LED_PORT=~(0x01<<i);意为
- 位移操作:
0x01 << i
是位移操作。在 C 语言(这里假设是 51 单片机的 C 编程环境)中,<<
是左移运算符。0x01
是十六进制表示的数字,它的二进制形式为00000001
。当i = 0
时,0x01 << 0
仍然是0x01
(二进制00000001
);当i = 1
时,0x01 << 1
就是0x02
(二进制00000010
);当i = 2
时,0x01 << 2
为0x04
(二进制00000100
),以此类推。随着i
的增加,这个二进制数字中的1
会逐位向左移动。 - 取反操作:
~
是按位取反运算符。它会将操作数的每一位进行取反。例如,对于二进制数00000001
,取反后得到11111110
。所以,~(0x01 << i)
就是对0x01
左移i
位后的结果进行取反。 - 赋值操作:整个表达式
LED_PORT=~(0x01 << i);
是将取反后的结果赋值给LED_PORT
。假设LED_PORT
是一个与硬件端口相关的定义(比如通过#define LED_PORT P2
定义了一个单片机的 P2 端口),这个操作就会改变端口的输出值。
或使用左移函数_crol_()
#include<reg52.h>
#include<intrins.h> //头文件 定义了左移函数_crol_
#define LED_PORT P2 //宏定义
sbit LED1=P2^0; //定义一个引脚
typedef unsigned char ucahr;
typedef unsigned int uint;
void delay_ms(uint n) //延时函数
{
uint i,j;
for(i=1;i<=n;i++)
{
for(j=200;j>0;j--);
}
}
void display_pmd() //跑马灯函数
{
uint i;
for(i=0;i<=8;i++)
{
LED_PORT=_crol_(0xfe,i); // crol循环左移函数
delay_ms(50);
}
}
void main() //主函数
{
while(1)
{
display_pmd();
}
}
实验视频如下:
51单片机跑马灯