51单片机一个按键,通过单击,双击,三击,长按实现四种不同的led特效并且每次切换模式伴随不同的音效。(连击4下为无效指令)

2023-11-16

一个定时器负责扫描按键按下的时间长短,一个定时器负责实现具体的led特效功能,主函数循环扫描按键,避免了占用cpu资源过多,导致程序堵塞,无法扫描到按键等问题;还可以通过定时器来扫描按键按下,时长等,想要实现的程序放在主函数中执行。新人第一次写博客,不足之处欢迎指正,感谢!

主函数部分:

#include <REGX52.H>
#include "DELAY.h"
#include "INTRINS.h"
#include "BEEP.h"
#define LED P2 
sbit KEY = P3^0;
unsigned char D1 = 0xFE;
unsigned char D2 = 0xFD;
unsigned char D3 = 0xFB;
unsigned char D4 = 0xF7;
unsigned char num,compare;
unsigned char Flag1,Flag2;
unsigned int counter,time,a,b,c,d;


/**************************************
通过定时器来实现一个按键,单击闪烁灯,双击跑马灯,三击呼吸灯,长按流星灯
并且每次切换模式伴随不同的音效。(连击4下为无效指令)
***************************************/


void TimerInit(void)		//@11.0592MHz
{
	TMOD=0x11;
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TL1 = 0xA4;		//设置定时初值
	TH1 = 0xFF;		//设置定时初值
	TF0 = 0;	
	TF1 = 0;
	TR0 = 0;	
	TR1 = 0;
	EA = 1;
	ET1 = 1;
	ET0 = 1;
	PT0 = 1;
}
void key_count()
{
		if(KEY==0)		//按键按下	
		{	
			Delayms(5) ; 			//消抖
//			TR1 = 0;		//可选择按键按下时停止任何功能
			if(KEY==0)   
			{	
				TR0 = 1 ;  //开始计时
				while(KEY==0);
				TR0 = 0 ; //结束计时
			}
		}
		if(KEY==1)		//松手检测
		{
			if(counter>=100)  //按下超过时间
			{
				TR1 = 0;  //防止呼吸灯模式之间切换造成的影响
				Beep_voice(6);
				LED = 0xFF;  //重置LED状态
				Flag1 = 4; 
				TR1 = 1;
			}
			else if((counter>1)&&(counter<100)) //每次按下不超过1秒
			{
				num ++; 			//按键次数加1
				time = 7000;	//如果此时按键再次按下会被重新赋予6000
			}
				counter = 0;  //按下检测时间清0
		
		if(time) 	//大于0,减少
		{
				time--; //通过自减来计时
			if(time==0) //计时结束,开始判断
			{
				LED = 0xFF;
				switch(num)  //判断按下几次
				{
					case 1:     //单击开启定时器模式一
					{
						TR1 = 0;
						Beep_voice(1);
						LED = 0xFF;
						Flag1 = 1;
						TR1 = 1;
						break ;
					}
					case 2:   //双击开启定时器模式二
					{
						TR1 = 0;
						Beep_voice(3);
						LED = 0xFF;
						Flag1 = 2;
						TR1 = 1;
						break ;
					}
					case 3:		//三击开启定时器模式三
					{
						TR1 = 0;
						Beep_voice(4);
						LED = 0xFF;
						Flag2 = 0;
						Flag1 = 3;
						TR1 = 1;
						break ;
					}										
				}
				time=0;
				num=0;			//按键按下次数清0					
			}
		}
	}
}
void main()		//实现一个按键按下:单击闪烁灯,双击跑马灯,三级呼吸灯,长按流星灯
{
	TimerInit();
	LED = 0xFF;
	while(1)
	{
	 key_count();
	}	
}

void Time0() interrupt 1  //定时器10ms进入一次中断扫描,计数值加1
{
	counter ++;
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
}

