51单片机完全学习——红外遥控

一、红外接收模块原理

红外接收头内部本身有一个反相,意思就是:平时发送方无信号时接收到的是1,发送方有发送载波时接收头引脚输出的是0,写代码的时候注意这一点。红外协议,你也可以理解成,他对0和1重新做了一些定义:560微秒的高电平加上1.69毫秒定义为逻辑1,560微秒的高电平加上560微秒的低电平定义为逻辑0。需要注意的是这里有一个反相,写代码一定要注意。简单点就是上面说的低电平其实是高电平,高电平其实是低电平。也就是下面的黑色部分其实是低电平,没有黑色的部分是高电平。

二、红外解码实现

首先我们这里的红外解码,针对的是NEC协议进行,其他协议类似处理即可。我们解码只需要根据他发送的时序进行接受就可以了,我们先上程序,然后在对程序里面需要注意的一些问题做进一步解释。我这里红外解码的处理程序全部放到了,中断里面进行处理,由于红外解码时间较长,只要一进入中断至少需要50毫秒,才能出去,如果主程序有一些对刷新率要求很高的事情在里面,使用这个中断函数就会导致,主程序的模块产生一些问题。如果不想出现这个问题,就需要使用定时器延时的方法来进行处理。对于定时器这种方法我们之后在讨论。关于程序里面的一些注意事项,大家看后面的注释就可以啦。

