具体功能实现
初始时,数码管上显示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 #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 }