void Time1() interrupt 3
{
	TR1=0;	
 if(Flag1==4) 		//流星灯
{
	static unsigned int count,d;
	count ++ ;
	d++ ;
	if(count>=1600)
	{	
		D1 = _crol_(D1,1);
		D2 = _crol_(D2,1);		
		D3 = _crol_(D3,1);
		D4 = _crol_(D4,1);	
		count = 0;
	}
	d%=100;
	if(d<=5)LED &= D1;
	else LED |= ~D1;
	if(d<=10)LED &= D2;
	else LED |= ~D2;
	if(d<=40)LED &= D3;
	else LED |= ~D3;
	if(d<=100)LED &= D4;
	else LED |= ~D4;
	
	TL1 = 0xA4;		//设置定时初值
	TH1 = 0xFF;		//设置定时初值
 }
	if(Flag1==3)  	//呼吸灯
{
	 d++;
     c ++ ;
     c %= 100 ;//到达100后清0
	if(d==50)
	{
		compare ++;
		d=0;
		if(compare==100){Flag2=~Flag2;compare=0;}
	}
	if(Flag2!=0xFF)
	{	
		if(c>compare)
		{
			P2_0 = 1;
		}
		else
		{
			P2_0 = 0;
		}
	}
	if(Flag2==0xFF)
	{
		if(c>compare)
		{
			P2_0 = 0;
		}
		else
		{
			P2_0 = 1;
		}		
	}
	 TL1 = 0xA4 ;    //100us
     TH1 = 0xFF ;
}
	if(Flag1==2)		//跑马灯
	{
		b++;
		if(b==200)
		{
			LED = D1;
			D1 = _crol_(D1,1);
			b=0;
		}
			TL1 = 0x66;		//设置定时初值1ms
			TH1 = 0xFC;		//设置定时初值
	}
	if(Flag1==1)			//闪烁灯
	{
		a++;
		if(a==300)
		{
			a=0;
			LED = ~LED;
		}
		TL1 = 0x66;		//设置定时初值1ms
		TH1 = 0xFC;		//设置定时初值	
	}
	TR1=1;
}



蜂鸣器部分:


#include <REGX52.H>
#include "DELAY.h"
sbit Beep = P2^5;

void Beep_voice(unsigned int e)
{
	unsigned int j ;
	for(j=0;j<400;j++)
	{
		Beep = ~Beep ;
		Delayus(e);
	}
}


延时函数部分:

#include<intrins.h>
void Delayus(unsigned int xus)		//@11.0592MHz
{
	unsigned char i;
	while(xus--)
	{
	_nop_();
	i = 25;
	while (--i);
	}
}

