单片机直流电机测速实验程序

如题所述

#include<reg52.h>
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int

//*********************//
sbit ENA = P2^2; //驱动芯片使能,若为0则电机停止;
sbit IN1 = P2^1; //控制电机正转和反转
sbit IN2 = P2^0; //控制电机正转和反转
sbit key1 = P1^0; //此键按下,电机正转;IN1=1;IN2=0 ;ENA=1
sbit key2 = P1^1; //此键按下,电机反转;IN1=0,IN2=1 ;ENA=1
sbit key3 = P1^2; //此键按下,电机刹停; IN1=1,IN2=1 ;ENA=1
//*********************//

int motor_change_mank=0;

// 按键设置
//**********************//
uint keylogo()
{
if(key1==0)
{
delayms(2) ;
//while(key1==0);
motor_change_mank=1;//正转标志位
}

if(key2==0)
{
delayms(2) ;
//while(key2==0);
motor_change_mank=2;//反转标志位
}

if(key3==0)
{
delayms(2) ;
//while(key3==0);
motor_change_mank=0;//刹停标志位
}

return(motor_change_mank);

}

//**********************//
//控制驱动芯片函数
//**********************//
void execute_motor()
{
switch(motor_change_mank)
{
case 0: //刹停标志位
{
IN1 = 1;
IN2 = 1;
ENA = 1;
}break;

case 1: //正转标志位
{
IN1 = 1;
IN2 = 0;
ENA = 1;
}break;

case 2: //反转标志位
{
IN1 = 0;
IN2 = 1;
ENA = 1;
}break;

default:break;

}

}
//**********************//

void main()
{

while(1)
{
keylogo();
execute_motor();
}

}

/**********************************************************************/
/**********************************************************************/
#define uint unsigned int

void delayms(uint n)
{
int i;
for(;n>0;n--)
for(i=0;i<1;i++);
}

/**********************************************************************/
/**********************************************************************/
#ifndef delay_h
#define delay_h
#define uint unsigned int

extern void delayms(uint n);

#endif
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
程序还是自己写吧。
你就利用单片机的一个计数器就可以测速了,电机转子侧需要装一个码盘,定子上放一个对射的光耦(或者用磁铁加霍尔的方式)。电机转一圈就可以接受到1个脉冲,程序编个定时器,在一段时间里面读取计数器的值,换算下,就可以计算出电机的转速了(r/min)本回答被提问者和网友采纳
第2个回答  2011-05-23
#include<reg52.h>
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int

//*********************//
sbit ENA = P2^2; //驱动芯片使能,若为0则电机停止;
sbit IN1 = P2^1; //控制电机正转和反转
sbit IN2 = P2^0; //控制电机正转和反转
sbit key1 = P1^0; //此键按下,电机正转;IN1=1;IN2=0 ;ENA=1
sbit key2 = P1^1; //此键按下,电机反转;IN1=0,IN2=1 ;ENA=1
sbit key3 = P1^2; //此键按下,电机刹停; IN1=1,IN2=1 ;ENA=1
//*********************//

int motor_change_mank=0;

// 按键设置
//**********************//
uint keylogo()
{
if(key1==0)
{
delayms(2) ;
//while(key1==0);
motor_change_mank=1;//正转标志位
}

if(key2==0)
{
delayms(2) ;
//while(key2==0);
motor_change_mank=2;//反转标志位
}

if(key3==0)
{
delayms(2) ;
//while(key3==0);
motor_change_mank=0;//刹停标志位
}

return(motor_change_mank);

}

//**********************//
//控制驱动芯片函数
//**********************//
void execute_motor()
{
switch(motor_change_mank)
{
case 0: //刹停标志位
{
IN1 = 1;
IN2 = 1;
ENA = 1;
}break;

case 1: //正转标志位
{
IN1 = 1;
IN2 = 0;
ENA = 1;
}break;

case 2: //反转标志位
{
IN1 = 0;
IN2 = 1;
ENA = 1;
}break;

default:break;

}

}
//**********************//

void main()
{

while(1)
{
keylogo();
execute_motor();
}

}

/**********************************************************************/
/**********************************************************************/
#define uint unsigned int

void delayms(uint n)
{
int i;
for(;n>0;n--)
for(i=0;i<1;i++);
}

/**********************************************************************/
/**********************************************************************/
#ifndef delay_h
#define delay_h
#define uint unsigned int

extern void delayms(uint n);

#endif

/***********************************************************************/
/***********************************************************************/