1.介绍
需要使用的工具有keil5和stc-isp。
在keil5上编写代码,将代码传到stc-isp上使单片机运行。需要一点c语言基础。在开始前可以先看LED部分的原理图,简单了解该模块的结构,便于后续理解。
2.点亮一个LED灯
2.1 创建文件
打开keil5—>点击project—>点击new project—>选择要创建文件的文件夹—>选择单片机的型号(以我自己举例,单片机型号是STC89C52RC,但keil5没有STC系列的单片机,就选择AT89C52)—>右键文件夹添加c语言类型文件
2.2 编写代码
#include <regx52.h>
int main()
{
P2 = 0xFE;//1111 1110
while(1)
{
}
return 0;
}
2.2.1 P2的解释
P2(看原理图标注的口是从哪里开始的)是一个寄存器,里面有8位,51单片机上有8个LED灯,所以每一位对应控制一个LED灯。数字电路是二进制,只有0和1,写0对应的LED就是低电平,1写对应的LED就是高电平。加入<regx52.h>头文件,让程序理解P2的含义。
2.2.2 LED为什么会亮
将第1个LED对应的位给0,其他LED对应的位给1,那么只有第一个LED会亮(所有LED的一侧都接了Vcc,只有当LED另一侧接了低电平时,才会产生电位差,使对应的电路导通,有电流产生,从而点亮LED)
2.2.3 进制转换
所以要想使第一个LED点亮,我们要给P2一个值去控制这8个LED。P2=1111 1110(2进制,1和0会赋给对应的端口,端口控制对应的LED)
但程序不支持直接写二进制,需要换成十六进制。

P2 = 0xFE //1111 1110(0x是前缀,表示十六进制)
2.2.4while的解释
在没有while的时候,程序会不停的重复执行主函数,加入while后,程序在执行打开LED灯的代码后就会一直在while处循环,相当于使程序在执行完打开LED灯的代码后就停止了。
2.2.5 保存代码

点击如图所示位置,在output选项中勾选第二个,点OK,随后编译代码。

2.3 运行代码

用USB将单片机和电脑连接—>打开stc-isp—>选择对应的型号(STC89C52RC)和串口—>点击打开程序文件—>找到对应的文件夹下的Objects文件—>点击下载/编程—>按下单片机开关。会发现单片机的第一个LED灯已经点亮。
3 LED灯闪烁
3.1创建文件
步骤同上
3.2 编写代码
#include <regx52.h>
#include <intrins.h>
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
while(1)
{
P2=0xFE;//点亮第一个LED
Delay500ms();//使点亮和闪烁的过程中间隔500ms
P2=0xFF;//熄灭第一个LED
}
return 0;
}
3.2.1 创建时间延迟函数
打开stc-isp—>点击软件延时计算器—>根据自己的开发板选择对应的系统频率、选择定时长度、指令集—>最后点击生成c代码并复制到主函数前

3.2.2头文件<intrins.h>的添加
程序无法识别_nop_(),所以需要引用该头文件,也可以删除该代码不引用头文件,只会对精度产生细小误差。
3.2.3使用while循环重复闪烁
将代码写在while循环中,并在点亮和熄灭中间引用一次延迟函数,这样就可以重复点亮和关闭LED灯,达到一直闪烁LED灯的效果。
3.3运行代码
步骤同上
4 LED流水灯
4.1 创建文件
步骤同上
4.2 编写代码
#include <regx52.h>
void Delay1ms(unsigned int x) //@11.0592MHz
{
unsigned char i, j;
while(x)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
x--;
}
}
int main()
{
while(1)
{
P2=0xFE;//1111 1110 只有第一个LED灯亮
Delay1ms(500);
P2=0xFD;//1111 1101 只有第二个LED灯亮
Delay1ms(500);
P2=0xFB;//1111 1011 只有第三个LED灯亮
Delay1ms(500);
P2=0xF7;//1111 0111 只有第四个LED灯亮
Delay1ms(500);
P2=0xEF;//1110 1111 只有第五个LED灯亮
Delay1ms(500);
P2=0xDF;//1101 1111 只有第六个LED灯亮
Delay1ms(500);
P2=0xBF;//1011 1111 只有第七个LED灯亮
Delay1ms(500);
P2=0x7F;//0111 1111 只有第八个LED灯亮
Delay1ms(500);
}
return 0;
}
4.2.1 时间延迟函数的改进
先根据前面的步骤创建一个1ms的时间延迟函数,给这个时间延迟函数里传一个无符号整型参数x,将这个时间延迟函数的主体内容放进一个while循环中,while的循环参数为x,while函数末尾加上x--。
需要延迟多少ms,就传对应的数字到时间延迟函数,这样时间延迟函数就会执行对应倍数的1ms的时间延迟。改进过后想延迟多久就可以直接传参数,不用每次都去生成对应的时间函数,便于灵活使用。
4.2.2 使用while循环流水闪烁
在while循环中写入每个LED灯开启的代码,每行代码之间加入500ms的时间延迟函数,这样LED灯就会流水型开启并一直循环重复。
4.3 运行代码
步骤同上
5. 总结
以上就是我在学习51单片机过程中对简单点亮LED灯部分的学习内容的总结,希望对大家有所帮助。如有错误的地方,欢迎指出。

273

被折叠的 条评论
为什么被折叠?