void Delayms(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机一个按键,通过单击,双击,三击,长按实现四种不同的led特效并且每次切换模式伴随不同的音效。(连击4下为无效指令) 的相关文章

  • 我可以使用反射更改 C# 中的私有只读字段吗?

    我想知道 由于很多事情都可以使用反射完成 我可以在构造函数完成执行后更改私有只读字段吗 注 只是好奇 public class Foo private readonly int bar public Foo int num bar num
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • C++0x 中的新 unicode 字符

    我正在构建一个 API 它允许我获取各种编码的字符串 包括 utf8 utf16 utf32 和 wchar t 根据操作系统 可能是 utf32 或 utf16 新的 C 标准引入了新类型char16 t and char32 t没有这么
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再

随机推荐

  • 数据分析之-pandas

    1 pandas库安装导入 windows下和linux下都可以使用pip安装 安装之前最好把pip升级到最新版 python m pip install upgrade pip 升级pip pip install pandas 安装pan
  • myabtis-plus 代码生成器自定义模板

    mybatis plus代码生成器默认生成的controller是下面这样的 一个空的controller RestController RequestMapping sysUserRoleRelevance public class Sy
  • JavaScript中浮点数精确值问题

    js中规定安全整数的范围是 2的53次方至2的53次方 也就是 9007199254740992 9007199254740992 在JavaScript中0 1 0 2不等于0 3的问题 0 1 0 2 0 300000000000000
  • 深度学习系统为什么容易受到对抗样本的欺骗?

    转自 https zhuanlan zhihu com p 89665397 本文作者 kurffzhou 腾讯 TEG 安全工程师 最近 Nature发表了一篇关于深度学习系统被欺骗的新闻文章 该文指出了对抗样本存在的广泛性和深度学习的脆
  • LeetCode 7. 整数反转(C语言)

    Description 给出一个 32 位的有符号整数 你需要将这个整数中每位上的数字进行反转 示例 1 输入 123 输出 321 示例 2 输入 123 输出 321 示例 3 输入 120 输出 21 注意 假设我们的环境只能存储得下
  • 【01规划】POJ 3621 Sightseeing Cows

    POJ 3621 Sightseeing Cows 题意 给定一张 n 个点 m 条边的有向图 每个点都有一个权值 f i 每条边都有一个权值 t i 求图中的一个环 使 环上各点的权值之和 除以 环上各边的权值之和 最大 输出这个最大值
  • MVC 实现登录功能

    1 表单 2 数据层 3 逻辑层 4 servlet分发控制器
  • 高校巡讲总结—侯伯薇讲师

    这个月里面 借助CSDN的平台 在三所高校中做了 程序员修炼之路 的巡讲 在其中讲述了自己的一些经历 并和同学们聊了学习 思考和分享这三个要素 三所高校各自有各自的特点 感觉很有意思 一一叙述如下 首先 第一站是在辽宁工程技术大学 位于葫芦
  • 总结Windows下安装WSL与升级WSL2的方法

    目录 1 安装WSL1的方法 2 安装WSL2的方法 3 升级WSL1到WSL2的方法 1 打开win10的设置 搜索windows功能 打开启用或者关闭Windows功能 2 勾选以下2个地方 并重启 3 下载WSL2升级包 并点击安装
  • JS原型

    原型的概念 实例对象中 proto 是原型 是一个属性也是一个对象 是给浏览器使用的 是不标准的 这个叫隐式原型 构造函数中的prototype是原型 是一个属性也是一个对象 是给程序员用的 是标准的 proto 原型是浏览器使用的 有些浏
  • JDBC-数据库连接字符串

    SQLSERVER Connection conn DriverManager getConnection jdbc sqlserver localhost 1433 sa Oracle Connection conn DriverMana
  • 什么是rem单位和em单位?它们有什么区别?

    聚沙成塔 每天进步一点点 专栏简介 rem 和 em 单位 rem 单位 Root Em em 单位 区别总结 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到
  • vue使用echarts与echarts-gl实现3d地图与 3d柱状图

    目录 前言 一 下载echarts与echarts gl 二 vue引入与页面使用 1 引入 2 页面引入echarts gl 三 下载地图数据 四 使用地图 1 html初始化地图放入位置 2 data创建变量 3 创建地图 4 钩子函数
  • remote: Support for password authentication was removed on August 13, 2021

    1 github在2021年8月13日这天搞事情 如果这天你提交了github代码报错如下 remote Support for password authentication was removed on August 13 2021 P
  • 第3章 分布式文件系统HDFS

    3 1 分布式文件系统 3 1 1 计算机集群结构 3 1 2 分布式文件系统的结构 两类节点 1 主节点 Master Node 或称为 名称节点 NameNode 负责文件和目录的创建 删除和重命名等 同时管理着数据节点和文件块的映射关
  • python噪声

    1 skimage的API noise gs img util random noise img mode gaussian gaussian 高斯加性噪声 noise salt img util random noise img mode
  • 粒子群算法(PSO)优化RBF神经网络实践

    算法原理及流程 关于RBF神经网络的细节详见 RBF神经网络学习及实践 关于PSO算法的细节详见 粒子群优化算法 PSO python实践 PSO算法优化RBF神经网络训练流程图如下所示 代码实现 代码直接使用文章RBF神经网络学习及实践和
  • 23+ Useful HTML5 Open Source Online Video Players & Libraries,

    Akamai s Open Video Player for HTML5
  • blender基本操作

    文章目录 引言 一 选择 二 移动 1 xyz轴移动 2 xyz平面移动 3 精确移动 4 快捷键移动G 三 旋转 四 缩放 五 变换 1 变换坐标系 2 变换轴心 六 吸附 七 模式切换 八 物体的合并和分离 1 合并 2 分离 九 设置
  • 51单片机一个按键,通过单击,双击,三击,长按实现四种不同的led特效并且每次切换模式伴随不同的音效。(连击4下为无效指令)

    一个定时器负责扫描按键按下的时间长短 一个定时器负责实现具体的led特效功能 主函数循环扫描按键 避免了占用cpu资源过多 导致程序堵塞 无法扫描到按键等问题 还可以通过定时器来扫描按键按下 时长等 想要实现的程序放在主函数中执行 新人第一