百度知道 - 信息提示

日期:2025-01-11 18:09:12 人气:1

百度知道 - 信息提示

    A+
热门评论

单片机一个接口怎么控制两个LED灯?!

确切的说一个IO口在指定时间内仅能输出一种状态(高和低,可以用来代表LED的亮和灭)。 如果楼主非要让一个LED长时间亮着的话,那就用缓冲吧!一般为了提高效率,我们会8个IO口一起操作,缓冲器也支持并且就是这样做的(所谓缓冲就是一些可以保存IO口某一时刻状态的电路)。 通俗说,单片机并不直接控制每一个LED的亮灭,而是通过相对应的缓冲器来间接控制。比如要控制1-8号LED全亮,单片机先选择1号缓冲器,然后发送一个全亮的指令给1号缓冲器,1号缓冲器会记住单片机的这个全亮指令控制并保持(直到单片机再发送来新的指令更改1-8号LED的状态)自己管理的8个LED的状态。 指令交给1号缓冲器后,单片机就可以选择二号缓冲器并发送控制9-16号LED的指令了,然后选择三号缓冲器并发送17-24号LED的指令.... 直到发送指令到第三百七拾五号缓冲器控制2992-3000号LED。有一个问题就是这样会需要375个缓冲器,并且需要24个IO口(8个IO口控制LED灯,16个IO口控制缓冲器)。 这个电路的效果就是单片机仅需要375*3=1125条指令就可以完全控制一遍这3000个LED,如果使用的单片机速度不太慢的话,这几乎不到10个毫秒,一秒钟可以控制3000个LED状态改变100次以上,虽然这个方法有点笨,成本还比较高,但他只使用了24个IO口!当然高手也许只需要16个甚至更少的IO口就能办到。

阅读全文

51单片机1个按键控制2个灯分别点亮的程序。

#include #define uchar unsigned char sbit key = P1^0; sbit led0 = P1^1; sbit led1 = P1^2; uchar count = 0; void delayms (uchar time)//延时 { for(time; time>0; time--) { TMOD |= 0x01; TH0 = 0xfc; TL0 = 0x18; TR0 = 1; //启动计数器0 while(TF0!=1);//计数溢出 TF0 = 0; TR0 = 0; } } void scan_key (void) { if (!key) { delayms (5); if (!key) { delayms (1); while (!key); count++; if (count==3) { count = 0; } } } } void main (void) { P1 = 0xff; while (1) { scan_key (); if (count==0) { led0 = 1; led1 = 1; } if (count==1) { led0 = 0; led1 = 1; } if (count==2) { led0 = 1; led1 = 0; } } }

阅读全文