小燈部分總分析
點亮小燈
硬件分析

該節(jié)內(nèi)容以LED2為例
分析LED部分:
欲點亮LED2,則LED2需導(dǎo)通狀態(tài)
Q16導(dǎo)通,DB0低電平時,此時LED2有壓降,則LED2可導(dǎo)通
分析74HC245芯片:
72HC245
19號OE號腳,為使能引腳,該引腳接地,所以是低電平,該引腳低電平有效,故74HC245芯片可作用
1號腳是方向引腳,接VCC,故是高電平,所以是A編號引腳控制B編號引腳
A1號腳低電平則B1號腳低電平,即DB_0低電平則DB0低電平 ^DBX-0
分析74HC138芯片:
74HC138
4號腳E1為低電平有效,5號腳E2低電平有效,E3高電平有效
欲達(dá)到上述效果,則
ENLED低電平,此時E1和E2均為低電平
ADDR3高電平,此時E3高電平
此時,該芯片可正常使用
欲使Q16導(dǎo)通,則LEDS6需要為低電平,此時Q16才有壓降,才可以導(dǎo)通
欲使LEDS6低電平,查真值表后,需要3號腳A2為高電平,2號腳A1為高電平,1號腳A0為低電平
欲達(dá)到以上效果,則
ADDR0為低電平,則A0為低電平
ADDR1為高電平,則A1為高電平
ADDR2為高電平,則A2為高電平 ^Q16-1
分析跳線部分:

欲時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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
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;//三極管導(dǎo)通
while (1)
{
if (8 == cnt)//到最左邊,需要進行復(fù)位,點亮最右邊
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;//三極管導(dǎo)通
while (1)
{
if (-1 == cnt)//到最右邊,需要進行復(fù)位,點亮最左邊
cnt = 7;
P0 = ~(1 << cnt);
cnt--;
for (i = 0; i < 30000; ++i);//非精確延時
}
}
由右開始循環(huán)
#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;//自右向左標(biāo)志位
ENLED = 0;
ADDR3 = 1;//U3 74HC138芯片使能
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;//三極管導(dǎo)通
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);//非精確延時
}
}
由左開始循環(huán)
#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;//自右向左標(biāo)志位
ENLED = 0;
ADDR3 = 1;//U3 74HC138芯片使能
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;//三極管導(dǎo)通
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;//定時器超時次數(shù)
ENLED = 0;
ADDR3 = 1;//U3 74HC138芯片使能
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;//三極管導(dǎo)通
TMOD = 0x01;//設(shè)置定時器T0運行模式為模式1
TH0 = 0xB8;
TL0 = 0x00;//設(shè)置定時器T0的初始值
LED = 0;//燈亮
TR0 = 1;//定時器T0開始工作
while (1)
{
if (1 == TF0)//定時器T0溢出,即過了0.02s
{
TF0 = 0;//定時器T0的溢出標(biāo)志復(fù)位
TH0 = 0xB8;
TL0 = 0x00;//設(shè)置定時器T0的初始值
cnt++;
if (cnt >= 50)//超出50次,即過了1s
{//進行一次新的1s
LED = ~LED;//燈的狀態(tài)改變
cnt = 0;
}
}
}
}
本文來自博客園,作者:EricsT,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/EricsT/p/19001468

浙公網(wǎng)安備 33010602011771號