单片机学习(一)- 如何点亮流水灯

内容参考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);
       }
    }
}

作者:青山黛·朝夕

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机学习(一)- 如何点亮流水灯

发表评论