目的/效果
1:按VOL-键数字减、按VOL+加数字加
2:按键 0,1,2,3,4 电机调速
一,STC单片机模块
二,红外遥控
详细了解红外遥控控制原理请参考《51单片机STC89C52RC——17.1 红外线遥控器》
2.1 控制数字加减
2.1.1 红外遥控键码
#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_0 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
按键VOL-=0x15,VOL+=0x09
2.1.2 收到信号处理
if(Command==IR_VOL_MINUS) //如果遥控器VOL-按键按下
{
Num--; //Num自减
}
if(Command==IR_VOL_ADD) //如果遥控器VOL+按键按下
{
Num++; //Num自增
}
2.2 电机调速
有关直流电机详细介绍请参考《51单片机STC89C52RC——14.1 直流电机调速》
红外遥控0,1,2,3 按键 对应hex为
0x16 、0x0C、0x18、0x5E
电机的运转速度需要用到
PWM《51单片机STC89C52RC——10.1 LED呼吸灯》
模数数模AD/DA《51单片机STC89C52RC——15.1 AD/DA(模数数模》
中断《51单片机STC89C52RC——6.1 中断系统》
定时器《51单片机STC89C52RC——6.2 定时器》
三,创建Keil项目
详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客
四,代码
完整代码参考《https://gitee.com/oopxiajun/STC89C52》
4.1 按VOL-键数字减、按VOL+加数字加
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"
unsigned char Address;
unsigned char Command;
unsigned char Num;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Addr Cmd Num");
LCD_ShowString(2,1," ");
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) //如果遥控器VOL-按键按下
{
Num--; //Num自减
}
if(Command==IR_VOL_ADD) //如果遥控器VOL+按键按下
{
Num++; //Num自增
}
LCD_ShowNum(2,12,Num,3); //显示Num
}
}
}
2:按键 0,1,2,3 电机调速
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"
#include "Motor.h"
unsigned char Address;
unsigned char Command;
unsigned char Num;
unsigned char Command,Speed;
/**
* 函 数:主函数
* 参 数:无
* 返 回 值:无
*/
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Addr Cmd Speed");
LCD_ShowString(2,1," ");
Motor_Init();
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_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);}
LCD_ShowNum(2,12,Speed,3); //显示Speed
}
}
}
五,代码编译、下载到51单片机
代码编译请参考
《51单片机STC89C52RC——代码编译-CSDN博客》
代码下载请参考
《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》