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

07-21 621阅读

红外遥控器

  • 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.硬件电路

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

            3.基本发送和接收

            空闲状态:红外LED不亮,接收头输出高电平

            发送低电平:红外LED以38KHz频率闪烁发光,接收头输出低电平

            发送高电平:红外LED不亮,接收头输出高电平

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

            4.NEC编码

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

            5.遥控器键码

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

            6.51单片机的外部中断

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

            7.外部中断寄存器

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

            17.2红外遥控的程序代码

            1.红外遥控

            (1)工程目录

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

            (2)main.c函数

            #include 
            #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 
            void Int0_Init(void)
            {
            	IT0=1;
            	IE0=0;
            	EX0=1;
            	EA=1;
            	PX0=1;
            }
            //void Int0_Routine(void)  interrupt 0
            //{
            //}
            

            (4)Timer0.c函数

            #include 
            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
            	TR0=Flag;
            }
            
            			
            	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
            	TR0=Flag;
            }
            
            	
            	
            	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);
            	}
            }
            
            			
            	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;
            		
            	}
            }
            */
            
            	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
            		Motor=1;
            	}
            	else
            	{
            		Motor=0;
            	}
            		
            }
            
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]