Bootstrap

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

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单片机的过程,接下来就是自己多动手练习代码,理解代码的组成和查看手册的工作了。

;