单片机学习(18)--红外遥控器

news2024/9/22 15:31:02

红外遥控器

  • 17.1红外遥控的基础知识
    • 1.红外遥控简介
    • 2.硬件电路
    • 3.基本发送和接收
    • 4.NEC编码
    • 5.遥控器键码
    • 6.51单片机的外部中断
    • 7.外部中断寄存器
  • 17.2红外遥控的程序代码
    • 1.红外遥控
      • (1)工程目录
      • (2)main.c函数
      • (3)Int0.c函数
      • (4)Timer0.c函数
      • (5)IR.c函数
      • (6)IR.h函数
    • 2.遥控电机调速
      • (1)工程目录
      • (2)main.c函数
      • (3)Timer1.c函数
      • (4)Motor.c函数

17.1红外遥控的基础知识

1.红外遥控简介

红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出
通信方式:单工,异步
红外LED波长:940nm
通信协议标准:NEC标准

2.硬件电路

在这里插入图片描述

3.基本发送和接收

空闲状态:红外LED不亮,接收头输出高电平
发送低电平:红外LED以38KHz频率闪烁发光,接收头输出低电平
发送高电平:红外LED不亮,接收头输出高电平
在这里插入图片描述

4.NEC编码

在这里插入图片描述

5.遥控器键码

在这里插入图片描述

6.51单片机的外部中断

在这里插入图片描述

7.外部中断寄存器

在这里插入图片描述

17.2红外遥控的程序代码

1.红外遥控

(1)工程目录

在这里插入图片描述

(2)main.c函数

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"

unsigned char Num;
unsigned char Address;
unsigned char Command;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"ADDR CMD NUM");
	LCD_ShowString(2,1,"00   00  000");

	IR_Init();
	
	while(1)
	{
		if(IR_GetDataFlag()||IR_GetRepeatFlag())
		{
			
			Address=IR_GetAddress();
			Command=IR_GetCommand();
			
			LCD_ShowHexNum(2,1,Address,2);
			LCD_ShowHexNum(2,7,Command,2);
			
			if(Command==IR_VOL_MINUS)
			{
				Num--;
			}
			if(Command==IR_VOL_ADD)
			{
				Num++;
			}
			LCD_ShowNum(2,12,Num,3);
			
		}
	}
}

(3)Int0.c函数

#include <REGX52.H>

void Int0_Init(void)
{
	IT0=1;
	IE0=0;
	EX0=1;
	EA=1;
	PX0=1;
}

//void Int0_Routine(void)  interrupt 0
//{

//}

(4)Timer0.c函数

#include <REGX52.H>

void Timer0_Init(void)		
{
			
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0;				//设置定时初始值
	TH0 = 0;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 0;				//定时器0不计时
}

void Timer0_SetCounter(unsigned int Value)
{
	TH0=Value/256;
	TL0=Value%256;
}

unsigned int Timer0_GetCounter(void)
{
	return (TH0<<8)|TL0;
}

void Timer0_Run(unsigned char Flag)
{
	TR0=Flag;
}

(5)IR.c函数

#include <REGX52.H>

void Timer0_Init(void)		
{
			
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0;				//设置定时初始值
	TH0 = 0;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 0;				//定时器0不计时
}

void Timer0_SetCounter(unsigned int Value)
{
	TH0=Value/256;
	TL0=Value%256;
}

unsigned int Timer0_GetCounter(void)
{
	return (TH0<<8)|TL0;
}

void Timer0_Run(unsigned char Flag)
{
	TR0=Flag;
}

(6)IR.h函数

#ifndef __IR_H_
#define __IR_H_

#define IR_POWER 		0x45
#define IR_MODE  		0x46
#define IR_MUTE  		0x47
#define IR_START_STOP 	0x44
#define IR_PREVIOUS 	0x40
#define IR_NEXT 		0x43
#define IR_EQ 			0x07
#define IR_VOL_MINUS 	0x15
#define IR_VOL_ADD 		0x09
#define IR_O 			0x16
#define IR_RPT 			0x19
#define IR_USD 			0x0D
#define IR_1 			0x0C
#define IR_2 			0x18
#define IR_3 			0x5E
#define IR_4 			0x08
#define IR_5 			0x1C
#define IR_6 			0x5A
#define IR_7 			0x42
#define IR_8 			0x52
#define IR_9 		 	0x4A

void IR_Init(void);
unsigned char IR_GetDataFlag(void);
unsigned char IR_GetRepeatFlag(void);
unsigned char IR_GetAddress(void);
unsigned char IR_GetCommand(void);

