Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24166
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-01 20:38
文章分类

全部博文(6)

文章存档

2016年(2)

2014年(4)

我的朋友

分类: 嵌入式

2014-06-09 20:40:31

4LED左移动

实现移动,可以用上面的方法逐个点亮熄灭LED2~LED9灯,实现流水灯的效果。



//*******************************************

//  名称:LED灯左移动

//*******************************************

//  作用:从左到右依次让LED灯亮1秒然后熄灭

//*******************************************

#include

#define uint unsigned int

void delayms(uint);                          

sbit led2=P1^0;

sbit led3=P1^1;

sbit led4=P1^2;

sbit led5=P1^3;

sbit led6=P1^4;

sbit led7=P1^5;

sbit led8=P1^6;

sbit led9=P1^7;

void main()

 {

  while(1)

  {

        led2=0;

        delayms(1000);                 

        led2=1;

        delayms(1000);                 

        led3=0;

        delayms(1000);                 

        led3=1;

        delayms(1000);                 

        led4=0;

        delayms(1000);                 

        led4=1;

        delayms(1000);                 

        led5=0;

        delayms(1000);                 

        led5=1;

        delayms(1000);                 

        led6=0;

        delayms(1000);                 

        led6=1;

        delayms(1000);                 

        led7=0;

        delayms(1000);                 

        led7=1;

        delayms(1000);                 

        led8=0;

        delayms(1000);                 

        led8=1;

        delayms(1000);                 

        led9=0;

        delayms(1000);                 

        led9=1;

        delayms(1000);                 

  }

  }

 

void delayms(unsigned int xms)

{

  uint i,j;                           

  for(i=xms;i>0;i--)

        for(j=114;j>0;j--);

}

可以看到,这个太复杂了,如果灯太多的话,程序命令更复杂。所以考虑用其他方法实现。在实现流水灯可以用C51已有的库文件_crol_()实现循环左移。

完整源代码如下:

//*******************************************

//  名称:LED灯左移动(用_crol_实现)

//*******************************************

//  作用:从左到右依次让LED灯亮1秒然后熄灭

//*******************************************

#include

#include                      //引入移动头文件

#define uint unsigned int

#define uchar unsigned char

void delayms(uint);                        

void main()

 {

     P1=0xFE;                             //给定初值,LED2被点亮

      while(1)

      {

         delayms(1000);

         P1=_crol_(P1,1);

      }

  }

 

void delayms(unsigned int xms)

{

      uint i,j;                           

      for(i=xms;i>0;i--)

           for(j=114;j>0;j--);

}





使用库函数的时候一定要注意:要记得引入头文件#include,要不然会报错;其次,要给定初始值,比如上例的a=0xFE,移动是在此基础上进行的。

右移的实现用,只需要将初始值和库函数改一下就可以了。

完整源代码如下:

//*******************************************

//  名称:LED灯右移动(用_cror_实现)

//*******************************************

//  作用:从右到左依次让LED灯亮1秒然后熄灭

//*******************************************

#include

#include                      //引入移动头文件

#define uint unsigned int

#define uchar unsigned char

void delayms(uint);                        

void main()

 {

     P1=0x7F;                             //给定初值,LED2被点亮

      while(1)

      {

         delayms(1000);

         P1=_cror_(P1,1);

      }

  }

 

void delayms(unsigned int xms)

{

      uint i,j;                           

      for(i=xms;i>0;i--)

           for(j=114;j>0;j--);

}





除了左移和右移以外,还可以实现花样灯。花样灯顾名思义就是灯的流动种类会很多,街上的霓虹灯就是一种花样灯。


5
、花样灯

因为花样灯的种类很多,把所需要的所有花样,存储在一个数组里面,按照顺序送到相应的单片机口,实现点亮功能。


//*******************************************

//  名称:花样灯

//*******************************************

//  作用:按照设定的值显示花样灯

//*******************************************

#include

#define uint unsigned int

#define uchar unsigned char

void delayms(uint); 

uchar code table[]={

0xFC,0xF9,0xE3,0xF7,0xCF,0x9F,0x3F,0x7F,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0x7E,

0xBD,0xDB,0xE7,0xFF,0xE7,0xC3,0x81,0x00,0x81,0xC3,

0xE7,0xFF,0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,

0xF8,0xF1,0xE3,0xC7,0x8F,0x1F,0x3F,0x7F,0x7F,0x3F,

0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFF,0x00,0x00,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,

0xFB,0xFD,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,

0xe0,0xf0,0xf8,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,

0xff,0x00,0xff};                  

void main()

 {

     uchar i;                         

      while(1)

      {

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

         {

                 P1=table[i];

                 delayms(500);

         }

      }

  }

 

void delayms(unsigned int xms)

{

      uint i,j;                           

      for(i=xms;i>0;i--)

           for(j=114;j>0;j--);

}

只要存储器允许的情况下,可以给数组中无限添加数据。

接下来实现另外一个现实中最常见的指示灯——交通灯。

6、交通灯

交通灯就是要考虑东西方向和南北方向的三个灯,在不同颜色下的变化。

在东西和南北方向分别用三个指示灯来模拟三种红绿灯指示。
电路图可以看出,LED2LED3为红色指示灯,LED4LED5为黄色指示灯,LED6LED7为绿色指示灯。设定LED2LED4LED6代表的是东西方向的三个红绿指示灯;LED3LED5LED7代表的是南方方向的红绿指示灯。



完整的源代码如下:

//*******************************************

//  名称:交通灯

//*******************************************

//  作用:模拟交通灯显示

//*******************************************

#include

#define uint unsigned int

#define uchar unsigned char

sbit RED_A=P1^0;                            //A为东西向

sbit RED_B=P1^1;                            //B为南北向

sbit YELLOW_A=P1^2;

sbit YELLOW_B=P1^3;

sbit GREEN_A=P1^4;

sbit GREEN_B=P1^5;

void delayms(uint); 

void traffic_light();

uchar operation_type=1;

uchar a=0;

uchar i;

void main()

 {

     while(1)

      {

         traffic_light();

      }

  }

void delayms(unsigned int xms)

{

      uint i,j;                           

      for(i=xms;i>0;i--)

           for(j=114;j>0;j--);

}

void traffic_light()

{

      uchar i;

      switch (operation_type)

      {

           case 1:

                      GREEN_A=0;     RED_A=1; YELLOW_A=1;            //东西向绿灯亮

                      GREEN_B=1;     RED_B=0; YELLOW_B=1;            //南北向红灯亮

                      delayms(1000);

                      operation_type=2;

           case 2:

                      delayms(1000);

                      GREEN_A=1;                                              //东西向绿灯关闭

                      for(i=10;i>0;i--)                               //东西向黄灯闪烁

                      {      ++a;

                            if(a==10) RED_B=1;

                              YELLOW_A=~YELLOW_A;

                              delayms(500);

 

                      }

                      a=0;

                      operation_type=3;

           case 3:

                      RED_A=0;YELLOW_A=1;GREEN_A=1;                   //东西向红灯亮

                      RED_B=1;YELLOW_B=1;GREEN_B=0;                   //南北向绿灯亮

                       delayms(1000);

                      operation_type=4;

           case 4:

                      GREEN_B=1;                                              //东西向绿灯关闭

                      for(i=10;i>0;i--)                               //东西向黄灯闪烁

                      {

                            ++a;

                             if(a==10) RED_A=1;

                              YELLOW_B=~YELLOW_B;

                              delayms(500);

                      }

                      a=0;

                      operation_type=1;

      }

}

 


到此, LED灯所有内容都学习完了。

阅读(1537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~