51单片机按键控制流水灯

这篇具有很好参考价值的文章主要介绍了51单片机按键控制流水灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、按键的使用

<1>独立按键的原理图

51单片机按键控制流水灯

按键所对应的引脚为P3的0、1、2、3引脚口,并且这里总共有四个独立按键,它们公共的一段都接到了GND电源的负极。这样我们就知道按键上电的默认电平为高电平。所以我们只需要控制按键按下时给一个低电平0,不按下时默认高电平1就行。

 <2>按键控制LED灯的亮灭

按键消抖:抖动是机械按键存在的现象,是必须要进行处理的。一般处理有两种方式:一种是硬件消抖,另一种是软件消抖。硬件消抖不仅会增加开发成本,而且有时不稳定。一般都会选择软件消抖。

#include  "reg51.h"	

sbit LED = P2^0;//LED灯引脚定义
sbit KEY = P3^1;//按键引脚定义

void delay(int x)//延时函数(ms)
{
	int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<100;j++);
}

void main()
{
    while(1)
    {
        if(!KEY)//当按键按下时   
	    {
		    delay(15);//按键消抖
		    if(!KEY)//确定按键按下
		    {
		    	LED = !LED;//LED灯的状态取反
		    }
	    }
    }
}

if(!KEY)的含义:因为按键默认高电平,所以!KEY的值为0,当按下按键电平变为低电平,!KEY的值也就变为"非0";这样就可以做出判断了。

 注意:独立按键K1按键与K2按键按键网络编号是相反的,K1=P3^1、K2=P3^0。

2、独立按键控制LED灯

根据上一章流水灯、走马灯代码结合:

 LED流动正反方向中的type()函数与LED灯状态切换文章来源地址https://www.toymoban.com/news/detail-511043.html

#include "reg51.h"

#define LED P2

sbit KEY = P3^1;
bit direction;
char i;

void delay(int x)//延时函数(ms)
{
	int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<100;j++);
}

void type()				//流水灯的翻转
{
	if(!direction)	  
	{ 		   
		if(++i>8)			//正向移动
			i=0;
	}
	else
	{ 		   
		if(--i<0)			//反向移动
			i=8;
	}
}

void main()
{
    LED = buf[i];//LED灯的默认流向
    while(1)
    {
        if(!KEY)
        {
            delay(15);
            if(!KEY)
                direction = !direction;
        }
    }
}
#include  "reg52.h"	
#define	LED	P2				//宏定义LED引脚
sbit  K0=P3^1;				//定义按键引脚口
sbit  K1=P3^0;
sbit  K2=P3^2;
sbit  K3=P3^3;
bit   key_mark,direction;			//两个标志位,key_mark用于结束循环;direction用于LED灯亮灭的翻转
char  Buf[] = {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; 		//第一种流水灯方式,灯亮个数依次增加
char  Puf[] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};			//第二种流水灯方式,灯依次位移一位
char i;					//全局标量i,用于各个循环的使用
int n = 100;		//全局变量n用于延时的使用

void delay(int x)//延时函数(ms)
{
	int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<100;j++);
}

void speed()			//延时的加减
{
	if(!K1)
	{
		delay(15);
		if(!K1)
		{
			n += 100;			//加100ms
			if(n>1000)
				n=1000;
		}
	}
	if(!K2)
	{
		delay(15);
		if(!K2)
		{
			n -= 100;			//减100ms
			if(n<300)
				n=300;
		}
	}
}

void type()				//流水灯的翻转
{
	if(!direction)	  
	{ 		   
		if(++i>8)			//正向移动
			i=0;
	}
	else
	{ 		   
		if(--i<0)			//反向移动
			i=8;
	}
}

void mode1()		//模式1,当按下K0时,流水灯进行翻转
{
		if(!K0)
		{
			delay(15);
			if(!K0)
			{
				direction = !direction;//标志位direction状态取反
			}
		}
}

void mode2()		//模式2,当按下K1时流水灯使用第一种流水灯方式
{
	type();
	LED = Buf[i];   
	delay(n);		//延时n ms
}

void mode3()		//模式3,当按下K2时流水灯使用第二种流水灯方式
{
	type();
	LED = Puf[i];
	delay(n);
}

void mode4()		//模式4,当按下K3时,key_mark置为1,退出循环(在程序中起到一个暂停作用,用于流水灯状态切换的使用)
{
	if(!K3)
	{
		delay(15);
		if(!K3)
			key_mark = 1;
	}
}