#endif

2.遥控电机调速

(1)工程目录

在这里插入图片描述

(2)main.c函数

#include <REGX52.H>
#include "Key.h"
#include "Delay.h"
#include "Nixie.h"
#include "Motor.h"
#include "IR.h"

unsigned char Command,Speed;
void main()
{
	
	
	Motor_Init();
	IR_Init();
	while(1)
	{
		
		if(IR_GetDataFlag())
		{
			Command=IR_GetDataFlag();
			if(Command==IR_0){Speed=0;}
			if(Command==IR_1){Speed=1;}
			if(Command==IR_2){Speed=2;}
			if(Command==IR_3){Speed=3;}
			
			if(Speed==0){Motor_SetSpeed(0);}
			if(Speed==1){Motor_SetSpeed(50);}
			if(Speed==2){Motor_SetSpeed(75);}
			if(Speed==3){Motor_SetSpeed(100);}
		
		}
		Nixie(1,Speed);
	}
}

(3)Timer1.c函数

#include <REGX52.H>
/**
  * @brief  定时器0工作模式一的寄存器设置
  * @param  无
  * @retval 无
  */
void Timer1_Init(void)		
{
			
	TMOD &= 0x0F;			//设置定时器模式
	TMOD |= 0x10;			//设置定时器模式
	TL1 = 0xA4;				//设置定时初始值
	TH1 = 0xFF;				//设置定时初始值
	TF1 = 0;				//清除TF0标志
	TR1 = 1;				//定时器0开始计时
	EA=1;
	ET1=1;
	PT1=0;
}

/*
/**
* @brief  定时器以一毫秒为间隔的中断
  * @param  
  * @retval 
  */
/*
void Timer0_Routine() interrupt 1
{
	static unsigned int Count;
	TL1 = 0x66;
	TH1 = 0xFC;
	Count++;
	if(Count>=1000)
	{
		Count=0;
		
	}
}
*/

(4)Motor.c函数

#include <REGX52.H>
#include "Timer1.h"

sbit Motor=P1^0;
unsigned char Counter,Compare;

void Motor_Init(void)
{
	Timer1_Init();
}

void Motor_SetSpeed(unsigned char Speed)
{
	Compare=Speed;
}

void Timer1_Routine() interrupt 1
{
	
	TL1 = 0xA4;
	TH1 = 0xFF;
	Counter++;
	if(Counter>=100)
	{
		Counter=0;
		
	}
	if(Counter<Compare)
	{
		Motor=1;
	}
	else
	{
		Motor=0;
	}
		
}

总体上是已经大概了解了51单片机的过程,接下来就是自己多动手练习代码,理解代码的组成和查看手册的工作了。

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

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

相关文章

ubuntu在命令行输出里查找内容,dmesg

直接执行查看日志指令会出来很多页。dmesg为开机日志信息。记录了开机时硬件的过程 sudo dmesg 执行结果&#xff1a; 可以用竖号“|”&#xff0c;在前一条命令返回的内容进行查找。下图为查找bluetooth sudo dmesg |grep -i bluetooth

ufw命令简介

正文共&#xff1a;3999 字 41 图&#xff0c;预估阅读时间&#xff1a;4 分钟 我们之前在CentOS系统中研究了iptables命令的使用方法&#xff08;iptables命令简介&#xff09;&#xff0c;还做了简单的应用实验&#xff08;如何通过iptables配置URL过滤黑名单&#xff1f;、如…

DevExpress WinForms自动表单布局,创建高度可定制用户体验(二)

使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验&#xff0c;从自动安排UI控件到按比例调整大小&#xff0c;DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&a…

LeetCode:删除排序链表中的重复元素(C语言)

1、问题概述&#xff1a;给定一个已排序链表的头&#xff0c;删除重复元素&#xff0c;返回已排序的链表 2、示例 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&#xff1a;[1,2,3] 3…

【Python】一文向您详细介绍 K-means 算法

【Python】一文向您详细介绍 K-means 算法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff…

set 与 map底层实现

目录 set与map底层基本介绍​ 红黑树的迭代器 operator 情况一&#xff1a;右不为空 情况二&#xff1a;右为空 operator-- 情况一&#xff1a;end()-- 情况二&#xff1a;左子树不为空 情况三&#xff1a;右子树不为空 项目代码 RBTree.h myMap.h mySet.h set与m…

TCP的socket的API

关键的两个类 1)ServerSocket 该类专门给服务器用的,这个构造方法传入端口进行连接 accept相当于是接听操作,进行连接 close关闭当前套接字,当socket对象与进程的生命周期不一致时需要提前释放资源,就需要调用close 为什么UDP的客户端服务器中没有这个close方法,因为这个sock…

