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

如果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>”。

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

单片机控制发光二极管的显示(1)相关推荐

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

    我们今天来说说单片机是如何控制发光二极管的. 如果P0口作为通用I/O使用,由于漏极开路,需要外接上拉电阻,而P1~P3口内部已有30k0左右的上拉电阻.下面来讨论PI~P3口如何与LED发光二极管的 ...

  2. c语言控制数码管显示时间,单片机 控制 数码管显示

    常见LED数码管 LED数码管(LED Segment Displays)简介 数码管也称LED数码管,是由多个发光二极管封装在一起的"8"字型的器件. 按发光二极管单元连接方式可 ...

  3. 51单片机控制数码管显示

    前言 今天学习51单片机的数码管模块 我的学习板上面的数码管是4为一体由12个引脚控制的模块. 今天就编程控制它显示我们想要的输出. 数码管本质上是由8个LED拼接而成的,他们分别叫做a,b,c,d, ...

  4. 单片机控制LED点阵显示心形图形并滚动

    题目要求: 显示心形图形,并不断滚动 仿真电路图: 仿真效果: C语言程序代码: #include<reg51.h> #include<intrins.h> unsigned ...

  5. 关于单片机控制用字库显示LCD12864汉字

    /*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/ void SelectScreen(uchar screen) { switch(screen){ case 0: LCD12864CS1 ...

  6. 单片机控制数码管显示一个两位数

    题目具体要求: 数码管可以显示任意一个两位数. 仿真实验电路图: 实验代码: #include <at89x51.h> unsigned char duanma[]={0x3F,0x06

  7. 汉字点阵c语言程序,用c51单片机控制1616点阵显示汉字源代码

    #include #define uchar unsigned char #define uint unsigned int #define out0 P0 #define out2 P2 #defi ...

  8. 单片机原理及其应用——单片机控制8只发光二极管交替闪烁

    目录 一.实验要求 二.分析 三.利用Proteus仿真软件画原理图 四.Keil编程软件编写程序 五.实验结果 一.实验要求 [实验内容] 1.用Proteus绘制硬件原理图,并设置元件参数. 2. ...

  9. arduino数码管显示0到9_少儿Python程序第十二讲:单片机控制数码管

    本讲继续学习用Python控制单片机,并用单片机连接和控制其它硬件,具体目标是利用开发板控制四位数码管,显示指定的数字.实验效果如图12.1所示: 图12.1 单片机控制四位数码管显示数字 注意:请先 ...

最新文章

  1. C语言实现数据文件怎么找,急求如何将下列C语言程序数据存储到文件中?
  2. Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]
  3. 关于mysql行级锁中MVCC的一些理解
  4. Intel RealSense 数码相机和摄像机的ISO是什么意思?
  5. IOS15给UICollection添加测试数字
  6. html5页脚最低下,页面底部或内容的页脚,以较低者为准
  7. django 发送php,django 使用 request 获取浏览器发送的参数
  8. linux的一些资讯网站
  9. (孔乙己茴香豆的的“茴”字有几种写法)三栏布局两边固定中间自适应
  10. 正则表达式(一)字符串匹配
  11. FeedBurner 被阻尼,Feed 托管转到 FeedSky
  12. html如何添加qq聊天框
  13. R 单样本wilcoxon test
  14. 分布电容和杂散电容_部分电容和杂散电容
  15. python账号怎么注销_登录后如何注销
  16. ECharts 中的事件和行为
  17. 11月20日 如何在场景开启Debug,自定义AI任务,EQS,创建自己的环境任务,使用Pawn环境检测来检测周围的环境,让AI动作更顺滑(动画混合
  18. 微信公众号测试账号网址
  19. dp 这个单位是安卓发明的么?为什么 px=dp*(dpi/160)?
  20. 优思学院|德国制造为何被受推崇?

热门文章

  1. 1225_MISRA_C规范学习_预处理命令规则要求
  2. 2007------生活感悟
  3. 靶机渗透练习87-IA:Keyring (1.0.1)
  4. SIFS DIFS PIFS EIFS
  5. linux grep 多个文件,Linux多文件查找工具之grep
  6. 计算机组成原理系统总线概念,计算机组成原理-系统总线
  7. [英语阅读]热浪来袭 英国人蜂涌裸体海滩
  8. 拆解小鹏汽车财报:连续三个季度收入下滑,门店月均销量仅为8辆
  9. c#如何操作excel??
  10. 【李叫兽】为什么你有10年经验,但成不了专家?