单片机学习(一)- 如何点亮流水灯
内容参考b站教学视频
先点亮一个LED灯
一.仿真电路图
最小系统由单片机,晶振电路,复位电路(画图可),从两个晶振脚上出来接一个11.0592的晶振
出来接两个20~30pf的电容然后接地即可,40脚是GND,0脚是Vcc
那如何点亮小灯呢?电流经过LED灯,外边接一个Vcc,电流从外流入,电阻限流,通过P1.0的电平高低控制小灯的亮暗
#include <reg52.h>
#define uchar unsigned char
//标准宏定义 无符号型的char型的
#define uint unsigned int
//标准宏定义 无符号型的int型的
abit LED = P1^0; //定位LED P1.0
void DelayMS(uint x) //相当于执行了x*150遍,即延时了150ms
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
void main()
{
while(1)
{
LED =-LED; //当1进来后,LED取反,实现流水
DelayMS(150); //软延时,纯CPU方式的延时
}
}
三,点亮8个LED灯
LED灯的摆放随意,可以按顺序摆,也可以摆成正方形,心形,只是电线长短的变化而已
操作以总线的形式操作(同时操作),这样比较节约代码
P0用8个1表示1 1 1 1 1 1 1 1 从左到右分别代表
1(0.7) 1(0.6) 1p(0.5) 1p(0.4) 1 p(0.3)1(p0.2) 1 (p0.1)1(p0.0)
8个1,转化为16进制,就是0XFF 比如1011 1101 就是0xBD
让灯流动起来就是 1111 1110 ->1111 1101->1111 1011->…->0111 1111
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
void main()
{
P0 = 0xFE // 1111 1111 这里用P0直接控制与P0有关的那8个
while(1)
{
P0 = _crol_(P0,1); //_crol_表示右移
DelayMS(150); //每个延时150ms,防止一闪而过看不清
}
}
四,其他点亮流水灯的方式
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Pattern_P0[]=
{
0xfc,0xf9,0xf3,0xe7,0xcf,0x9f
};
uchar code Pattern_P2[]=
{
0xf5,0xf6,0xfe,0x54,0x56,0x76,0xd7,0x49,0xa9,0xe4,0xc6
};
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
void main()
{
uchar i;
while(1)
{
for(i=136;i>0;0--)
{
P0=Pattern_P0[i];
//直接对总线进行赋值 就可以实现灯按照自己的想法随便的亮,想让怎么亮就怎么亮
P2=Pattern_P2[i];
DelayMS(150);
}
}
}
作者:青山黛·朝夕