Manticore Search(es轻量级替代)

概念&#xff1a; Manticore Search 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx&#xff0c;显着改进了它的功能&#xff0c;修复了数百个错误&#xff0c;几乎完全重写了代码并保…

服务器数据恢复—Isilon存储集群节点误删除的数据恢复案例

Isilon存储结构&#xff1a; Isilon存储使用的是分布式文件系统OneFS。在Isilon存储集群里面每个节点均为单一的OneFS文件系统&#xff0c;所以Isilon存储在进行横向扩展的同时不会影响数据的正常使用。Isilon存储集群所有节点提供相同的功能&#xff0c;节点与节点之间没有主备…

国产大模型之光-Kimi AI

又是一年年中&#xff0c;各种工作总结、报告数不胜数&#xff0c;打工人们又面临年中绩效的考核&#xff0c;还恰逢毕业季&#xff0c;又有很多校招朋友初入职场&#xff0c;成为打工人&#xff0c;老板PUA&#xff0c;Mentor不带教&#xff0c;加班熬夜掉头发。 现在各大互联…

TCP系列(一)-介绍TCP

服务 TCP和UDP同样使用IP提供的服务&#xff0c;但是TCP提供的是面向连接&#xff0c;可靠的字节流服务 面向连接 使用TCP进行通信双方&#xff0c;必须先建立连接&#xff0c;然后进行数据交换 可靠服务 将应用数据分割成固定大小的报文段每次发出报文&#xff0c;会启动定时…

嵌入式单片机软件与硬件的结合方法分析

不知道大家有没有疑惑,为什么软件能控制硬件?关于这个问题,给出直观解释的文章:本文分析STM32单片机到底是如何软硬件结合的,分析单片机程序如何编译,运行。 软硬件结合 初学者,通常有一个困惑,就是为什么软件能控制硬件?就像当年的51,为什么只要写P1=0X55,就可以…

防近视台灯有效果吗?精选学生护眼台灯哪个品牌好

在当今快节奏的生活环境中&#xff0c;我们常常忽视了眼部休息&#xff0c;对眼睛的关爱变得尤为稀缺&#xff0c;这直接导致了近视率的逐年飙升。在这样的背景下&#xff0c;不少人将护眼需求投向防近视台灯。防近视台灯也称为护眼灯&#xff0c;护眼灯号称有独特的护眼技术&a…

spring 中的属性解析器 PropertyResolver

我们知道&#xff0c;在 spring 中可以使用占位符&#xff0c;格式如 "${}"&#xff0c;大括号中间放置待替换的占位符&#xff0c;待使用值时根据配置的属性解析器进行解析。但具体是如何操作的&#xff0c;且看本文来进行分析。 PropertyResolver 这是一个针对任…

Unity UGUI 之 图集

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是图集 精灵图…

recursion depth exceeded” error

有些时候不可以用jax.jit装饰器 参考资料&#xff1a;使用 JAX 后端在 Keras 3 中训练 GAN |由 Khawaja Abaid |中等 (medium.com)

最优化理论与方法-第十讲割平面法

文章目录 1. 原问题&#xff1a;2. 割平面法程序步骤2.1 第一次迭代2.2 第二次迭代2.3 第三次迭代 1. 原问题&#xff1a; 给定下列约束优化问题&#xff1a; ( P ) min ⁡ 3 x 1 2 2 x 2 2 s t . − 5 x 1 − 2 x 2 3 ≤ 0 , x ∈ X { x ∈ Z n ∣ 8 x 1 8 x 2 ≥ 1 , 0…

记事本案例组件版本(源码分享)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

基于Hutool实现自定义模板引擎,实现json个性化模板引擎转换

文章目录 前言编写引擎类&#xff1a;JsonTemplateEngine编写模板类&#xff1a;CustomTemplate编写测试代码测试json文件测试类 前言 由于百度搜索json模板引擎&#xff0c;推荐的都是一些freemarker之类的&#xff0c;需要引入其他的依赖&#xff0c;而且在编写json模板的时…

深入浅出WebRTC—Pacer

平滑发包&#xff08;Pacer&#xff09;是 WebRTC 实现高质量实时通信不可或缺的一部分。在视频通信中&#xff0c;单帧视频可能包含大量的数据&#xff0c;如果未经控制地立即发送&#xff0c;可能瞬间对网络造成巨大压力。Pacer 能够根据网络条件动态调整发送速率&#xff0c…