江协科技51单片机学习- p37 红外遥控(外部中断)

news2024/10/1 12:27:59

   🚀write in front🚀  
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 

💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚 

🚀Projeet source code🚀   

💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan) - Gitee.com

前言:

本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。

引用:

51单片机学习笔记-15 红外遥控_定时器发送红外信号-CSDN博客

单片机学习笔记---红外遥控&红外遥控电机调速(完结篇)_红外遥控红外遥控电机调速完结篇-CSDN博客

如何学习单片机——从51过渡到STM32_现在学单片机学哪个-CSDN博客

正文:

0. 🌿概述

在淘宝上购买了江协科技51单片机开发板套件(普中科技STC51单片机A2型号),就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程,通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。

术语和缩略语

缩写全称说明
ADAnalog to Data模拟到数字,将模拟信号转换为计算机可操作的数字信号

1. 🚀 红外遥控协议介绍

1.1 红外遥控器
红外遥控是利用红外光进行通信的设备,由 红外LED 将调制后的信号发出,由专用的红外接收头进行解调输出。

  • 通信方式:单工,异步
  • 红外LED波长:940nm(还有一种850nm的可以微微看见红光)
  • 通信协议标准:NEC标准

对于红外发射电路来说,要发送的信号应该调制在一定的载频上,才能使得红外接收模块从自然界中识别出遥控器所发出的信号。要实现这个目的,本质上可以采用方式一进行硬件调制,此时输出的红外LED在IN输出高电平时不导通,而在IN输出低电平时,以38kHz的频率闪烁,从而有区别于自然光(如太阳光中的红外光)。软件调制则是提前将IN调制好再进行发送。
而红外接收时,则要完成一系列负载的解调、滤波工作,这些器件集成在红外接收头中,无需关心。最后输出的信号OUT与原来发送的信号IN一致。如下图所示:

 注意若没有接收到信号,接收端默认输出高电平;接收到信号才输出低电平。行业内默认空闲信号高电平。

  • 空闲状态:红外LED不亮,接收头输出高电平
  • 发送低电平:红外LED以38KHz频率闪烁发光,接收头输出低电平
  • 发送高电平:红外LED不亮,接收头输出高电平

 1.2 NEC编码协议

上面介绍了最底层的物理层,已经集成好所以不需要过多关心。对于要发送的数据来说,红外遥控器主要采用NEC编码。

可以看到上述一个完整的数据帧包括4个字节的数据(反码主要用于数据验证),并且由以下三个部分组成:

  • Start起始位:红色部分。
  • DATA数据部分:蓝色部分。低位在前,高位在后。 注意发送0/1的区别主要在于高电平持续时间,并且在这一部分已经发送完成所有的32位信息。最后一个下降沿发送完成后,持续560us拉高结束。
  • Repeat重复标志:绿色部分。如果按下按键不松手,就会重复发送该标志。最后的下降沿完成后,也是持续560us的低电平,然后拉高结束。
  •  32位的数据信息是4个字节,第一个字节是地址用来区分不同的遥控器,第二个字节是地址的反码,通过使用反码可以进行一定的校验,接收器接收到到前两个自己的地址码和地址码的反码后将其中一个地址码取反和另一个进行比较可以进行一定的校验;然后是第三个字节是数据码,然后第4个字节是数据码的反码。
  • 起始码的长度是,低电平9ms,然后是高电平4.5ms,这个时间比后面的数据码的一位的高低电平的us秒时间要长。

 上述32位数据中,后发送的16位“命令”,指的就是遥控器的键码值,如下图:

江协科技老师使用示波器抓取到的红外遥控器按键按下时,红外接收头输出的电平信号的波形,可以配合NEC红外遥控的编码使用(NEC红外遥控发送一个字节的数据时LSB优先,低位先发送)

1.3 外部中断

由于红外遥控发送信号的速度很快(几十ms),如果采用单片机像扫描按键轮询检测红外遥控信号,很可能会遗漏信号,此时就需要 外部中断 实时的采集信号。回顾之前所学,STC89C52有4个外部中断,但是单片机只引出了2个外部中断(P3.2/P3.3)。这些外部中断有两种触发方式:下降沿触发和低电平触发。根据NEC编码协议,显然需要 下降沿触发。

