【C51单片机】流水灯(仿真)

1、流水灯功能


所谓流水灯就是8个发光二极管(LED)轮流点亮,周而复始,实现多花样流水灯效果,如:8个发光二极管循环点亮(第①号灯亮、第②号灯亮……第⑧号灯亮,第①号灯亮、第②号灯亮……第⑧号灯亮,……,每次只亮一个灯);8个LED从左到右循环依次点亮(第①号灯亮、第①②号灯亮……第①②③④⑤⑥⑦⑧号灯亮),间隔1s,直到8个灯全亮后,蜂鸣器响一下,然后都熄灭,再又从左到右循环依次点亮,如此循环;同时要做出多种效果 

2、PROTEUS中设计的电路图

3、源代码

#include <reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit button=P2^0;
u8 k=0;
sbit FM = P2^3;
void delay_ms(int x)
{
    int i,j;
     for(i=0;i<=x;i++)
         for(j=0;j<=110;j++);
}

//从左向右
void light1()
{
    unsigned char temp,i;
    temp=0xff;
    for(i=0;i<9;i++)
    {    delay_ms(500);
        P0=temp; 
         delay_ms(500);
        temp=temp<<1;
    }
    TR0=1;
    delay_ms(1000);
    P0=0xff;
        
}
//从右向左
void light2()
{
    unsigned char temp,i;
    temp=0xff;
    for(i=0;i<9;i++)
    {
        delay_ms(500);
        P0=temp; 
         delay_ms(500);
        temp=temp>>1;
    }
    TR0=1;
    delay_ms(1000);
    P0=0xff;
}

//两个灯一起亮
void light3()
{
    unsigned char temp,i;
    temp=0xff;
    for(i=0;i<5;i++)
    {
        delay_ms(500);
        P0=temp; 
         delay_ms(500);
        temp=temp<<2;
    }
    TR0=1;
    delay_ms(1000);
    P0=0xff;
}


//两边向中间    
void light4()
{
         
     unsigned char i;
     unsigned char *Temp[4];
     Temp[0] = 0x7e;
     Temp[1] = 0x3c;  
     Temp[2] = 0x18; 
     Temp[3] = 0x00;
     for(i=0;i<4;i++)
     {    
         delay_ms(500);
           P0=Temp[i];
         delay_ms(500); 
     }
    TR0=1;
    delay_ms(1000);
    P0=0xff;
}

void main()
{
    FM=1;
    TL0 = (8192-1250)%32;
    TH0    = (8192-1250)/32;
    TMOD = 0X00;
    EA=1;//总中断允许
    ET0 = 1;
    while(1){
        
        light1();
        light2();
        light3();
        light4();
    } 
}

void time0() interrupt 1
{
    TL0 = (8192-1000)%32;
    TH0    = (8192-1000)/32;
    FM = ~FM;
    k++;
    if(k==50) {FM=1;k=0;TR0=0;}
}

4、流水灯效果

效果视频展示

问题咨询及项目源码请加群:

QQ群

名称:IT项目交流群

群号:245022761

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值