首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

51单片机-流水灯

51单片机-流水灯

关键词: 51单片机 , 流水灯



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

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

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

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

_crol_。

#include <reg52.h>
#include <intrins.h>
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 <reg52.h>
#include <intrins.h>

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 <reg52.h>  
   2. #include <intrins.h>  
   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. }


返回列表