// 中断后,就执行下面这些中断子程序
void Int0_Routine(void)    interrupt 0 { 函数体 }
void Timer0_Routine(void) interrupt 1 { 函数体 }
void Int1_Routine(void)    interrupt 2 { 函数体 }
void Timer1_Rountine(void) interrupt 3 { 函数体 }
void UART_Routine(void)    interrupt 4 { 函数体 }
void Timer2_Routine(void)  interrupt 5 { 函数体 }
void Int2_Routine(void)    interrupt 6 { 函数体 }

  • 但是单片机只引出了2个外部中断(P3.2/P3.3)
  • 这些外部中断有两种触发方式:下降沿触发和低电平触发。根据NEC编码协议,显然需要 下降沿触发

2 🚀实验:红外遥控基本应用

需求:使用红外遥控发射信号,并将接收到的结果显示在LCD液晶屏上:

  • LCD第一行显示“ADDR COMD NUM”。
  • LCD第二行依次显示红外遥控的地址码、键码、音量按键(VOL+/VOL-)计数变量num。对于这个num,按下VOL+加1,按下VOL-则减一,要是一直按着不松手,那就快速增加/减小。

下面是初始化外部中断的一个小参考:

 

 

  • IT0:外部中断源类型选择位,IT0=0  外部中断0为低电平触发,IT0=1 外部中断0为下降沿触发。
  • IE0:外部中断源0清秀园中断标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,有硬件清零 IE0。

 

整个程序使用了状态机。注意和FPGA中的单片机不太一样的是,所有的判断过程都是在外部中断(下降沿)来临时产生的,所以系统在执行判断语句的时候,目前的波形早就过去了。简单一句话,FPGA所有的信号等着你判断完才运行,所以要注意实时性;单片机中实际信号在你判断的时候已经过去了,有错位。并且状态机是在外部中断0的中断函数中完成的,这个中断函数放在HS0038.c文件中。

红外遥控状态机

2.1 实验1-外部中断下降沿触发

实验1-外部中断下降沿触发。测试STC89C52单片机外部中断源0下降沿触发方式的实验效果。在main.c中设置如下:

  • 外部中断源0的中断触发方式为电平下降沿触发方式。
  • 因为在我们使用的开发板上外部中断源0引脚 INT0/P3.2 同时也接在独立按键 KEY3 上,所以我们可以用按下独立按键KEY3来测试外部中断0。
  • 我们在外部中断0的中断服务函数中,每次进入中断服务函数时对全局变量值Num进行加1,然后再main.c中循环打印Num的值就可以直到是否进入到了中断服务函数和进入中断服务函数的次数。

实验1源码如下:

#include <REGX52.H>
#include <INTRINS.H>
#include "delay.h"
#include "LCD1602.h"

unsigned char Num;

void main()
{
	LCD_Init();
	LCD_ShowString(1, 1, "A");
	
	
	IT0 = 1;	//外部中断源0选择下降沿触发
	EX0 = 1;	//外部中断源0,中断使能
	EA = 1;		//全局中断,中断使能
	PX0 = 1;	//外部中断源0,中断高优先级,可以中断别的低优先级的中断
	
	
	while(1)
	{
		LCD_ShowNum(2, 1, Num, 3);
	}
}

//外部中断源0的中断服务函数
void Int0_Routien(void) interrupt 0
{
	Num++;
}

实验1实验结果:

  • 每次按下独立按键KEY3(P3.2引脚)时产生一次电平下降沿,触发一次外部中断源0,进入外部中断0中断服务函数 Num的值增加1,按3次独立按键KEY3,Num的值增加到3。
  • 因为IT0=1选择外部中断源0的中断触发方式为下降沿触发,所以按着独立按键KEY3不松手时(一直为低电平)并不会触发外部中断源0。

2.2 实验2-外部中断低电平触发

实验2-外部中断低电平触发。测试STC89C52单片机外部中断源0低电平触发方式的实验效果。在main.c中设置如下:

  • 外部中断源0的中断触发方式为低电平触发方式。
  • 因为在我们使用的开发板上外部中断源0引脚 INT0/P3.2 同时也接在独立按键 KEY3 上,所以我们可以用按下独立按键KEY3来测试外部中断0。
  • 我们在外部中断0的中断服务函数中,每次进入中断服务函数时对全局变量值Num进行加1,然后再main.c中循环打印Num的值就可以直到是否进入到了中断服务函数和进入中断服务函数的次数。