void ir_int0(void) interrupt 2  //我们这里使用外部中断1
{
	uchar i = 0, dat[4] = 0, k = 0, j = 0;
	if (IR_PORT == 0)       //判断确实是来了红外数据
	{
		delay8ms();         //将前面9毫秒的低电平先过去一段时间
		if (IR_PORT == 0)   //在进行确认确实是来了红外起始信号
		{
			
			delay4ms();     //将4.5毫秒的高电平过去一段时间
			if (IR_PORT == 1)//在进行判断确实是其实信号里面高电平那一段来了
			{
		        while (IR_PORT == 1); //使用while循环将其实信号里面剩余的高电平给消耗掉
				for (j=0; j<4; j++)   //由于总共有4个字节的数据
				{
					for (i=0; i<8; i++) //每个字节有8位,从LSB->MSB依次接收
					{
						k = 0;          //每次开始必须将k清零,k保存的是上一次传输的数据
						while (IR_PORT == 0); //使用while循环将0或1开始的560微秒给消耗掉
                        //由于0和1剩余的高电平信号的长短不一致,我们并不能知道来的是0还是1
                        //因此我们首先需要记录来的高电平持续的时间长短
                        //然后根据时间长短在进行判断是0还是1
						while (IR_PORT == 1)  //使用while将来的高电平消耗一下
						{
							delay10us();      //这里的每隔10微秒做一次计数
							k++;              //根据k的大小我们就可以判断是0还是1
						}
						if (k <= 60) //由于逻辑0的高电平只有560微妙,因此只要少于60的传过来就是0
						{
							k = 0;
						}
						else                  //否则传输过来的就是1
						{
							k = 1;
						}					
						dat[j] = ((dat[j] >> 1) | (k << 7)); //将接收到的数据保存在数组里面	
						
					}
				}
				
				if ((dat[0] == 0x00) && (dat[1] == 0xff))  //对数据做进一步的校验
				{
					uart_send_byte(dat[2]);  //将正确的键值通过串口进行打印
				    uart_send_byte(dat[3]);	
				}
				
			}
		}
	}
	
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue学习笔记(五)

Class绑定 数据绑定的一个常见需求场景式操纵元素的CSS class列表&#xff0c;因为class是attribute,我们可以和其他attribute一样使用v-bind将它们和动态的字符串绑定。但是&#xff0c;在处理比较复杂的绑定时&#xff0c;通过拼接生成字符串是麻烦且易出错的。因此&#xf…

【认知智能】编译器1

深度学习编译器是一种专门设计用来优化和加速深度学习模型在各种硬件平台上执行的工具。它们通过将高级深度学习框架&#xff08;如TensorFlow, PyTorch等&#xff09;中的计算图转换为针对特定硬件架构优化过的低级代码来实现这一目标。基础架构通常包括以下几个关键组件&…

C语言基础题(大合集2)

1. 时间转换 给定秒数 --> 输出秒数 转化成 时/分/秒 //时间转换 //给定秒数 --> 转换成 小时/分/秒 int main() {//输入int seconds 0;int h 0;//小时int m 0;//分钟int s 0;//秒scanf("%d", &seconds);//计算h seconds / 60 / 60;m seconds / 60…

ctfshow(171,172,173)--SQL注入--联合注入

Web171 进入靶场&#xff0c;是一个SQL查询界面&#xff1a; 审计&#xff1a; 查询语句如下&#xff1a; $sql "select username,password from user where username !flag and id ".$_GET[id]." limit 1;";语句功能从数据表user中查询username,pa…

Continue语句应用举例

在main.cpp里输入程序如下 #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(), //setprecision(),setiosflags()和resetiosflags(); using namespace std; //告诉编译器使用std标准程序库; int main() { i…

【AIGC】从CoT到BoT:AGI推理能力提升24%的技术变革如何驱动ChatGPT未来发展

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;迈向AGI的新跨越&#x1f4af;BoT与CoT的技术对比技术原理差异推理性能提升应用范围和通用性从错误中学习的能力总结 &#x1f4af;BoT的工作流程和机制初始化过程生成推…

在微信里怎么创建秒杀活动

在这个快节奏的时代&#xff0c;每个人都渴望以最优惠的价格购买到心仪的商品。为了满足广大消费者的这一需求&#xff0c;我们特别在微信平台推出了限时秒杀活动&#xff0c;让你在指尖轻松享受购物的乐趣与实惠。 工具/原料 微信小程序 飞多多网站 方法/步骤 一、秒杀活动…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25 0. 前言 大语言模型在很多领域都有成功的应用&#xff0c;在本期计算机前沿技术进展研究介绍中&#xff0c;我们将带来一篇用大语言模型进行诺贝尔文学作品分析的论文。虽然有一定趁最近诺贝尔奖热潮的意味&…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像&#xff0c;报以下错误&#xff1a; 解决办法&#xff1a; Docker Engine配置能访问的镜像地址&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…

ARM学习(34) GDB 调试器详细了解

笔者来聊一下对于GDB的一些操作使用认识。 1、GDB的使用以及用途 GDB是GNU的一个项目&#xff0c;具体网站如下&#xff0c;网址&#xff1a;https://www.gnu.org/software/gdb/ 支持多种语言&#xff0c;常用的就是C/C/Python等等跨平台使用&#xff0c;Linux/windows/MacOS…

电机---3直流有刷减速电机

前言 在简单了解电机分类后&#xff0c;为了能够更深入学习了解电机、编码器、PID算法等内容&#xff0c;选择使用野火的直流减速有刷电机和其驱动板进行学习&#xff0c;单片机开发板选择野火的指南者开发板。 1直流有刷减速电机 直流有刷电机转速快&#xff0c;扭矩小&…

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…

【Android】ViewPager与ViewPager2之间的区别

ViewPager 和 ViewPager2 都是 Android 中用于实现滑动页面切换的控件&#xff0c;但 ViewPager2 是对 ViewPager 的改进和增强版本。 区别 实现方式 ViewPager 继承自 ViewGroup&#xff0c;内部并未使用已有的成熟控件&#xff0c;更多的是自定义的操作。ViewPager2 也继承…

【verilog】模十计数器

文章目录 前言代码 前言 进行 FPGA 模十计数器 实验 仿真结果 代码 主代码 // module module count(clk,rst_n,count,clk1,led);// def io input clk; input rst_n; output reg [3:0] count; output reg clk1; output reg [7:0] led;// always part, or main() always (pos…

【吐槽】豪斯医生之二:第 4-6 集

写在前面 5841 字 | 医学 | 吐槽 | 电视剧 正文 维基百科&#xff1a;   利巴韦林&#xff08;英语&#xff1a;Ribavirin&#xff0c;俗称病毒唑&#xff09;&#xff0c;是一种抗病毒药&#xff0c;属合成核苷类药&#xff0c;1970 年由 ICN 制药公司 Joseph T. Witkowsk…

景区导航地图怎么实现?基于LBS与3D GIS的智慧景区导航导览系统技术路线

随着经济的发展和人们物质生活水平改善,居民的旅游需求呈现多元化和个性化&#xff0c;自助旅游的人越来越多。许多游客在旅游行程中需要随时随地了解旅游景点有关的各类信息&#xff0c;如旅游景点介绍、推荐路线、地图导航等&#xff0c;合理规划和安排旅游线路。正是为了应对…

Docker | images镜像的常用命令总结

命令总结 1. 帮助启动类命令基本命令systemctl status dockerdocker infodocker --help 2. 镜像命令docker images删除镜像出现错误 docker searchdocker pull xxx[:TAG]docker images -adocker images -qdocker system dfdocker rmi -f xxxxxdocker rmi -f $(docker images -q…

Python量子生成对抗网络QGAN神经网络药物发现、多方法乳腺癌药物筛选应用

全文链接&#xff1a;https://tecdat.cn/?p37975 分析师&#xff1a;Chenhao Wu 在当今的医学领域&#xff0c;乳腺癌作为一种严重威胁女性健康的疾病&#xff0c;其治疗一直是科研工作者们关注的焦点。乳腺癌的发展与雌激素受体密切相关&#xff0c;其中 ERα 被视为治疗乳腺…

还愁布线呢?那是你没看过这篇

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 综合布线作为网工工作中的基础部分&#xff0c;其设计和实施的质量直接影响到整个系统的稳定性和可靠性。对于咱…