单片机控制发光二极管的显示(2)

简介: 单片机控制发光二极管的显示(2)

我们今天来说说单片机是如何控制发光二极管的。

18.jpeg


如果P0口作为通用I/O使用,由于漏极开路,需要外接上拉电阻,而P1~P3口内部已有30k0左右的上拉电阻。下面来讨论PI~P3口如何与LED发光二极管的驱动连接问题。


使用单片机的并行端口P1 ~P3直接驱动发光二极管,电路如图5-1所示。P0口与P1、P2、P3口相比,P0口每位可驱动8个LSTTL输入,而PI ~P3口每一位的驱动能力,只有P0口的一半。当PO口的某位为高电平时,可提供400 μA的拉电流;当P0口某位为低电平(0.45 V)时,可提供3.2 mA的灌电流,而P1 ~P3口内部有30 k2左右的上拉电阻,如果高电平输出,则从P1、P2和P3口输出的拉电流I。仅为几百微安,驱动能力较弱,亮度较差,如图5-1(a)所示。如果端口引脚为低电平,能使灌电流1从单片机的外部流入内部,则将大大增加流过的灌电流值,如图5-1(b)所示。所以,T89S52 单片机任何一个端口要想获得较大的驱动能力,要采用低电平输出。


19.jpeg

如果一定要高电平驱动,可在单片机与发光二极管之间加驱动电路,如74LS04芯片、74LS244芯片等。


单片机的I/O端口P0~P3是单片机与外设进行信息互换的桥梁,可通过读取I/O端口的状态来了解外设的状态,也可向I/O端口送出命令或数据来控制外设。对单片机I/O端口进行编程控制时,需要对I/0端口的特殊功能寄存器进行声明,在C51的编译器中,这项声明包含在头文件reg51. h中,编程时,可通过预处理命令#include<reg51. h>,把这个头文件包含进去。下面通过一个例子介绍如何对I/O端口编程实现对发光二极管亮灭的控制。


【例】


电路原理图如下,制作由上至下,再由下至上反复循环点亮显示的流水灯。


三种解题方法

数组方法

移位运算符方法

循环左、右移位函数方法

20.png


数组方法

本方法是建立1个字符型数组,将控制8个led显示的8位数数据作为数组元素,依次送到P1口来实现。

#include<reg51.h>
#define uchar unsigned char
uchar tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//点亮数据
void delay()
{
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void main()//主函数
{
  uchar i;
  while(1)
  {
    for(i=0;i<16;i++)
    {
      P1=tab[i];//向P1口送出点亮数据的数组元素
      delay();//延时
    }
  }
}

移位运算符方法

本方法是使用移位运算符“>>”“<<”,把送到P1口的显示控制数据进行移位,从而实现发光二极管的依次点亮。

#include<reg51.h>
#define uchar unsigned char
void delay()
{
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void main()//主函数
{
  uchar i;
  while(1)
  {
        temp=0x01;//左移初值赋给temp
        for(i=0;i<8;i++)
        {
        P1=~temp;//temp中的数据取反后送到P1口
        delay();//延时
        temp=temp<<1;//temp中数据左移一位
        }
        temp=0x80;//右移初值赋给temp
        for(i=0;i<8;i++)
        {
        P1=~temp;//temp中的数据取反后送到P1口
        delay();//延时
        temp=temp>>1;//temp中数据右移一位
        }
    }
}

程序说明:


注意使用移位运算符“>>”“<<”与使用循环左移函数“_ crol_" 和循环右移函数“o_"的区别。左移移位运算“<<”是将高位丢弃,低位补0 ;右移移位运算“>>”是将低位丢弃,高位补0。而循环左移函数“.crol_” 是将移出的高位再补到低位,即“循环”移位;同理循环右移函数“。cror_" 是将移出的低位再补到高位。


循环左、右移位函数方法

本方法是使用C51中规供的库函数,即循环左移”位函数和循环右移n位,控制发光二极管的点亮规律。参考程序如下:

#include<reg51.h>
#include<intrins.h>//包含左右移位函数文件
#define uchar unsigned char
void delay()
{
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void main()//主函数
{
  uchar i,temp;
  while(1)
  {
        temp=0xfe;//初始值为1111110B
        for(i=0;i<7;i++)
        {
            P1=temp;//temp中点亮的数据送到P1口
            delay();//延时
            temp=_crol_(temp,1);//执行左移函数,temp中的数据左移1位
        }
        for(i=0;i<7;i++)
        {
            P1=temp;//temp中点亮的数据送到P1口
            delay();//延时
            temp=_cror_(temp,1);//执行右移函数,temp中的数据右移1位
        }
    }
}

今天简单说了三种方法实现 由上至下,再由下至上反复循环点亮显示的流水灯。


相关文章
|
编译器 芯片
单片机控制发光二极管的显示(1)
单片机控制发光二极管的显示(1)
单片机常见元器件之二极管
单片机常见元器件之二极管
240 0
单片机常见元器件之二极管
单片机原理及其应用——单片机控制按键依次点亮8只发光二极管
单片机原理及其应用——单片机控制按键依次点亮8只发光二极管
单片机原理及其应用——单片机控制按键依次点亮8只发光二极管
单片机原理及其应用——单片机控制按键点亮发光二极管
单片机原理及其应用——单片机控制按键点亮发光二极管
单片机原理及其应用——单片机控制按键点亮发光二极管
单片机原理及其应用——单片机控制8只发光二极管交替闪烁
单片机原理及其应用——单片机控制8只发光二极管交替闪烁
单片机原理及其应用——单片机控制8只发光二极管交替闪烁
单片机原理及其应用——单片机控制单个发光二极管实验(附超详细的C51单片机实验教程)
单片机原理及其应用——单片机控制单个发光二极管实验(附超详细的C51单片机实验教程)
单片机原理及其应用——单片机控制单个发光二极管实验(附超详细的C51单片机实验教程)
|
6月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
57 1
|
6月前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
94 1