专注于射频工程师,天线工程师和电子硬件工程师的培养
首页 > 技术文库 > 硬件设计 > 嵌入式/MCU > 51单片机-流水灯

51单片机-流水灯

时间:2020-12-13 点击:

这个是原理图,从图中最右边有一个排阻,也就是这里八个电阻封装在一起,这里排阻的特点是八个

电阻有一个公共端,然后一个电源VCC通过跳线与排阻相连。到达二极管的电流从正极流向负极,如

果二极管负极是低电平,则电流流过二极管,发光二极管亮起来。负极接在单片机的P2端口上。也就

是说P2的引脚位低电平时可驱动发光二极管发光。驱动各个灯闪烁的方法是把各位循环左移,使用函数

_crol_。

#include
#include
unsigned int a;

void delay(){
        int i,j;
        for(i = 0; i < 0xff; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}

void liushui(){
        int i,dd;
        dd = 0xfe;                        //dd = 1111  1110 此时L9亮
        for(i = 0; i < 8; i++){
                P2 = dd;                        
                delay();
                dd = _crol_(dd,1);          //循环左移一位 dd = 1111 1101
        }
}
void main(){
        while(1){
                liushui();
        }
}

流水灯向左流动,当按住独立按键时,流水灯向右移动:

#include
#include

unsigned int dd;
sbit key = P1^0;

void delay(){
        int i,j;
        for(i = 0; i < 0x2a; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}

void right(){
        P2 = dd;
        delay();
        dd = _crol_(dd,1);        
}

void left(){
        P2 = dd;
        delay();
        dd = _cror_(dd,1);
}

void main(){
        dd = 0xfe;
        while(1){
                if(key == 1)
                        right();
                else {
                        delay();
                        if(key == 0)
                                left();
                }               
        }               
}

PWM调制使流水灯渐灭,改变占空比。

   1. #include   
   2. #include   
   3. #define uint unsigned int  
   4. uint a;  
   5.   
   6. void delay(uint t){  
   7.     int i,j;  
   8.     for(i = 0; i < t; i++)  
   9.         for(j = 0; j < 0xff; j++)  
  10.             ;  
  11. }  
  12.   
  13. void liushui(){  
  14.     int i,dd;  
  15.     dd = 0xfe;                        //dd = 1111  1110 此时L9亮  
  16.     for(i = 0; i < 8; i++){  
  17.         P2 = dd;                          
  18.         delay(1000);  
  19.         dd = _crol_(dd,1);          //循环左移一位 dd = 1111 1101  
  20.         P2 = 0xff;  
  21.         delay(300);  
  22.     }   
  23. }  
  24. void main(){  
  25.     while(1){  
  26.         liushui();  
  27.     }  
  28. }

李万鹏
原文地址:http://blog.csdn.net/woshixingaaa/archive/2010/09/17/5891763.aspx

CopyRight © 2009-2021,易迪拓培训 All Rights Reserved,沪ICP备05048810-2号 版权所有

网站地图

Top