找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3597|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机系列连载2—美丽的发光二极管

[复制链接]
跳转到指定楼层
楼主
ID:51090 发表于 2014-10-15 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天简单地介绍一下发光二极管,发光二极管看似简单,但是在市场中也有很多应用。比如说,在大家经常使用的充电器就有发光二极管的应用,如下图所示:

                  




      这就是简易充电器电路,其中LED也就是发光二极管既起到半波整流的作用又兼做指示灯。同样的原理,发光二极管还可以给灯具开关做指示灯、给工业设备配电箱做指示灯以及用共阴极双色LED对电源插座指示等等。



接下来,简单地说一下c语言程序。



大体而言,可以采用位操作与总线操作两种方式写程序,比如让第一个发光二极管亮:

(1)、位操作                               (2)总线操作

     #include<at89x52.h>                          #include<at89x52.h>   

     sbit D1=P1^0;                              void main()

       void main()                             {P1=0xfd;

     {  D1=0;                                  }

     }            



    在此基础上,添加一些循环、延时就可以让其闪烁,如让第一个二极管闪烁的三种方法:



        法一:#include<at89x52.h>         

               sbit P1_1=P1^0;

                void main()

                {unsigned int i;

                 while(1)

                {P1_1=0;

               for(i=1;i<10000;i++);

               P1_1=1;

              for(i=1;i<10000;i++);

               }}

         

        法二:#include<at89x52.h>

              sbit P1_1=P1^0;

              void yanshi();

              void main()

              {while(1)

              {P1_1=0;

               yanshi();

               P1_1=1;

               yanshi();}}

               void yanshi()

               {unsigned int i;

                for(i=0;i<10000;i++);}



        法三:#include<at89x52.h>

               void main()

              {while(1)

               {

              int i;i=50000;

                P1=0xfe;

                while(i--);

                P1=0xff;

                i=50000;

              while(i--);

                 }

                    }

   当然,还有更好玩的,比如非常好看的流水灯,其实原理跟上面一样:



            法一:直接法

                  #include<at89x52.h>

                  sbit P1_1=P1^0;

                  void yanshi();

                    void main()

                    {while(1)

                    {P1=0xfe;

                     yanshi();

                     P1=0xfd;

                     yanshi();

                     P1=0xfb;

                     yanshi();

                     P1=0xf7;

                     yanshi();

                     P1=0xef;

                     yanshi();

                     P1=0xdf;

                     yanshi();

                     P1=0xbf;

                     yanshi();

                      P1=0x7f;

                     yanshi();

                       }}

                 void yanshi()

                {unsigned int i;

                for(i=0;i<10000;i++);}



          法二:使用数组

                 #include<at89x52.h>

                 unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

                 void yanshi();

                 void main()

                {unsigned int i;

                 while(1)

                {

                 for(i=0;i<8;i++)

                 {P1=table[ i];   (注意,在这里的大括号是一定要加的,否则你就out了)

                  yanshi();

                   }}}

                 void yanshi()

                {unsigned int i;

                for(i=0;i<10000;i++);}



           法三:左移右移

              #include<at89x52.h>

              unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

              unsigned int i;

              void yanshi();

              void main()

              {P1=0xfe;

              while(1)

              {P1=P1<<1;

              P1=P1|0x01;(因为是左移而不是循环左移,所以要末位置一,这样的结果也会导致最后只挨个量一次)

               yanshi();}

                }



             void yanshi()

            {unsigned int i;

            for(i=0;i<10000;i++);}



    其实想想并不是很难,就是赋值控制亮灭,主要是记住延时那个函数,最后调用就可以了,在这个基础上再拓展一下,双灯左移右移闪烁,也就是双灯左移7次,右移7次,然后全闪7次,程序如下:



             #include<at89x52.h>

             void Delay(unsigned int i);

              void main()

             {unsigned char i;

              unsigned char temp;

              while(1)

              {temp=0xfc;

                P1=temp;

               for(i=0;i<7;i++)

               Delay(50000);

              {temp<<=1;

              temp=temp|0x01;

               P1=temp;}之所以加入temp做中间变量,防止直接操作端口造成的短暂闪烁

              Temp=0x3f;

              P1=temp;

              For(i=0;i<7;i++)

              {Delay(50000);

                Temp>>=1;

                Temp|=0x80;

                 P1=temp;}

               For(i=0;i<3;i++)

               P1=0xff;

               Delay(50000);

               P1=0x00;

               Delay(50000);}

               }  }

              

            void Delay(unsigned int i)

            {

           while(--i);

                }



    这么一分析,发光二极管真的很简单,赋值端口,控制亮灭,延时,调用函数,基本上就可以了,最重要的是c语言简单知识的一些规范,这都是入门的,不难理解,细心一些就好了,个人觉得比较好的还是自己写程序去调试,调试次数多了,自然而然就熟悉了,孰能生巧,对很多事情都是亘古不变的真理,学习更是如此。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:67312 发表于 2014-10-16 11:22 | 只看该作者
谢谢,谢谢楼主的无私奉献
回复

使用道具 举报

板凳
ID:69860 发表于 2014-12-6 16:30 | 只看该作者

谢谢楼主
回复

使用道具 举报

地板
ID:70045 发表于 2014-12-6 16:53 | 只看该作者
学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表