设计分享 | 基于51单片机实现红外控制系统控制电机调速

 

vx【嵌入式工程师成长日记】

https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484124&idx=1&sn=9fcf9eb8581b2190cc84bfeeb6ef32e3&chksm=cf430784f8348e926c10f95cbb0a4b211f5d45f5c5aac3ff5069849e7cf6c5e5e122c3e61efa&token=736795465&lang=zh_CN#rdhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484124&idx=1&sn=9fcf9eb8581b2190cc84bfeeb6ef32e3&chksm=cf430784f8348e926c10f95cbb0a4b211f5d45f5c5aac3ff5069849e7cf6c5e5e122c3e61efa&token=736795465&lang=zh_CN#rd

 

 

具体功能实现

初始时,数码管上显示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%8)); //数据对应位清0

IR_pData++; //数据位置指针自增

}

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

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

{

IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8)); //数据对应位置1

IR_pData++; //数据位置指针自增

}

外部中断:

STC89C52有4个外部中断;

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

下降沿触发和低电平触发

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

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

中断号:

PWM脉冲宽度调制定理

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

PWM重要参数:

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

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

直流电机简介

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

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

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

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

#include <REGX52.H>

#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

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值