欢迎来到51单片机入门,本教程在大家会用keil创建工程的条件下,教大家如何使用51单片机,具体是代码讲解及其思路,教大家如何使用一些基本外设,话不多说,先开始学习单片机的第一步:点灯。
本教程用的是普中的开发板,型号是A2,主控是STC89C52。
一、点亮P2口全部LED
1.实验结果
在开始编写正式代码之前,我们需要写好程序基本框架,然后再魔术棒里面的output选项里面将create HEX file 的选项打开
这里我们需要在while循环里面实现需要重复执行的代码,因为单片机的程序是永远不可以结束的,所以while后边的条件是“1”,即死循环。
那么现在,我们可以打开开发板原理图,如果没有手册,可以找售卖开发板的店家咨询一份。
我们打开原理图以后,可以看到LED是连接在P2端口,且是共阳极
那么我们可以试着点亮全部LED:在main函数里写好P2=0x00,然后编译,在STC-SPI软件里面下载程序;
可以看到8个led都亮起来了。
2.实验代码讲解
首先看到我们使用了P2,那么P2是什呢?在这里,P2被定义在了#include <REGX52.H>文件里,转到定义以后如下:
在29行的位置定义了P2,后边的是寄存器的地址,关于一些关键字,keil c51和标准C语言会有些差异,理解这个是什么即可。
由于前边已经提到LED是共阳极,所以只需要将P2口电平置0即可点亮全部LED。如果我们继续浏览这个文件,会看到对P2口更为精细的拆分:
这意味着我们可以可以单独控制P2的每一个位,既然如此,那么我们就单独来点亮一颗LED:
二、点亮一颗LED
有了前边的基础,我们只需P2修改为指定端口即可以点亮相应LED。以P2_0为例:
结果如下:
三,循环流水灯
有了以上基础,我们可以做一个循环流水灯,让八个灯泡都亮起来,且一次仅亮一颗灯泡,代码如下:
#include <REGX52.H>
void delay(unsigned int x)
{
while(x--);
}
void main()
{
while(1)
{
P2_0=0x00;
delay(50000);
P2_0=0x01;
P2_1=0x00;
delay(50000);
P2_1=0x01;
P2_2=0x00;
delay(50000);
P2_2=0x01;
P2_3=0x00;
delay(50000);
P2_3=0x01;
P2_4=0x00;
delay(50000);
P2_4=0x01;
P2_5=0x00;
delay(50000);
P2_5=0x01;
P2_6=0x00;
delay(50000);
P2_6=0x01;
P2_7=0x00;
delay(50000);
P2_7=0x01;
}
}
程序下载好之后可以看到灯泡从D1到D8依次亮起,如此循环往复。但是有人会觉得这个代码太长了,很麻烦,那么我们可以用位操作来缩短代码:
#include <REGX52.H>
void delay(unsigned int x)
{
while(x--);
}
void main()
{
unsigned char byte=0x01;
while(1)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
P2=~(byte<<i);
delay(50000);
}
}
}
这里创建了一个变量byte,为0x01,二进制表示为0000 0001。for循环里,byte每次左移i位(byte并未改变),依次变为:
0000 0010
0000 0100
0000 1000
0001 0000
0010 0000
0100 0000
1000 0000
由于灯泡是共阳极,所以需要取反,那么P2实际上接收的是:
1111 1110
1111 1101
1111 1011
1111 0111
1110 1111
1101 1111
1011 1111
0111 1111
可见位操作在单片机开发领域的重要性。
以上就是51单片机点灯的教程,谢谢阅读。