流水灯

#include<reg52.h>
sbit  led1=P1^0;  //将P1口的第一位赋值给sbit 型的变量led1
void main(){
    while(1){   //使表达式始终为真
        led1=0;  //将P1口的第一位置零 ,即电路连通,点亮第一个发光二级管
                }
}
流水灯就是使二极管一会亮,一会暗从而产生闪烁的效果
二极管高电平时灭,低电平时亮,程序如下
#include<reg52.h>
sbit  led1=P1^0;  //将P1口的第一位赋值给sbit 型的变量led1
void main(){
unsigned int a;
    a=5000;             //数据随便定义
    while(1){         //使表达式始终为真
        led1=0;       //将P1口的第一位置零 ,即电路连通,点亮第一个发光二级管
        while(a--);   //做延迟使用
        a=5000;
        led1=1;       //将P1口的第一位置1 ,即电路断开,熄灭第一个发光二级管
        while(a--);   //做延迟
        a=5000;
                }
}
第一个二极管就闪烁了
为了方便调用,我们可以写一个延时的函数
如下:
void delay(){
    unsigned int  a;
    a=10000;
        while(a--);    
}
或者
void   delay(){
    unsigned  int  x,y;
    for(x=100;x>0;x--)
        for(y=100;y>0;y--)
        {};
}
我们也可以给延时函数加上参数,由我们自己来控制亮灭的时间
void   delay(unsigned  int  x, unsigned  int  y){
    for(x=100;x>0;x--)
        for(y=100;y>0;y--)
        {};
}
第一个的亮灭我们已经搞定,接下来的也很easy了,只要调用函数,多写几个,流水灯就出来了
我的流水灯如下
#include<reg52.h>
#define uint unsigned int             //宏定义
#define uchar unsigned char       //宏定义
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
void delay();
void main (){
        
      while(1) {
          led1=0;
          delay();
          led1=1;
          led2=0;
          delay();
          led2=1;
          led3=0;
          delay();
          led3=1;
          led4=0;
          delay();
          led4=1;
          led5=0;
          delay();
          led5=1;
          led6=0;
          delay();
          led6=1;
          led7=0;
          delay();
          led7=1;
          led8=0;
          delay();
          led8=1;

              }
    
}
void  delay(){
    uint x,y;
    for(x=100;x>0;x--)
        for(y=100;y>0;y--)    
            {};    

}
看上去很长,其实很简单,都是一些重复性的工作
当然对于做流水灯,我们也可以调用c 库里的函数_crol_()
语法:
#include <intrins.h>

unsigned char _crol_ (
  unsigned char c,        /* character to rotate left */
  unsigned char b);       /* bit positions to rotate */


_crol_(char  a,2)
即将一个字符型变量循环左移2位
char  a,b;
a=cxA5;   //10100101
b=_crol_(a,3);  //左移三位 ,多出的三位补到右边
b=0X2D ;   //00101101
由此函数可得流水灯如下

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int             //宏定义
#define uchar unsigned char       //宏定义
void delay();
void main(){
    unsigned char a;
    a=0xFE;
    P1=a;
    delay();
    P1=_crol_(P1,1);
    delay();
    P1=_crol_(P1,1);
    delay();
    P1=_crol_(P1,1);
    delay();
    P1=_crol_(P1,1);
    delay();
    P1=_crol_(P1,1);
    delay();
    P1=_crol_(P1,1);
    delay();
    P1=_crol_(P1,1);
    delay();
}
void  delay(){
    uint x,y;
    for(x=100;x>0;x--)
        for(y=100;y>0;y--)    
            {};    

}
流水灯完成
带参数的延时函数
void delay(unsigned int time){
        unsigned int   j,i;
        for(j=time;j>0;j--)
            for(i=115;i>0;i--);
        }
当time为1时,延时1毫秒。当time为500时延时500毫秒。当time为1000时,延时1秒

posted @ 2013-03-04 19:58  tuteng  阅读(350)  评论(0编辑  收藏  举报