51单片机-流水灯

发布时间:2011-3-21 11:36    发布者:诸葛孔明
关键词: 51单片机 , 流水灯
0_1284771614bbXp.gif


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

电阻有一个公共端,然后一个电源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
本文地址:https://www.eechina.com/thread-59035-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
williamkmcn 发表于 2011-7-7 17:30:27
好东西值得收藏
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表