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

红外遥控器

  • 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 		 	0x4Avoid 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.mzph.cn/diannao/49529.shtml

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

相关文章

vue 实战 tab标签页+el-card+流式布局+异步接口调用

<template><div><!-- 布局按钮 --><el-button click"dialogVisible true">布局配置查看</el-button><!-- 布局配置对话框 --><el-dialog :visible.sync"dialogVisible" title"布局配置查看" width"…

Invalid bound statement (not found)

Invalid bound statement (not found) 首先申明的是这个错误一般是使用mybatis方法没有找到或者参数不匹配等原因造成的&#xff01; 原本项目是使用eclipse运行&#xff0c;导入到idea之后&#xff0c;项目启动就报错 …Invalid bound statement (not found)… 解决办法&#…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性&#xff0c;可以从以下几个方面着手&#xff1a; 遵守网站的使用条款和服务协议&#xff1a;在爬取数据之前&#xff0c;仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取&#xff0c;哪些不可以。 例如&…

中电金信:AI数据服务

01 方案简介 AI数据服务解决方案为泛娱乐、电子商务、交通出行等行业提供数据处理、数据分析、AI模型训练等服务&#xff0c;通过自主研发的IDSC自动化数据服务平台与客户业务流程无缝衔接&#xff0c;实现超低延时的实时数据处理支持。 02 应用场景 智能医疗&#xff1a; 通…

深入浅出mediasoup—通信框架

libuv 是一个跨平台的异步事件驱动库&#xff0c;用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架&#xff0c;具有单线程、事件驱动和异步的典型特征&#xff0c;是构建高性能 WebRTC 流媒体服务器的重要基础…

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式&#xff0c;设计模式就好比是一种固定代码套路类似于棋谱&#xff0c;是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是&#xff0c;在有…

升级python版本

参考 https://blog.51cto.com/u_15579956/10397535 python3 main.py

聚焦保险行业客户经营现状,概述神策数据 CJO 解决方案

触点红利时代&#xff0c;企业的经营需求从「深度的用户行为分析」转变为「个性化、全渠道一致的客户体验」。客户旅程编排&#xff08;Customer Journey Orchestration&#xff0c;简称 CJO&#xff09;从体验出发&#xff0c;关注客户需求、感受和满意度&#xff0c;能够帮助…

HarmonyOS Next系列之地图组件(Map Kit)使用(九)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

「运费速查神器」精明买家必备!一键查询1688供应商发货费用

对于从事跨境买家还是国内电商买家&#xff0c;在选品时&#xff0c;需要全面考虑商品成本&#xff0c;发货费用是供应链成本的重要组成部分。 原来如果我们在1688选品看供应商发货运费&#xff0c;需要一个个单独点击到商品的详情页去查看&#xff0c;再选择具体的收货地、再…

Elastic:监控不同于可观察性的 3 个原因

作者&#xff1a;来自 Elastic Observability Team 监控和可观察性经常互换使用&#xff0c;但它们并不完全相同。监控是可观察性的重要组成部分&#xff0c;但可观察性远远超出了传统监控实践的范围。 关键区别&#xff1a;监控从各个组件收集数据 —— 何时和什么&#xff0…

微信小程序-CANVAS写入图片素材、文字等数据生成图片

微信小程序中&#xff0c;CANVAS写入图片素材、文字等数据生成图片&#xff0c;最终可将生成的 base64 格式图片保存至相册操作 Tips&#xff1a; 1、canvas 标签默认宽度 300px、高度 150px canvas 生成图片时&#xff0c;写入图片素材、文字等数据前&#xff0c;需要根据实…

叶再豪降龙精英课程总结

文章目录 1.思维认知1.1 稻盛和夫成功公式1.2 龙头主升模式1.3 龙头主升-两种路径1.4 股市新手的炒股思路1.5 龙头案例1.6 降龙心法 2.情绪周期2.1 情绪周期2.1 情绪演绎周期2.2 情绪的四个部分2.2.1 指数的情绪周期2.2.3 热点情绪周期2.2.4 热点情绪演绎周期2.2.5 大热点支线2…

深入了解路由器工作原理:从零开始的简单讲解

简介 在现代网络中&#xff0c;路由器扮演着至关重要的角色。它不仅连接了不同的设备&#xff0c;还确保数据能够准确地传输到目的地。本文将带你深入探讨路由器的工作原理&#xff0c;帮助网络基础小白们理解这一重要设备的基本功能。 路由器的构成 路由器是一种具有多个输入…

纷享AI | AI技术在销售场景的应用与实践

AI高速发展的今天&#xff0c;各行业都经历着深刻变革。但机遇与挑战总相伴相生&#xff0c;各企业负责人事实上也正面临着如何有效利用AI以完成赋能销售业务的难题。 毋庸置疑&#xff0c;跟上技术潮流&#xff0c;通过落实AI在销售场景中的应用进而取得卓越赋能成果必然是行…

Android TabLayout的简单用法

TabLayout 注意这里添加tab&#xff0c;使用binding.tabLayout.newTab()进行创建 private fun initTabs() {val tab binding.tabLayout.newTab()tab.text "模板库"binding.tabLayout.addTab(tab)binding.tabLayout.addOnTabSelectedListener(object : TabLayout.On…

深度学习系列一

激活函数 sigmod 梯度消失问题&#xff1a; sigmoid函数的导数在输入值较大或较小时接近于0。在反向传播过程中&#xff0c;这些小梯度会相乘&#xff0c;导致深层网络的梯度变得非常小。结果是&#xff0c;深层网络的参数几乎不会更新&#xff0c;训练变得非常困难。这就是为…

Passing output of 3DCNN layer to LSTM layer

题意&#xff1a;将3DCNN&#xff08;三维卷积神经网络&#xff09;层的输出传递给LSTM&#xff08;长短期记忆网络&#xff09;层 问题背景&#xff1a; Whilst trying to learn Recurrent Neural Networks(RNNs) am trying to train an Automatic Lip Reading Model using 3…

2024年上半年主要游戏安全风险,该如何应对?

随着游戏行业的蓬勃发展&#xff0c;安全问题也日益成为行业关注的焦点。面对 2024 年上半 年的游戏安全风险挑战&#xff0c;游戏行业需要不断加强技术能力&#xff0c;完善安全策略&#xff0c;与各方共 同努力&#xff0c;打造一个更加安全、公平的游戏环境。 游戏安全解…

前端程序员会演化出类TA岗位吗?

前端开发领域确实在不断演化&#xff0c;随着技术的进步和行业的需求变化&#xff0c;前端程序员的角色和职责也在拓展&#xff0c;这自然催生了一系列相关的专业岗位。以下是一些从前端开发领域分化出来的专业角色&#xff0c;我们可以称之为“类TA”&#xff08;Technical Ad…