代码改变世界

单片机实验:节日彩灯控制器

2022-01-12 00:35  jym蒟蒻  阅读(930)  评论(0编辑  收藏  举报

任务

设计8路节日彩灯控制器,要求在Protues中设计接口电路图,并编程实现节日彩灯闪烁方式的控制:

  1. 通过P1.0到P1.2来控制3个按键。3个按键分别对应3种彩灯闪烁方式。
  2. 彩灯闪烁方式分别为:从上往下的循环、从下往上以及从中间向两边再从两边到中间三种流水方式。

代码

#include<reg52.h>
#include<intrins.h>  //包含循环左、右移位函数的头文件(_crol_, _cror_)
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
unsigned char keyval;    
void key_scan(void);    //按键扫描,取键值
void forward(void);       //从上到下闪烁
void backward(void);         //从下到上闪烁
void middleward(void);      //从中间到两边,再从两边到中间
void delay10ms(void);   //按键扫描延时,防抖动
void led_delay(void);
void main(void)
{
    keyval=0;              //键盘初始化为0
        while(1)
        {
           key_scan();        //调用键盘扫描函数
           switch(keyval)
           {
               case 1:forward();             //键值为1,从上到下闪烁
                   break;
               case 2:backward();             //键值为2,从下到上闪烁
                   break;
               case 3:middleward();              //键值为3,从中间到两边,再从两边到中间
                   break;
           }
        }
}
void key_scan(void)
{
    P1=0xff;
        if((P1&0x0f)!=0x0f)        //检测到有键按下
        {
           delay10ms();
           if(S1==0)
           keyval=1;
           if(S2==0)
           keyval=2;
           if(S3==0)
           keyval=3;
    }
}
void forward(void)
{
   P2=0xfe;            //1
   led_delay();
   P2=0xfd;            //2
   led_delay();
   P2=0xfb;            //3
   led_delay();
   P2=0xf7;            //4
   led_delay();
   P2=0xef;            //5
   led_delay();
   P2=0xdf;            //6
   led_delay();
   P2=0xbf;            //7
   led_delay();
   P2=0x7f;            //8
   led_delay();
}

void backward(void)
{
    P2=0x7f;            //8
    led_delay();
    P2=0xbf;            //7
    led_delay();
    P2=0xdf;            //6
    led_delay();
    P2=0xef;            //5
    led_delay();
    P2=0xf7;            //4
    led_delay();
    P2=0xfb;            //3
    led_delay();
    P2=0xfd;            //2
    led_delay();
    P2=0xfe;            //1
    led_delay();
}

void middleward(void)
{
     P2=0xe7;
     led_delay();
     P2=0xdb;
     led_delay();
     P2=0xbd;
     led_delay();
     P2=0x7e;
     led_delay();
     P2=0xbd;
     led_delay();
     P2=0xdb;
     led_delay();
}
void led_delay(void)
{
    unsigned char i,j;
        for(i=0;i<220;i++)
        for(j=0;j<220;j++);
}
  
void delay10ms(void)
{   
    unsigned char i,j;
        for(i=0;i<100;i++)
        for(j=0;j<100;j++);
}

仿真

键值为1,从上到下闪烁

 

键值为2,从下到上闪烁

 

键值为3,从中间到两边,再从两边到中间