基于51单片机实现红外控制系统控制电机调速

2023-01-31  

具体功能实现

初始时,数码管上显示0,此时电机不转动;当按下红外遥控上的“1”时,数码管显示1,电机的转速加快;一共分为三个挡位,每升高一个挡位,数码管都会显示对应的挡位数字同时提高电机的转速。


器件:

AT89C52,8位数码管,红外遥控器,步进电机,扇叶,74HC138译码器,HS0038红外接收探头


红外调试前后图 :

调试前:

调节后

知识介绍 :HS0038红外探头

HS0038是一款红外接收探头,接收红外信号频率为38kHz,周期约26μs


红外遥控

红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出

通信方式:单工,异步

红外LED波长:940nm

通信协议标准:NEC标准


红外基本发送与接收

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

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

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


红外NEC协议编码说明


空闲状态(state=0)代码:

if(IR_State==0) //状态0,空闲状态

{

Timer0_SetCounter(0); //定时计数器清0

Timer0_Run(1); //定时器启动

IR_State=1; //置状态为1

}

开始状态(state=1)代码:

if(IR_Time>12442-500 && IR_Time<12442+500)

{

IR_State=2; //置状态为2

}


repeat状态代码:

else if(IR_Time>10368-500 && IR_Time<10368+500)

{

IR_RepeatFlag=1; //置收到连发帧标志位为1

Timer0_Run(0); //定时器停止

IR_State=0; //置状态为0

}


接收存储数据代码:

//如果计时为1120us,则接收到了数据0

if(IR_Time>1032-500 && IR_Time<1032+500)

{

IR_Data[IR_pData/8]&=~(0x01<IR_pData++; //数据位置指针自增

}

//如果计时为2250us,则接收到了数据1

else if(IR_Time>2074-500 && IR_Time<2074+500)

{

IR_Data[IR_pData/8]|=(0x01<IR_pData++; //数据位置指针自增

}


外部中断:

STC89C52有4个外部中断;

STC89C52的外部中断有两种触发方式:

下降沿触发和低电平触发

下降沿触发:当按键按下不松手时只触发一次

低电平触发:当按键按下不松手时会持续触发

中断号:

PWM脉冲宽度调制定理

PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域

PWM重要参数:

频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距



例子:在制作LED呼吸灯时,如果想要让LED亮的时间更长,只需要提高比较值。


直流电机简介

直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。

直流电机主要由永磁体(定子)、线圈(转子)和换向器组成。

除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等。


主函数代码(C语言)KEIL5实现:

#include


#include "Delay.h"


#include "Key.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_GetCommand(); //获取遥控器命令码


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); //数码管显示速度


}


}


问题解答:

Q:代码超出版本限制如何解决?如图:


A:用注册机对KEIL5软件进行重新破解,破解步骤链接:

Q:延时函数如何快速自动生成?

A:在STC-ISP中根据红色方框进行设计


Q:最后如何进行数据验证?

A:根据下面Data格式进行验证,代码如下:

if(IR_pData>=32) //如果接收到了32位数据

{

IR_pData=0; //数据位置指针清0

if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3])) //数据验证

{

IR_Address=IR_Data[0]; //转存数据

IR_Command=IR_Data[2];

IR_DataFlag=1; //置收到连发帧标志位为1

}

Timer0_Run(0); //定时器停止

IR_State=0; //置状态为0

}

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。