实验2源码如下:

#include <REGX52.H>
#include <INTRINS.H>
#include "delay.h"
#include "LCD1602.h"

unsigned char Num;

void main()
{
	LCD_Init();
	LCD_ShowString(1, 1, "A");
	
	
	IT0 = 0;	//外部中断源0, IT0=0选择低电平触发中断方式
	IE0 = 0;
	EX0 = 1;	//外部中断源0,中断使能
	EA = 1;		//全局中断,中断使能
	PX0 = 1;	//外部中断源0,中断高优先级,可以中断别的低优先级的中断
	
	
	while(1)
	{
		LCD_ShowNum(2, 1, Num, 3);
	}
}

//外部中断源0的中断服务函数
void Int0_Routien(void) interrupt 0
{
	Num++;
}

实验2实验结果:

  • 因为IT0=1选择外部中断源0的中断触发方式为低电平触发,所以按着独立按键KEY3不松手时(一直为低电平)会一直触发外部中断源0的中断,并进入外部中断0的中断服务函数 Num的值不断增长。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提供三方API接口、调用第三方接口API接口、模拟API接口(三)使用AOP切面编程实现signature签名验证

接着第一篇文章 提供三方API接口、调用第三方接口API接口、模拟API接口&#xff08;一&#xff09;通过signature签名验证&#xff0c;避免参数恶意修改 我们来继续优化&#xff1a; /*** 模拟后端校验签名* param request* param data* return* throws UnsupportedEncodingEx…

[环境配置]C4D OC渲染器解决缺少cudnn_8_0_4Octance正版缺少cudnn_8_0_4_win文件解决方法

关于Octance正版缺少cudnn_8_0_4_win文件解决方法 可在此处https://download.csdn.net/download/FL1623863129/89605383进行下载 放到对应文件位置即可 在计算机图形学领域&#xff0c;Cinema 4D&#xff08;C4D&#xff09;作为一款顶尖的专业3D建模、动画与渲染软件&#x…

学生管理系统之数据模拟与数据显示

学生管理系统之数据模拟与数据显示 设计一个单例 模拟数据 显示数据

CSP-J 2022 填程题19.解析

19. &#xff08;枚举因数&#xff09;从小到大打印正整数 n 的所有正因数。 试补全枚举程序。 01 #include <bits/stdc.h> 02 using namespace std; 03 04 int main() { 05 int n; 06 cin >> n; 07 08 vector<int> fac; 09 fac.reserve((int)ce…

【算法】动态规划---多态dp问题

多态dp问题 一.[leetcode] (打家劫舍I) 17.16.按摩师二. [leetcode] 213. 打家劫舍 II三.[leetcode] 740. 删除并获得点数四.[leetcode] LCR 091. 粉刷房子五.[leetcode] 309. 买卖股票的最佳时机含冷冻期六.[leetcode] 714. 买卖股票的最佳时机含手续费七.[leetcode] 123. 买卖…

职场,要想逆袭,必须要“装”

普通人&#xff0c;没有家庭背景&#xff0c;没有社会资源&#xff0c;没有好学历&#xff0c;如何才能逆袭呢&#xff1f;有朝一日自己熬出头&#xff0c;又如何避免被别人针对呢&#xff1f; 最重要的就是要会“装”。 在社会上&#xff0c;只有资源多的人才能更好的生存&a…

opencv c++ python等比缩小或放大显示图片代码

c代码&#xff0c;其中scale_percent用来设置百分比&#xff0c;例如50 就是百分之五十&#xff0c;也就是一半的大小&#xff0c;当然也可以设置成200&#xff0c;相当于原来的2倍大小&#xff0c;注意图片路径换成实际路径。 #include <opencv2/opencv.hpp>int main()…

【Java零基础视频教程】综合练习题(一)——基础练习

文章目录 基础练习飞机票打印素数生成验证码复制数组评委打分数字加密抽奖双色球 基础练习 飞机票 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&…

pxe安装部署

RHEL7为例&#xff1a; ifconfig查看ip 一.环境配置 1.配置软件仓库&#xff1a; mkdir /rhel7 mount /dev/cdrom /rhel7 echo mount /dev/cdrom /rhel74 >> /etc/rc.d/rc,local chmod x /etc/rc.d/rc.local 2.关闭火墙和selinux&#xff0c;下载…

