设计一:51单片机流水灯控制

目录

一、设计内容

二、硬件电路分析

三、仿真原理图

四、程序设计

五、仿真结果

六、思考题

作者有话说


一、设计内容

       本次设计使用4个按键,当KEY1按下时,P0口所接的发光二极管(D1~D8)以100ms的时间间隔自下至上循环点亮3圈,当KEY2按下时,以200ms的时间间隔自上至下循环点亮3圈;当KEY3按下时,LED自两边至中间循环点亮,循环次数为3圈,时间间隔为1000ms;当KEY4按下时,LED自中间至两边循环点亮,循环次数为3圈,时间间隔为1000ms。平时LED的状态为全部熄灭。

二、硬件电路分析

1、芯片74HC245功能、引脚含义

74HC245功能是做缓冲器,其OE管脚控制输出使能,低电平有效,DIR 管脚控制数据传输方向,若DIR为高电平数据传输方向是为A->B ,否则为B ->A,A0->A7和B0->B7管脚均用于数据的输入/输出,VCC和GND分别为芯片的电源端和接地端。

2、芯片74HC138功能、引脚含义

74HC138功能为3位二进制,译码成8种输出状态,并且一共有8个输出I/OA0->A2为数据输入管脚,Y0->Y7为数据输出管脚,E1、E2、E控制芯片使能,只有当E1=0,E2=0,E3=1时,芯片才能被使能否则芯片不会有任何有效输出VCC和GND分别为芯片的电源端和接地端。

3、P0口作为通用I/O口时需注意

由于P0口的内部上拉电阻较大属于“弱上拉”,因此P0口输出高电平电流很小,而输出低电平时,下拉MOS管导通,灌电流较大,负载能力强。因此在设计中,一般采用低电平驱动方式。

4、点亮发光二极管硬件满足条件

点亮发光二极管需要让三极管导通,即Q3为低电平,即二极管的阴极为低电平。

三、仿真原理图

四、程序设计

/*******************************************************************************
* 函 数 名  				: main
* 函数功能		        : 按键流水灯
* 创作者  				: 薄情书生
* 创作时间  				: 2022.9.15
*******************************************************************************/

#include "reg52.h"         
#include "intrins.h"

/*********类型定义*********/
typedef unsigned char u8;
typedef unsigned int u16;

/*********按键定义*********/
sbit KEY0 = P3^2;
sbit KEY1 = P3^3;
sbit KEY2 = P3^4;
sbit KEY3 = P3^5;

/*********毫秒延时*********/
void delay_ms(u16 ms)
{
	u16 x,y;
	for(x=ms;x>0;x--)
		for(y=114;y>0;y--);
}

/*************38译码器**************/
void SelectHC138(unsigned char channel)
{
   switch(channel)
	 {
		 case 0:
        P1 = (P1 & 0x1f)|0x00;break;    //发光二极管(LEDS0)
   }
}

/*************LED由下至上**************/
void Bottom_Up()
{
	u8 i,j;
	for(j=0;j<3;j++)
	{
		for(i=0,P0 = 0xff;i<8;i++)
		{
			P0 = P0<<1;	 
			delay_ms(200); 
		}
	}
	P0 = 0xff;
}

/*************LED由上至下**************/
void Up_Bottom()
{
	u8 i,j;
	for(j=0;j<3;j++)
	{
		for(i=0,P0 = 0xff;i<8;i++)
		{
			P0 = P0>>1;	 
			delay_ms(100); 
		}
	}
	P0 = 0xff;
}

/*************两边至中间**************/
void LED_sides()
{
	u8 i,j,ri,lf;
	for(j=0;j<3;j++)
  {
		for(i=0,ri=0x7f,lf=0xfe;i<4;i++)
		{
			P0 = ri&lf;
			ri = _cror_(ri,1);
			lf = _crol_(lf,1);
			delay_ms(1000);
		}
  }
	P0 = 0xff;
}

/*************中间至两边**************/
void LED_middle()
{
	u8 i,j,ri,lf;
	for(j=0;j<3;j++)
	{
		for(i=0,ri=0xef,lf=0xf7;i<4;i++)
		{
			P0 = ri&lf;
			ri = _crol_(ri,1);
			lf = _cror_(lf,1);
			delay_ms(1000);
		}
	}
	P0=0xff;
}

/*******************主程序************************/
void main()
{
    SelectHC138(0);
	while(1)
	{
		if(KEY0==0)
		{
			delay_ms(10); 
			if(KEY0==0)
			{
               Up_Bottom();
			}
	    }
		if(KEY1==0)
		{
            delay_ms(10); 
			if(KEY1==0)
			{
               Bottom_Up();
		    }
	    }
		if(KEY2==0)
		{
            delay_ms(10); 
			if(KEY2==0)
		    {
               LED_sides();
			}
			
		}
		if(KEY3==0)
		{
            delay_ms(10); 
			if(KEY3==0)
		    {
                LED_middle();
			}
		}
	}
}

五、仿真结果

KEY1按下时,P0口所接的发光二极管(D1~D8)以100ms的时间间隔自下至上循环点亮3圈。

 KEY2按下时,以200ms的时间间隔自上至下循环点亮3圈。

 KEY3按下时,LED自两边至中间循环点亮,循环次数为3圈,时间间隔为1000ms。

 当KEY4按下时,LED自中间至两边循环点亮,循环次数为3圈,时间间隔为1000ms。

平时LED的状态为全部熄灭。

、思考题

修改程序,实现4个按键控制,自上至下、自下至上、发光二极管闪烁3次,时间间隔为500ms、发光二极管全部点亮3秒后熄灭、结束后恢复到所有LED熄灭的正常状态。请自行编写程序并调试。思考题参考程序将在设计二:51单片机外部中断实验给出。

作者有话说

本专栏为51单片机实战教程,旨在以练促学,帮助小伙伴快速入门51单片机,学习51单片机相应理论知识请自行学习。本次设计涉及的相关理论知识:51单片机IO口控制、独立按键的使用,请自行参考资料学习。

本次设计源程序及仿真源文件百度网盘链接:https://pan.baidu.com/s/17PtMjM5y-YSfdHlqnqAUnA      提取码:4ma5 
 

猜你喜欢

转载自blog.csdn.net/weixin_53402301/article/details/130907233