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


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

     

    如果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 单片机任何一个端口要想获得较大的驱动能力,要采用低电平输出。



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

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

    [例]制作一个流水灯,电路原理图见图5-2,8个发光二极管LEDO ~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮-一个发光二极管。

    我们用Proteus画出电路图,图示如下

     我们可以用不同的方法实现流水灯。

    1. #include
    2. void delay(unsigned int t)
    3. {
    4. unsigned int i,j;
    5. for(i=0;i
    6. for(j=0;j<125;j++);
    7. }
    8. void main()
    9. {
    10. while(1)
    11. {
    12. unsigned char i,temp=0x01;
    13. for(i=0;i<8;i++)
    14. {P1=~temp;
    15. delay(400);
    16. temp=temp<<1;
    17. }
    18. }
    19. }

    运行结果

     接下来,我们用另外一种方法实现。

    1. #include
    2. #include //包含移位函数_crol_()的头文件
    3. //“intrins.h”
    4. #define uchar unsigned char
    5. #define uint unsigned int
    6. void delay(uint i) //延时函数
    7. {
    8. uchar t;
    9. while(i--)
    10. {
    11. for(t=0;t<120;t++);
    12. }
    13. }
    14. void main() //主函数
    15. {
    16. P1=0xfe; //向P1口送出点亮P1.0的数据
    17. while(1)
    18. {
    19. delay(500); //500为延时参数
    20. P1=_crol_(P1,1);//函数_crol_(P1,1)把P1中的点亮数据循环左移1位
    21. }
    22. }

    程序说明:

    (1)关于while(1)的两种用法

    ●“while(1);": while(1)后面如果有个分号,是使程序停留在这指令上;

    ●“while(1) ....”..是反复循环执行花括号内的程序段,这是本例的用法,即控制流水灯反复循环显示。

    (2)关于C51函数库中的循环移位函数

    循环移位函数包括循环左移函数“crol _”和循环右移函数“_ cror”。本例中使用了循环左移函数“crol_ (P1,1)”,括号中第1个参数为循环左移的对象,即对P1中的内容循环左移;第2个参数为左移的位数,即左移1位。在编程中一定要把含有移位函数的头文件intrins.h 包含在内,例如程序中的第2行“#include ”。

    下次在说说是在[例]的基础上,控制发光二极管由上至下再由下至上反复循环点亮的流水灯。

  • 相关阅读:
    iOS Crash 治理:淘宝VisionKitCore 问题修复
    【tio-websocket】9、服务配置与维护—TioConfig
    SMARCA2抗体研究:Abnova SMARCA2 单克隆抗体方案
    进程地址空间
    黑马头条项目经验&BUG
    MATLB|基于复杂网络的配电系统微电网优化配置
    MySQL,刷题之对视图操作,题+代码!!
    Python--入门
    kubernetes之Pod控制器
    Mysql视图特性&&用户管理
  • 原文地址:https://blog.csdn.net/BROKEN__Y/article/details/127115355