单片机学习(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 #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; } }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。