这篇博客将完成以下几种用51实现点灯效果
2-1点亮一个LED灯
1.首先在keil中新建一个工程,这里需要注意,将所写的工程可以统一一个地方进行存储,这样方便查找。之后再右击添加新文件
2.首先右击代码行,引用文件
3.之后再编写主函数
4.以其中亮一个LED灯为例,编写程序如下:
P2=0xFE;//1111 1110 转换成十六进制0x表示前缀代表的是十六进制数
P2=0xFE;//1111 1110
下载程序后到STC-ISP中选择单片机的型号,串口号,打开相应的程序文件,进行下载编程
5.实现效果
6.当然,也可以加上循环语句表示让其一直循环下去,实现效果是一样的
通过点亮第一个LED灯,可以知道以八个一组为例改变0101......的位置可以转换灯的亮灭情况
例如:
实现效果为:
2-2闪烁LED灯
闪烁LED灯是在2-1的基础上加上延时函数
void main()
{
while(1)
{
P2=0xFE;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
这里引用了延时函数,所以在此之前需要调用延时函数
这里可以用STC-ISP生成相应的代码复制过来
之后进行编译,会发现
这是需要添加头文件,不然会报错
#include <INTRINS.H>
添加头文件是因为复制过来的代码中含有以下内容是包含在另一个库里的
_nop_();
程序下载,烧录后实现效果为
2-2闪烁LED灯
2-3 LED流水灯
在2-2的基础上实现第三步LED流水灯
主要变化是在主函数中改变进制的位数,添加延时,具体如下:
void main()
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms();
P2=0xFD; //1111 1101
Delay500ms();
P2=0xFB; //1111 1011
Delay500ms();
P2=0xF7; //1111 0111
Delay500ms();
P2=0xEF; //1110 1111
Delay500ms();
P2=0xDF; //1101 1111
Delay500ms();
P2=0xBF; //1011 1111
Delay500ms();
P2=0x7F; //0111 1111
Delay500ms();
}
}
上述代码中0的位数依次向左边移动
实现效果如下:
2-3 LED流水灯
2-4 LED流水灯
2-4写代码的方式较之前而言较为灵活,当实现不同毫秒的延时时不需要依次生产代码复制过来,而是灵活使用
#include <REGX51.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms=xms-1; //xms--;
}
}
void main()
{
while (1)
{
P2=0xFE; //1111 1110
Delay1ms(1000);
P2=0xFD; //1111 1101
Delay1ms(1000);
P2=0xFB; //1111 1011
Delay1ms(100);
P2=0xF7; //1111 0111
Delay1ms(100);
P2=0xEF; //1110 1111
Delay1ms(100);
P2=0xDF; //1101 1111
Delay1ms(100);
P2=0xBF; //1011 1111
Delay1ms(100);
P2=0x7F; //0111 1111
Delay1ms(100);
}
}
1.在调用的延时函数使用了定义int型的变量xms,使用了while循环,在主函数中设置十六进制数的0依次向左移,实现了流水灯的效果,但是这种方法更实用,灵活
实现效果:
2-4 LED流水灯
总结:
51单片机实现流水灯是入门的第一课,主要熟悉以下要点
进制转换
C51数据类型