简易多彩广告灯设计

设计方案

设计一个以51单片机为核心的简易多彩广告灯闪烁控制系统。2位数码管显示闪烁控制方案,分别显示01、02、03、和10号方案,初始化为00,彩灯灭;2个控制按键,一个加一数字键,一个确定键,循环十个花型方案。方案01为左循环一秒闪烁;方案02为右循环一秒闪烁;方案03为 10000000 11000000 ... 11111111 递增间隔一秒闪烁;方案10为 01010101 、10101010间隔一秒闪烁;其余方案灯灭。

设计原理图


#include<reg52.h>

void left_loop();                        //声明左移函数
void right_loop();                       //声明右移函数
void ji_ou();                            //声明奇偶函数
void delayms(unsigned int xms) ;         //延时函数声明
void increase();                         //递增亮灯函数声明
void other_programme();                  //其他方案函数声明
void key_detect(void);                   //按键检测声明
void display(void);                      //数码管显示函数声明



sbit key1 = P0^0;                        //加一键
sbit key2 = P0^1;                        //确认键

unsigned int flag = 0;                  //方案计数变量



//数码管显示字符转换表
unsigned char code table[] = {
    0xC0,0xF9,0xA4,0xB0,0x99,
    0x92,0x82,0xF8,0x80,0x90
};


void main()
{
   while(1)
   {
       
       key_detect();                //按键检测
       
       if(flag==11)
       {
           flag = 0;
       }
       
       
       display();
       
       
   }
      
}




//方案01,流水灯左移1s

void left_loop()
{
    unsigned char cnt = 0;               //定义计数变量cnt,用于移位控制

    while(1)
        {
            P1 = ~(0x01 << cnt);            //P0等于1左移cnt位,控制8个LED
            delayms(1000);                 //软件延时
            cnt++;                         //移位计数变量自加1
            if (cnt >= 8)                 //移位计数超过7后,再重新从0开始
            {
                cnt = 0;
            }
         
               
         delayms(100);
         P1 = 0xff;
        
       
        if(key1==0)
        {
            P1 = 0xff;                    //加一计数键按下,所有灯灭
            delayms(20);
            if(key1==0)
            {
                P1 = 0xff;
                flag++;
                delayms(10);
            }
            while(!key1);                   //检测按键是否松开
            delayms(20);
            while(!key1);
            break;
            
        }
           
    }        
}



//方案02,流水灯右移1s
void right_loop()
{
     unsigned char cnt = 0;  //定义计数变量cnt,用于移位控制

   
    while (1)  //主循环,程序无限循环执行该循环体语句
    {
        P1 = ~(0x80 >> cnt);      //P0等于0x80右移cnt位,控制8个LED
        delayms(1000);
        cnt++;                    //移位计数变量自加1
        if (cnt >= 8)             //移位计数超过7后,再重新从0开始
        {
            cnt = 0;
        }
        
        delayms(100);
        P1 = 0xff;
        
        
        if(key1==0)
        {
            P1 = 0xff;
            delayms(20);
            if(key1==0)
            {
                P1 = 0xff;
                flag++;
                delayms(10);
            }
            while(!key1);               //检测按键是否松开
            delayms(20);
            while(!key1);
            break;
        }
        
        
    }
}




//方案03,递增间隔一秒闪烁

void increase()
{
    unsigned int i = 0;
    unsigned char a[] = {0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
    while(1)
    {
        if(i>8)
        {
            i = 0;
        }
        P1 = a[i];
        
        delayms(1000);
        
        P1 = 0xff;
        delayms(1000);
        i++;
        
        
       if(key1==0)
       {
           delayms(10);
            if(key1==0)
        {
            P1 = 0xff;
            flag++;
            delayms(10);
        }
        
        
        while(!key1);               //检测按键是否松开
        delayms(10);
        while(!key1);
        
        
       }
    }
}




//方案10,奇偶间隔闪烁
void ji_ou()
{
    while(1)
    {
        
        P1 = 0xaa;
        delayms(1000);
        P1 = ~0xaa;
        delayms(1000);
        
        
        if(key1==0)
        {
            delayms(10);
            if(key1==0)
            {
                P1 = 0xff;
                flag++;
                delayms(10);
            }
            while(!key1);           //检测按键是否松开
            delayms(20);
            while(!key1);
            break;
                        
        }
                    
    }
        
}



 //其他方案,广告灯全灭
void other_programme()
{
    
    P1 = 0xff;
    delayms(10);
    if(key1==0)
    {
        delayms(10);
        if(key1==10)
        {
            P1 = 0xff;
            flag++;
            delayms(10);
        }
        while(!key1)
        delayms(20);
        while(!key1);
        
    }
    
}




//数码管显示函数
void display(void)
{
    unsigned int shi,ge;
    shi = flag/10;          //取十位
    ge  = flag%10;          //取个位
    
    P2 = table[shi];        //送十位进数码管
    
    delayms(1);
    
    P3 = table[ge];         //送个位进数码管
    
    delayms(1);
}




 //按键检测函数
void key_detect()
{
    if(key1==0)
    {
        delayms(10);                    //按键消抖
        if(key1==0)
        {
            flag++;
        }
        while(!key1);                   //检测是否松开key1加一计数键
    }
    else if(key2==0)
    {
        delayms(10);                    //按键消抖
        if(key2==0)
        {
            switch(flag)
            {
                case 1:left_loop();  break;
                case 2:right_loop(); break;
                case 3:increase();   break;
                case 10:ji_ou();     break;
                default:other_programme();          //其他方案全灭
            }
        }
        while(!key2);               //检测key2键盘是否松开
    }
}





//延时x毫秒
void delayms(unsigned int xms)          //延时xms
{
    unsigned int i,j;                                                       
    
    for(i=xms;i>0;i--)
    {
        for(j=110;j>0;j--);
    }


}

猜你喜欢

转载自blog.csdn.net/qq_36192043/article/details/80910755