1 LED的工作原理
LED的符号:LED的工作是有方向性的,只有当正极接到LED阳极,负极接到LED阴极的时候才能工作,反接LED是不能正常工作的。
开发板上原理图:LED的阳极串联一个电阻,然后连接到电源VCC(高电平),而阴极连接到单片机的I/O口。想点亮一盏LED就把单片机相对应的I/O口赋为低电平。
排阻需要上电使用。
1.1 LED流水灯
1.11 CODE
#include<reg52.h>//包含头文件
#include<intrins.h>//包含循环左移函数_crol_()和循环右移函数_cror_()
#define LED P1//将P1口定义位LED
void delay(int i)//延时函数
{
while(i--);//i=1时,大约延时10us
}
int main(void)//主函数
{
char i;
LED = 0xfe;//点亮第一盏LED
while(1)//无限循环
{
for(i=0;i<7;i++)
{
LED = _crol_(LED,1);//将LED的值左移一位
delay(50000);//大约延时450ms
}
for(i=0;i<7;i++)
{
LED=_cror_(LED,1);//将LED的值右移一位
delay(50000);
}
}
}
2 LED显示器
LED显示器是由发光二极管作为显示字段的数码型显示器件,具有显示清晰、成本低廉、配置灵活、与单片机接口简单。
LED显示
- 段显示:8段:7段数码管+一个小数点;米字段。
- 点阵显示:5x8,8x8点阵。
LED数码管
- 共阴极:各二极管的阴极连接在一起,公共端接低电平时,某段阳极加上高电平则该段发光二极管就导通发光。
- 共阳极:各二极管的阳极连接在一起,公共端接高电平时,某段阴极加上低电平则该段发光二极管就导通发光。
LED显示的段码
字型 | 共阳极段码 | 共阴极断码 | 字型 | 共阳极段码 | 共阴极段码 |
---|---|---|---|---|---|
0 | C0H | 3FH | 9 | 90H | 6FH |
1 | F9H | 06H | A | 88H | 77H |
2 | A4H | 5BH | B | 83H | 7CH |
3 | B0H | 4FH | C | C6H | 39H |
4 | 99H | 66H | D | A1H | 5EH |
5 | 92H | 6DH | E | 86H | 79H |
6 | 82H | 7DH | F | 8EH | 71H |
7 | F8H | 07H | 灭 | FFH | 00H |
8 | 80H | 7FH |
静态显示
静态显示就是当数码管显示某一个字符时,相应的发光二极管一直处于发光或熄灭状态。具有程序简单,亮度高,CPU工作效率高等优点。一般应用于显示位数较少的系统中。
动态显示
动态显示采用扫描的方式轮流点亮LED数码管的个位。通常将多个数码管的段选线并联在一起,用一个8位I/O口控制;各个数码管的位选线(数码管的公共端)由另外的I/O口控制。通过控制公共端是否有效,逐个循环点亮各位显示器。由于人眼具有视觉暂留效应。虽然任一时刻只有一位数码管被点亮,但因为每个数码管点亮的时间间隔很短,看起来数码管都在同时显示。
在动态显示中需要用到的芯片
74HC245
一种三态输出、八路信号收发器,主要应用于大屏显示,以及其他的消费类电子产品中增加驱动。
工作电压: 3.0V-5.0V
管脚定义
符号 | 管角名称 | 说明 |
---|---|---|
A0-A7 | 数据输入/输出 | |
B0-B7 | 数据输入/输出 | |
OE | 输出使能(低电平有效) | |
DIR | 方向控制 | DIR=1,从A到B;DIR=0,从B到A |
GND | 逻辑地 | |
VDD | 逻辑电源 |
功能真值表
输出使能 | 输出控制 | 工作状态 |
---|---|---|
OE | DIR | |
L | L | Bn输入An输出 |
L | H | An输入Bn输出 |
H | X | 高阻态 |
D74HC138
一种三通道输入、八通道输出译码器,主要应用于消费类电子产品。
工作电压:3.0V-5.0V
管脚说明
名称 | 功能说明 |
---|---|
Yn | 数据输出 |
An | 数据输入 |
En | 使能控制 |
VDD | 逻辑电源 |
GND | 逻辑地 |
功能真值表
动态显示电路
动态显示CODE
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
sbit A=P2^0;
sbit B=P2^1;
sbit C=P2^2;
unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay(unsigned int i)
{
while(i--);
}
void smgDisplay()
{
unsigned char i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
A=1;B=1;C=1; break;//显示第0位
case(1):
A=0;B=1;C=1; break;//显示第1位
case(2):
A=1;B=0;C=1; break;//显示第2位
case(3):
A=0;B=0;C=1; break;//显示第3位
case(4):
A=1;B=1;C=0; break;//显示第4位
case(5):
A=0;B=1;C=0; break;//显示第5位
case(6):
A=1;B=0;C=0; break;//显示第6位
case(7):
A=0;B=0;C=0; break;//显示第7位
}
P0=smgduan[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
while(1)
{
smgDisplay(); //数码管显示函数
}
}