void main()
{
	while(1)
	{
		if(!K1 && !key_mark)//判断按键是否按下K1,以及标志位key_mark是否为0(当key_mark不为0时说明此函数在其他循环中,则无法进入新循环)
		{
			delay(15);
			if(!K1)
			{
				while(!key_mark)
				{
					speed();					//引用函数,节省代码量以及书写的规范
					mode1();
					mode2();
					mode4();
				}
			}
		}
		if(!K2 && !key_mark)//判断按键是否按下K2,以及标志位key_mark是否为0(当key_mark不为0时说明此函数在其他循环中,则无法进入新循环)
		{
			delay(15);
			if(!K2)
			{
				while(!key_mark)
				{
					speed();
					mode1();
					mode3();
					mode4();
				}
			}
		}
		if(K0 || K1 || K2 ||K3)//没有按键按下时,标志位key_mark自动置0
			key_mark=0;
	}
}

到了这里,关于51单片机按键控制流水灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机入门 - 详解定时器实现按键控制流水灯方向

    操作系统:Windows 10 x84-64 单片机:STC89C52RC 编译器:SDCC 烧录软件:stcgal 1.6 开发板:普中51单片机开发板A2套件(2022) 在 VS Code 中新建项目到烧录的过程: 左侧EIDE图标 - 新建项目 - 空项目 - 8位MCU项目 - 保存文件夹。 更改构建配置: SDCC ;更改烧录配置: stcgal 。 在项目文件

    2024年02月06日
    浏览(47)
  • 【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯

    实验内容: 利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平。         1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0—F;         2.选中 8 位数码管的另 1 位数码管,当独立按键 2

    2024年02月06日
    浏览(46)
  • C51单片机按键控制流水灯模式(定时器版本)以及定时器时钟

      上篇文章我们学了关于定时器的三大组成部分及许多寄存器的概念问题,这篇文章我们就要开始讲解实操部分。 首先,我们先来看看本文最后写成的代码:      以上三张是代码的主函数,此外,代码中还需用到的独立按键检测代码在下面:  注意:头文件中#ifndef和#def

    2023年04月17日
    浏览(49)
  • 【51单片机】按键操作(单个灯闪烁&&流水灯)

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 ⭐注意 🍔同一个灯  🏳️‍🌈效果 🏳️‍🌈代码 🏳️‍🌈问题分析 ⭐注意 ⭐P3_1=0,表示按下按键  ⭐为什么while(

    2024年02月01日
    浏览(73)
  • 51单片机用定时器控制流水灯,呼吸灯

    让LED从L1开始流到L8,(间隔1S,使用定时器)然后全灭LED,然后从L1开始进行呼吸灯状态。之后L1,L3,L5,L7点亮,然后L2,L4,L6,L8点亮。最后所有LED全亮 #include REGX52.H #includeINTRINS.H sbit LED = P2 ^ 0; unsigned int TOTOTO = 0; int number = 0; unsigned int Time; unsigned int i; //配置定时器 void Timer0Init(

    2024年02月15日
    浏览(41)
  • 基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计

    基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0005 结合实际情况,基于51单片机设计一个LED彩灯控制器设计。该系统应满足的功能要

    2024年02月02日
    浏览(50)
  • 51单片机实现流水灯

    我们之前说过可以控制管脚口电平来控制LED的亮灭,低电平灯亮,高电平灯灭,具体可以看我之前的博客。 P20~P27可以用八位二进制数来表示每一位的电平,第八位是P20,第一位是P27,那么11111110就代表P20亮,其他灭,11101111就代表P24亮,其他灭。流水灯的代码就可以写成这样

    2024年02月11日
    浏览(47)
  • 51单片机入门流水灯

    上次已经实现了LED的点亮了,这篇文章将带大家实现流水灯。 要想实现流水灯首先就得知道什么是延时函数,延时函数的作用就是等待。比如延时一毫秒就是让程序在这里等待一毫秒。延时函数的本质就是执行一些空指令,因为执行指令需要耗费时间,所以执行一定数量的空

    2024年02月04日
    浏览(44)
  • 【51单片机】键控流水灯

    设置k3作为启动键,只有先按下k3才能开始控制流水灯,按下k3后LED闪烁提示开始成功。 在按下k3后,其余键即可控制流水灯。其中k1执行从右到左,k2执行从左到右。 按下k4,执行外部中断,立马中止流水灯运行,需重新按下启动键重启。

    2024年02月06日
    浏览(40)
  • 51单片机学习--LED流水灯

    延时代码可通过软件生成,系统频率要和开发板的晶振频率相对应。  

    2024年02月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包