描述:利用单片机来控制一个直流电机,
实现其正转、反转、加速、减速、启动、
停止与转速的测量,同时将电机的转速
实时的通过数码管显示出来
以下为程序:
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ //查表输出显示
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71,0x00,0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0x77};
//E-0xf9;R-0x77;O-0x3f
sbit seg=P2^7; //输出锁存端
sbit wei1=P2^3; //数码管1位选通
sbit wei2=P2^4; //数码管2位选通
sbit wei3=P2^5; //数码管3位选通
sbit wei4=P2^6; //数码管4位选通
sbit wei5=P2^2; //数码管5位选通
sbit corotation=P2^0; //电机信号控制端
sbit rollback=P2^1; //电机信号控制端
sbit green=P3^1; //正转指示灯
sbit red=P3^0; //反转指示灯
uchar c=0; //定时器1中断次数
uchar direction=0; //direction=0正转 ,direction=1反转
uchar high=0; //高电平持续时间 ;默认为0即停转
uchar pnum; //脉冲个数
uint cc; //定时器0中断次数
uint r=0; //转速 RPM 转每分钟
uchar keyword; //键值
uchar qiting=0;
/****************系统初始化********************/
void SystemInit()
{ corotation=0;
rollback=0;
P1=0xff;
EA = 0;
TMOD=0x12;
TH1=0XFE;
TL1=0X70;
ET1=1; //允许T1中断
TR1=1; //开启定时器1
IT0 = 1; //负边沿触发中断
EX0 = 1; //允许外部中断
EA = 1;
}
/***************测速中断子程序******************/
void INT0_speed() interrupt 0
{
if(pnum==0)
{
TH0=0X06;
TL0=0X06;
ET0=1; //允许T0中断
TR0=1; //开启定时器0
}
pnum++;//脉冲数加一
if(pnum==9)
{TR0=0;//关闭定时器0
ET0=0;
pnum=0;
r=240000/cc;
cc=0;
}
}
/*************定时器0中断子程序*******************/
void time0(void) interrupt 1
{
cc++;
}
/*************定时器1中断子程序*******************/
void time1(void) interrupt 3
{
TH1=0XFE;
TL1=0X70;
if(direction==0) //direction=0正转
{ if(high!=0)
{green=0;
red=1;} //LED指示正转
else
{green=1;
red=1;}
rollback=0;
if(high!=0)
{
if(c==100) //PWM脉冲产生
{
c=0;
corotation=1;
}
}
if(c==high)
{
corotation=0;
}
}
else //direction=1反转
{
if(high!=0)
{green=1;
red=0;} //LED指示反转
else
{green=1;
red=1;}
corotation=0;
if(high!=0) //PWM脉冲产生
{
if(c==100)
{
c=0;
rollback=1;
}
}
if(c==high)
{
rollback=0;
}
}
c++;
}
/*******************延时子程序*******************/
void delay(uint z) //z=1000延时1s;z=100延时0.1S z=1延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
/*****************显示子程序******************/
void display(uint rnum,uchar change)
{
uchar num1,num2,num3,num4,change1;
change1=change/10;
if(rnum>999)
{
num1=rnum%10;
num2=rnum%100/10;
num3=rnum%1000/100;
num4=rnum/1000;
}
else if(rnum>99)
{
num1=rnum%10;
num2=rnum%100/10;
num3=rnum%1000/100;
num4=16; //前面的零消隐
}
else if(rnum>9)
{
num1=rnum%10;
num2=rnum%100/10;
num3=16; //前面的零消隐
num4=16;
}
else
{
num1=rnum%10;
num2=16; //前面的零消隐
num3=16;
num4=16;
}
wei1=1;wei2=1;wei3=1;wei4=1;wei5=1;
P0=table[num1];
seg=1;
seg=0;
wei1=0;wei2=1;wei3=1;wei4=1;wei5=1;
delay(1);
wei1=1;wei2=1;wei3=1;wei4=1;wei5=1;
P0=table[num2];
seg=1;
seg=0;
wei1=1;wei2=0;wei3=1;wei4=1;wei5=1;
delay(1);
wei1=1;wei2=1;wei3=1;wei4=1;wei5=1;
P0=table[num3];
seg=1;
seg=0;
wei1=1;wei2=1;wei3=0;wei4=1;wei5=1;
delay(1);
wei1=1;wei2=1;wei3=1;wei4=1;wei5=1;
P0=table[num4];
seg=1;
seg=0;
wei1=1;wei2=1;wei3=1;wei4=0;wei5=1;
delay(1);
wei1=1;wei2=1;wei3=1;wei4=1;wei5=1;
P0=table[change1];
seg=1;
seg=0;
wei1=1;wei2=1;wei3=1;wei4=1;wei5=0;
delay(1);
}
/******************按键扫描子程序*********************/
void kbscan(void)
{ uchar temp,i;
if(high==0)
r=0;
if(IE0==0&&pnum!=0&&TF0==1) r=0; //防止数字在没有信号的情况下
// 仍然显示上次的数据,即不能测试0
keyword=P1&0x0f;
if(keyword!=0x0f) //有键按下
{
delay(200); //延时去抖
keyword=P1&0x0f;
if(keyword!=0x0f) //确实有键按下
{
if((P1&0x0f)!=0x0f); //等待按键释放
switch(keyword)
{
case 0x07: //正反转切换
{
temp=high;
for(i=0;i<11;i++)
{
if(high<11)
high=0;
else
high=high-10;
display(r,high);
delay(400); //先逐级减速到零
}
direction=~direction;//切换方向
for(i=0;i<11;i++)
{
if(temp<11)
high=temp;
else
{
if(high>(temp-10))
high=temp;
else
high=high+10;
display(r,high);
delay(300); //逐级加速到原来的速度
}
}
break;
}
case 0x0e: //启动与停止
{
qiting=~ qiting;
if(!qiting)
{
for(i=0;i<10;i++)
{
if(high>90)
{high=100;
display(r,high);}
else
{high=high+10;
display(r,high);}
delay(200);
} //逐级加速到最高档
}
else
{
for(i=0;i<10;i++)
{
if(high<10)
{high=0;
display(r,high);}
else
{high=high-10;
display(r,high);}
delay(300);
}
} //逐级减速到最低档
break; }
case 0x0b: //以10%的幅度加速
{
if(high>90)
high=100;
else
high=high+10;
break;
}
case 0x0d: //以10%的幅度减速
{
if(high<10)
high=0;
else
high=high-10;
break;
}
default:break;
}
}
}
}
/*********************主程序******************/
void main()
{
SystemInit(); //初始化
while(1)
{
kbscan(); //键扫描函数
display(r,high); //显示转速
}
}
测速机的反馈电压 与它连接的电机的转速有关,转速高反馈电压高,反之低,测速机上的铭牌会标出额定电压,这个电压有24V.51V.110V的,就是说电机最高转速反馈电压为额定电压,所以测速机与调速器匹配时要考虑调速器的反馈接口电压要与测速机的额定电压相等,电机与调速器配合主要看电机的功率与调速器的功率相同或调速器功率大于电机功率
希望有别人能帮助你