STM32学习笔记之—红外通信

STM32学习笔记之—红外通信132

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

##


概述

首先大家不要觉得红外通信很难,知道原理的话其实也就那么回事儿,而本文讲解的重点不是原理性的内容(原理性的这类比较底层的知识往往比较复杂,交个那些大佬慢慢研究吧),本文主要是教大家如何使用红外通信,希望大家看了本教程之后能够进行简单的红外通信,做做简单的DIY。_


##


简单的原理

红外通信是一线式通信,也就是只需要一根线就能够通讯,GND接地,VDD接电源,最后一个根接芯片的IO口。具体的使用接线过程图如下图所示:

STM32学习笔记之—红外通信

####你需要知道的是:

  • 红外信息是由不同的红外高低电平脉冲组合而成的

  • 当红外接收头捕获到红外信号后,通讯线会表现为不同的高低电平

  • 芯片的一个IO管脚连接到这根通讯线,通过查询的方式读出这根线上面的高低电平信息

  • 芯片按照根据统一的通讯协议将接收到的高低信号转化为键值(一串数字)

  • 不同的信号具有不同的键值,根据不同的键值就能够区分不同的红外信息

(这只是简单的工作原理,不懂也没关系,不影响后面的编程)


##


程序讲解

程序知道原理之后是比较容易理解的,我将从三个部分讲解主要的代码

###配置阶段
代码

void hwjs_init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	/* 开启GPIO时钟及管脚复用时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;											//---红外接收配置的管脚为PA15这个管脚,具体可以根据自己需要进行配置
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	/* 设置外部中断的模式 */ 
	EXTI_ClearITPendingBit(EXTI_Line15);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);	//选择GPIO管脚用作外部中断线路
	EXTI_InitStructure.EXTI_Line=EXTI_Line15;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure); 
	/* 设置NVIC参数 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//打开EXTI15的全局中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级为0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;				//响应优先级为1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;						//使能
	NVIC_Init(&NVIC_InitStructure);
}

Jetbrains全家桶1年46,售后保障稳定

代码说明

以上是配置过程的代码部分,将A15配置为输入模式,同时打开中断
配置好后中断函数为EXTI15_10_IRQHandler()


###中断函数

代码

void EXTI15_10_IRQHandler(void)	  //红外遥控外部中断
{
	u8 Tim=0,Ok=0,Data,Num=0;
   while(1)
   {
	  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==1)
		{
			 Tim=HW_jssj();//获得此次高电平时间
			 if(Tim>=250) break;//不是有用的信号
			 if(Tim>=200 && Tim<250)
			 {
				 Ok=1;//收到起始信号
			 }
			 else if(Tim>=60 && Tim<90)
			 {
				 Data=1;//收到数据 1
			 }
			 else if(Tim>=10 && Tim<50)
			 {
				 Data=0;//收到数据 0
			 }
			 if(Ok==1)
			 {
					hw_jsm<<=1;
					hw_jsm+=Data;

				if(Num>=32)
				{
					hw_jsbz=1;
				  break;
				}
			 }
			 Num++;
		}
   }
   EXTI_ClearITPendingBit(EXTI_Line15);	
}

代码说明

  • HW_jssj()为获得高电平持续时间的函数(具体代码见附录)
  • 当收到信号后,通过不停地查询判断将接收到的信号解析到”hw_jsm”里面同时将标志位”hw_jsbz”置”1″
  • hw_jsbz”置”1″表示成功解析到一个完整地红外信号

###主函数

代码

int main()
{	
  hwjs_init();										//红外接口初始化
	while(1)
	{
		if(hw_jsbz==1)								//如果红外接收到数据了
		{
			if(hw_jsm==0x00FFA25D)			//---当接收到0x00FFA25D这个键值的红外信号时
			{
				/*程序1*/	
			}
			else if(hw_jsm==0x00FF30CF)	//---当接收到0x00FF30CF这个键值的红外信号时
			{
				/*程序2*/
			}	
			hw_jsbz=0;									//清零
			hw_jsm=0;										//接收码清零(存放红外编码数据的地方)
		}			
	}			
}

