当前位置: 首页 > news >正文

单片机控制发光二极管的显示(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<reg51. h>,把这个头文件包含进去。下面通过一个例子介绍如何对I/O端口编程实现对发光二极管亮灭的控制。

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

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

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

#include<reg52.h>
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}
void main()
{
while(1)
{
unsigned char i,temp=0x01;
for(i=0;i<8;i++)
{P1=~temp;
delay(400);
temp=temp<<1;
}
}
}

运行结果

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

#include<reg52.h>
#include<intrins.h> //包含移位函数_crol_()的头文件
                    //“intrins.h”
#define uchar unsigned char
#define uint unsigned int
void delay(uint i)    //延时函数
{
uchar t;
while(i--)
{
for(t=0;t<120;t++);
}
}
void main()    //主函数
{
P1=0xfe;        //向P1口送出点亮P1.0的数据
while(1)
{
delay(500);    //500为延时参数
P1=_crol_(P1,1);//函数_crol_(P1,1)把P1中的点亮数据循环左移1位
}
}

程序说明:

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

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

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

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

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

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

相关文章:

  • UNIX环境高级编程-第六章-系统数据文件和信息
  • 【初学者入门C语言】之习题篇(二)
  • [架构之路-14]:目标系统 - 硬件平台 - CPU、MPU、NPU、GPU、MCU、DSP、FPGA、SOC的区别
  • Linux下brk、sbrk实现一个简易版本的malloc
  • 一、CSS选择器与权重[基础选择器、结构选择器、属性选择器、伪类选择器]
  • flutter系列之:深入理解布局的基础constraints
  • 【C语言进阶】动态内存管理及柔性数组
  • 网课查题接口系统
  • C语言基础知识入门
  • 闲暇之际敲敲代码,记录Leetcode刷题Day-01
  • 2021年下半年信息安全工程师上午真题及答案解析
  • Dinky,让 Flink SQL 纵享丝滑
  • Docker | docker容器导出以及常见问题的处理
  • 【node进阶】深度解析之Express框架入门
  • 【重温Linux】一、Ubuntu系统一些常识性的东西(这节持续更新)
  • 自己简单写的 事件订阅机制
  • @angular/forms 源码解析之双向绑定
  • 《Java编程思想》读书笔记-对象导论
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2017-09-12 前端日报
  • Angular Elements 及其运作原理
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • C语言笔记(第一章:C语言编程)
  • ES6语法详解(一)
  • JavaScript设计模式之工厂模式
  • JavaScript新鲜事·第5期
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Mybatis初体验
  • react 代码优化(一) ——事件处理
  • 山寨一个 Promise
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 微服务框架lagom
  • 用Python写一份独特的元宵节祝福
  • 运行时添加log4j2的appender
  • #git 撤消对文件的更改
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)理解angular中的module和injector,即依赖注入
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)h264中avc和flv数据的解析
  • (转)memcache、redis缓存
  • (转载)从 Java 代码到 Java 堆
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • /etc/motd and /etc/issue
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C# 网络编程系列]专题六:UDP编程
  • [DevOps云实践] 彻底删除AWS云资源
  • [Google Guava] 2.1-不可变集合
  • [hdu2196]Computer树的直径
  • [LeetCode]Balanced Binary Tree
  • [Linux] Boot分区满了的处理方法 The volume boot has only 0 bytes disk space remaining
  • [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'XXX' 无效
  • [MT8766][Android12] 增加应用安装白名单或者黑名单