51单片机注意事项
这篇文章用到的单片机是普中51单片机,参考的视频是江科大的51单片机的视频,同时加入了我自己的理解,希望可以更好的把单片机的内容表述出来。
一.使用keil软件创建工程
这里我们需要生成.hex文件,如果没有.hex文件,烧录软件找不到.hex文件,就不会把程序烧录到单片机里。
二.LED灯。
2.1点亮一个LED灯
由图中可知,小灯的一端接的是VCC,那么另一端就要接地,这样才能使小灯发亮,所以我们给P2相应的IO口低电平,就可以使小灯点亮。
#include <REGX52.H>
sbit LED1 = P2^1;
void main()
{
//P2_0 = 0;
//LED1 = 0;
P2 = 0xFE; //1111 1110
while(1)
{
}
}
如上所示的代码都是将第一个小灯(D1)点亮,如下图所示。
这里有三种不同的代码风格将小灯点亮。
第一种是P2_0 = 0;根据LED模块原理图,我们可以直接将P2_0口置0就可以将相应的小灯点亮。
第二种,我们可以看成是给P2_0口起了一个别名LED0,我们在操作时不用写LED0了,可以写LED0,这样显得更加直观一点,让人一看就知道是要把LED的第一个小灯点亮,方便我们以及他人阅读程序。
第三种,把P2看作一个整体,直接用十六进制数显示P2 = 0xFE,换算成二进制就是,
P2 = 1111 1110,看到这里你可能会说,如果是这样的话,那点亮的不是最后一个小灯吗,为啥是第一个小灯,其实最开始我也有这样的疑惑,我猜是从高位到低位排的,也就是这里的第一位对应单片机从左网有数最后一个小灯,依次类推,大家记住就行了。别弄错了。
2.2使小灯闪烁
我们可以控制小的亮灭来使小灯闪烁。
那么这里我们就要用到一种函数,就是延时函数。
那么我们如何写延时函数呢,我们可以使用STC-ISP软件,找到软件延时计算器,按照如图配置即可(我们这里用的是51普中的板子)。
这样就生成了延时函数的代码
#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);
}
void main()
{
while(1)
{
P2_1 = 0;
Delay500ms();
P2_1 = 1;
Delay500ms();
}
}
这样,我们就实现了小灯的闪烁。其中有一个_nop_();函数,我们需要加上头文件#include <INTRINS.H>才可以正常运行代码,当然我们也可以不写_nop_()函数。
2.3流水灯的实现
思路:我们想要实现流水灯,就要让第一个灯亮,然后熄灭,于此同时,在第一个灯熄灭的同时第二个小灯别点亮,第二个小灯熄灭的同时,第三个小灯被点亮.........:依次类推,我们就可以得到一个流水灯。
#include <REGX52.H>
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
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();
}
}
这样写的好处是,如P2 = 0xFE跳到P2 = 0xFD的时候,不用让第一个小灯熄灭了,因为第二个已经让第一个小灯熄灭和第二个小灯点亮。减少了代码的冗余,让代码看起来更加之直观。