C51学习笔记——C语言实现灯闪烁和流水灯

1.要实现的效果

利用Keil和Proteus实现以下的功能:

  • 开关打开时,循环:0145闪烁3次+自上而下流水灯1次;
  • 开关关闭时,循环:2367闪烁3次+自下而上流水灯1次。

说明一下,我使用的软件版本是Keil uVision2Proteus7
为了实现以上的功能,我将LED接在了P0口上,将开关接在了P1.0上

2.硬件清单

硬件 数量 备注
单片机 1 80C51
开关 3 单刀单掷开关
电阻 8 100Ω
电源 1 5V
8 黄色LED

3.硬件连接

这里的开关弄多了,其实只需要一个就可以。
在这里插入图片描述

4.代码展示

#include<reg51.h>
#include<intrins.h>

short led1;
short flag_0145 = 0;
short flag_2367 = 0;
sbit switch1 = P1^0;

void delay(unsigned int i)	
{
    
    
    i*=100;
	while(--i);
}

void main()
{
    
    
    while(1)
    {
    
    
        //开始三次的闪灯
        if(switch1)         //开关1关闭 --> 0145灯闪烁三次 + 往下的流水灯
        {
    
    
            if(flag_0145 < 3)
            {
    
    
                P0 = 0xCC;
                delay(500);
                P0 = 0xFF;
                delay(500); 
                flag_0145++;               
                led1 = 0x7F;
            }
            flag_2367 = 0;
            if(flag_0145 == 3)     //闪灯结束,开始流水灯
            {
    
    

                led1 = _crol_(led1,1);
                P0 = led1;
                if(led1 == 0x7F)
                    flag_0145 = 0;
                delay(250);
      		}
		}
        else                 //开关1关闭 --> 2367灯闪烁三次 + 往上的流水灯
        {
    
    
            if(flag_2367 < 3)
            {
    
    
                P0 = ~0xCC;
                delay(500);
                P0 = 0xFF;
                delay(500);	 
                flag_2367++; 
                led1 = 0xFE;             
            }
            flag_0145 = 0;
            if(flag_2367 == 3) //闪灯结束,开始流水灯
            {
    
    
                led1 = _cror_(led1,1);
                P0 = led1;
                if(led1 == 0xFE)
                    flag_2367 = 0;
                delay(250);
    		}
		}
	}
}

5.效果展示

在这里插入图片描述请添加图片描述

6.推荐的参考文章

51单片机流水灯方法大全

猜你喜欢

转载自blog.csdn.net/weixin_52296952/article/details/123856990
今日推荐