【极速前进】20240706-24240714:用于Agent的树搜、理解LLM的语种困惑、事实知识抽取微调、Quiet-STaR

相关博客 【极速前进】20240706-24240714&#xff1a;用于Agent的树搜、理解LLM的语种困惑、事实知识抽取微调、Quiet-STaR 【极速前进】20240615-20240623&#xff1a;Zipper融合模态、VideoLLM视频理解、WebAgent可以自我改善、Nemotron-4、AnyGPT统一模态 【极速前进】20240…

Final Shell for Mac 虚拟机连接工具【简单易操作,轻松上手】【开发所需连接工具】

Mac分享吧 文章目录 效果一、下载软件二、安装软件三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 链接&#xff1a;http://www.macfxb.cn 二、安装软件 三、运行测试 安装完成&#xff01;&#xff01;&#xff01;

Kubernets(k8s) 网络原理三:同主机内Pod相互访问

前两篇文章中我们介绍了pod怎么和宿主机通信以及pod怎么访问外网&#xff0c;这两种通信是理解pod间通信的基础。 关于pod间的相互访问&#xff0c;这里还需要细化一下。回想一下pod在k8s节点中的分布&#xff0c;两个pod可能分布在同一台宿主机上&#xff0c;也可能分布在不同…

可视化图表与页面源代码显示

可视化图表与页面源代码显示 页面效果&#xff1a; <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>饼状图</title><style>body {display: flex;height:…

基于51单片机的交通信号灯proteus仿真设计

1.功能简介 交通信号灯是一种经典应用电路&#xff0c;本设计基于51单片机&#xff0c;利用Proteus仿真软件构建了一个模拟交通信号灯系统。该系统能够模拟真实交通环境中的信号变化&#xff0c;包括红灯、黄灯和绿灯的切换&#xff0c;以及倒计时显示等功能&#xff0c;各种灯…

谷歌出品,一款免费的智能绘图工具

AutoDraw是由Google开发的一款基于网络的智能绘图工具&#xff0c;旨在通过人工智能技术帮助用户快速、简便地创建图画和图表。该工具于2017年4月11日由谷歌创意实验室推出&#xff0c;并迅速获得了广泛关注。 AutoDraw的核心功能是利用机器学习算法识别用户的草图或涂鸦&…

C++STL专题-string类

目录 1.标准库中的string类 1.1 string类 2.2 auto和范围for 2.2.1 auto关键字 2.2.2 范围for 2.3 string类的常用接口讲解 1.string类对象的常见构造 2.元素访问 3.迭代器(iterator) 3.1 begin 和 end 3.2 rbegin 和 rend 4.容器 5.修改 5.1 append 5.2 assign…

在C#中为图片添加数字水印的几种办法

最近在写个人项目时&#xff0c;有遇到需要将图片加上水印防止被盗取的需求。这里找了几种实现方式&#xff0c;可供有需要的朋友参考。 本身我不是搞算法这块的&#xff0c;所以这里只是找了一些实现&#xff0c;也没有继续深究下去。 以前在学校的时候从书上了解过可以将一…

cmake常用命令学习

1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件&#xff0c;而.cmake文件是一个模块文件&#xff0c;可以被include到CMakeLists.txt中。 include指令一般用于语句的复用&#xff0c;也就是说&#xff0c;如果有…

OBS Studio:如何打造专业级的视频直播体验

1.简介 OBS&#xff08;Open Broadcaster Software&#xff09;是一款开源的视频录制和直播软件&#xff0c;广泛用于视频制作、游戏直播和网络直播。它支持多种操作系统&#xff0c;包括Windows、macOS和Linux。OBS提供了丰富的功能&#xff0c;包括但不限于&#xff1a; **…

聊聊跨境电商平台与固定IP的那些事

IP地址网络地址&#xff08;网络号&#xff09;主机地址&#xff08;地址号&#xff09;&#xff0c;IP地址是一台电脑在网络中的唯一标识&#xff0c;可分为固定IP与动态IP。那么IP地址的分类有哪些&#xff1f;什么IP适合亚马逊/eBay/速卖通等平台运营时使用&#xff1f; A类…