小灯部分总分析

点亮小灯

硬件分析

图3-17 LED小灯整体电路图
该节内容以LED2为例

分析LED部分:
欲点亮LED2,则LED2需导通状态
Q16导通,DB0低电平时,此时LED2有压降,则LED2可导通

分析74HC245芯片:
72HC245
19号OE号脚,为使能引脚,该引脚接地,所以是低电平,该引脚低电平有效,故74HC245芯片可作用
1号脚是方向引脚,接VCC,故是高电平,所以是A编号引脚控制B编号引脚
A1号脚低电平则B1号脚低电平,即DB_0低电平则DB0低电平 ^DBX-0

分析74HC138芯片:
74HC138
4号脚E1为低电平有效,5号脚E2低电平有效,E3高电平有效
欲达到上述效果,则
ENLED低电平,此时E1和E2均为低电平
ADDR3高电平,此时E3高电平
此时,该芯片可正常使用

欲使Q16导通,则LEDS6需要为低电平,此时Q16才有压降,才可以导通
欲使LEDS6低电平,查真值表后,需要3号脚A2为高电平,2号脚A1为高电平,1号脚A0为低电平
欲达到以上效果,则
ADDR0为低电平,则A0为低电平
ADDR1为高电平,则A1为高电平
ADDR2为高电平,则A2为高电平 ^Q16-1

分析跳线部分:
图3-18 显示译码器欲步进电机的选择跳线
欲时ADDR0低电平,则P1.0需要低电平
欲使ADDR1高电平,则P1.1需要高电平
欲使ADDR2高电平,则P1.2需要高电平
欲使ADDR3高电平,则P1.3需要高电平

图 单片机电路
欲使DB_0低电平,则P0.0需要低电平
欲使ENLED低电平,则P1.4需要低电平

综上:
欲电亮小灯,
P0.0低电平,等效于DB_0低电平
P1.0低电平,等效于ADDR0低电平
P1.1高电平,等效于ADDR1高电平
P1.2高电平,等效于ADDR2高电平
P1.3高电平,等效于ADDR3高电平
P1.4低电平,等效于ENLED低电平

代码

仓库

仓库地址:https://gitee.com/EricsT/51_microcontrollers/tree/master/LED

点亮 LED2

#include<reg52.h>

sbit LED = P0 ^ 0;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED3

#include<reg52.h>

sbit LED = P0 ^ 1;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED4

#include<reg52.h>

sbit LED = P0 ^ 2;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED5

#include<reg52.h>

sbit LED = P0 ^ 3;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED6

#include<reg52.h>

sbit LED = P0 ^ 4;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED7

#include<reg52.h>

sbit LED = P0 ^ 5;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED8

#include<reg52.h>

sbit LED = P0 ^ 6;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

点亮LED9

#include<reg52.h>

sbit LED = P0 ^ 7;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通
    LED = 0;//灯亮
    while (1);
}

小灯闪烁

LED2闪烁

#include <reg52.h>

sbit LED   = P0 ^ 0;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED3闪烁

#include <reg52.h>

sbit LED   = P0 ^ 1;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED4闪烁

#include <reg52.h>

sbit LED   = P0 ^ 2;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED5闪烁

#include <reg52.h>

sbit LED   = P0 ^ 3;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED6闪烁

#include <reg52.h>

sbit LED   = P0 ^ 4;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED7闪烁

#include <reg52.h>

sbit LED   = P0 ^ 5;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED8闪烁

#include <reg52.h>

sbit LED   = P0 ^ 6;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

LED9闪烁

#include <reg52.h>

sbit LED   = P0 ^ 7;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        LED = 0;//灯亮
        for (i = 0; i < 30000; ++i);//非精确延时
        LED = 1;//灯灭
		for (i = 0; i < 30000; ++i);//非精确延时
    }
}

流水灯

右向左

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;
	char cnt = 0;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{		  
		if (8 == cnt)//到最左边,需要进行复位,点亮最右边
			cnt = 0;
		P0 = ~(1 << cnt);
		cnt++;
        for (i = 0; i < 30000; ++i);//非精确延时
    }
}

左向右

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;
	char cnt = 7;

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{		  
		if (-1 == cnt)//到最右边,需要进行复位,点亮最左边
			cnt = 7;
		P0 = ~(1 << cnt);
		cnt--;
        for (i = 0; i < 30000; ++i);//非精确延时
    }
}

由右开始循环

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;
    char cnt = 0;
    char isLeft = 1;//自右向左标志位

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        if (isLeft)
		{
            if (8 == cnt)//到最左边,需要回到左边起第二位,同时改变方向
			{
				cnt = 6;
				isLeft = 0;
			} 
        }
		else
		{
			if (-1 == cnt)//到最右边,需要回到右边起第二位,同时改变方向
			{
				cnt = 1;
				isLeft = 1;
			}
				
		}

        P0 = ~(1 << cnt);

        if (isLeft)
            cnt++;
		else
			cnt--;

        for (i = 0; i < 30000; ++i);//非精确延时
    }
}

由左开始循环

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;
    char cnt = 7;
    char isLeft = 0;//自右向左标志位

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    while (1) 
	{
        if (isLeft)
		{
            if (8 == cnt)//到最左边,需要回到左边起第二位,同时改变方向
			{
				cnt = 6;
				isLeft = 0;
			} 
        }
		else
		{
			if (-1 == cnt)//到最右边,需要回到右边起第二位,同时改变方向
			{
				cnt = 1;
				isLeft = 1;
			}
				
		}

        P0 = ~(1 << cnt);

        if (isLeft)
            cnt++;
		else
			cnt--;

        for (i = 0; i < 30000; ++i);//非精确延时
    }
}

小灯以1s频率闪烁

#include <reg52.h>

sbit LED = P0 ^ 0;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
    unsigned int i = 0;
    unsigned char cnt = 0;//定时器超时次数

    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;//三极管导通

    TMOD = 0x01;//设置定时器T0运行模式为模式1
    
    TH0 = 0xB8;
    TL0 = 0x00;//设置定时器T0的初始值

    LED = 0;//灯亮
    TR0 = 1;//定时器T0开始工作
    
    while (1) 
	{
        if (1 == TF0)//定时器T0溢出,即过了0.02s
        {
            TF0 = 0;//定时器T0的溢出标志复位

            TH0 = 0xB8;
            TL0 = 0x00;//设置定时器T0的初始值
            cnt++;
            if (cnt >= 50)//超出50次,即过了1s
            {//进行一次新的1s
                LED = ~LED;//灯的状态改变
                cnt = 0;
            }               
        }
    }
}
posted @ 2025-07-23 20:08  EricsT  阅读(289)  评论(0)    收藏  举报