因为Arduino的相关教程有点少,新手不太好理解单片机的底层逻辑,转51单片机很大原因是看到了江科协的51教程,实在是太细了,宝藏课程!!!
1,准备材料
- 普中51开发板,MCU型号为STC89C52RC
2,LED电路原理图
我需要点亮D1位置的LED灯,我们知道vcc是高电平,要产生电流只能另一端设置为低电平,电流方向从左往右,此时二极管相当于一个大电阻从而发光。
因此,左端高电平右端低电平电路通,LED发光;左端高电平右端高端无电流,LED不发光。
注意右端有8个接口,如何控制其引脚呢?
在单片机中,cpu根据程序访问寄存器,写入0或1,当寄存器收到1的信号时通过驱动器放大电路为高电平,收到0反之,这里P20~P27都是由P2寄存器控制的,所以要让D1号位LED灯亮代码输入为:
P2= 1111 1110
这里需要将2进制转化16进制单片机才能识别。
P2=0xFE //1111 1110
3.点亮LED模块第一个灯
程序如下:
#include <REGX52.H>
void main()
{
P2=0xFE; //1111 1110
while(1)
{
}
}
4.LED闪烁
通过添加延时来实现。
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xfe;
Delay500ms();
P2=0xff;
Delay500ms();
}
}
5.LED流水灯
#include <REGX52.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
//_nop_();一微秒误差
i = 4;
j = 205;
k = 187;
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 1101
Delay500ms();
P2=0xf7;//1111 1011
Delay500ms();
P2=0xef;//1111 0111
Delay500ms();
P2=0xdf;//1110 1111
Delay500ms();
P2=0xbf;//1101 1111
Delay500ms();
P2=0x7f;//1011 1111
Delay500ms();
}
}
6.LED流水灯Plus
优化延时代码,实现每个灯的控制时间都可以调整
#include <REGX52.H>
#define sj 20
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
P2=0xfe;//1111 1110
Delay1ms(1000);
P2=0xfd;//1111 1101
Delay1ms(sj);
P2=0xfb;//1111 1101
Delay1ms(sj);
P2=0xf7;//1111 1011
Delay1ms(sj);
P2=0xef;//1111 0111
Delay1ms(sj);
P2=0xdf;//1110 1111
Delay1ms(sj);
P2=0xbf;//1101 1111
Delay1ms(sj);
P2=0x7f;//1011 1111
Delay1ms(sj);
}
}