代码说明

  • 进行初始化操作
  • 当接收到红外信号后就判断红外信号的键值。
  • 根据键值选择去执行哪一段程序。
  • 执行完之后就继续等待。

##


你可能会遇到的问题以及建议解决方法

附录的程序不能够运行?

本程序是Keil4的代码,检查Keil是否激活成功教程,路径是否含有中文字符等。

代码不能够下载到芯片里面?

本程序使用的芯片是STM32F103C8T6,打开配置串口(“Option for Target’Target1’“或者按快捷键”Alt+F7”)
选择正确的芯片类型
选择正确的烧录工具
选正确的Flash的大小
检查烧录的连线以及供电(一般不会出现这个问题)


如果大家还有什么疑问或者我讲的有什么不对的地方欢迎在评论区留言,一起交流讨论_

附录:

源代码链接:https://pan.baidu.com/s/1jwkEQHB1-QH2mOf3xwYj4A 密码:yh0n

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219970.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IntelliJ IDEA 2021.1 x64激活码破解方法

    IntelliJ IDEA 2021.1 x64激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    246
  • 执行pip 命令出现Could not install packages due to an EnvironmentError错误的解决办法「建议收藏」

    执行pip 命令出现Could not install packages due to an EnvironmentError错误的解决办法「建议收藏」今天想安装一个pyspider,但是却出现了下图的错误因为环境的错误导致的原因,嗯…….搜了一下,只需把命令改为pipinstall–userpyspider就可以了。网上的回答是直接这样就行了,但是我的却出现了另一个问题。这个包是安装成功了,但是调用时输入pyspiderall,却返回了pyspider不是内部或外部命令的提示,注意看安装成功之前有几行…

    2022年9月13日
    2
  • dns欺骗编辑html,charles DNS欺骗

    dns欺骗编辑html,charles DNS欺骗DNS欺骗/DNSSpoofing功能:通过将您自己的主机名指定给远程地址映射来欺骗DNS查找一般的开发流程中,在上线之前都需要在测试环境中先行进行验证,而此时手机客户端请求的域名是不太容易改变的,可以通过设置dns方式把域名转发到测试机上,具体设置Tools->DNSSpoofingSettings比如要把所有包含xxxxxx.com的域名转到10.0.0.71的服务器上,其实用修改…

    2025年5月27日
    4
  • 如何搭建谷歌离线地图服务[通俗易懂]

    如何搭建谷歌离线地图服务[通俗易懂]如何发布google离线地图及二次开发API发布时间:2018-01-17版权:相关教程:一键离线地图发布(工具下载)使用教程谷歌离线地图API接口文档及接口调用实例1.说明离线地图开发环境支持谷歌地图、百度地图、高德地图等等所有常用地图类型,支持在局域网内的地图部署、二次开发。2.实现第一步:下载安装离线地图开发环境BIEGMAP离线地图服务器…

    2022年9月16日
    2
  • 简单人脸识别一之使用opencv+cnn网络实现人脸识别

    简单人脸识别一之使用opencv+cnn网络实现人脸识别最近在研究目标检测这个方向,看到网上有很多的人脸识别帖子,所以也想着上上手看看。当时是做了三个模型出来,第一个就是网上很通用普遍的opencv+简单三层cnn网络来实现的,说实话效果真的一般吧!具体的下面再细细陈述。第二个是把三层cnn网络换成了残差网络。因为自己刚好也是学习了残差网络。就想着生搬硬套过来,但效果说实话很迷,时好时坏,把我是整蒙逼了,后面也会提的。最后一个是用opencv+MTCN…

    2022年5月11日
    46
  • 80c51单片机简介_80c51单片机内部结构的组成

    80c51单片机简介_80c51单片机内部结构的组成80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点。增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布

    2022年8月4日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号