51单片机控制直流电机测速度的程序,跪求大神指点一下。
时间:10-02
整理:3721RD
点击:
在做毕设,不知道这测速度和调转速可不可以。感谢感谢。
#include<reg52.h>
#include"dc motor.h"
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int
extern uchar PWM_ON;
/******************外部中断0服务程序*****************************/
void INT_0() interrupt 0
{
speed_num++;
}
/***************定时器0中断服务程序*****************************/
void timer_0() interrupt 1
{
uchar counter=0;
TH0=(65536-10000)/256; //重设定时器0初值
TL0=(65536-10000)%256;
counter++;
if(100==counter)
{
a=speed_num; //到1S就计算收到多少个脉冲
counter=0;
}
}
/***************定时器1中断服务程序*****************************/
void timer_1() interrupt 3
{
static uchar count=0;
TH1=(65536-20000)/256; //重设定时器1初值
TL1=(65536-20000)%256;
count++;
if(count==PWM_ON)
{
dianji=0;
}
count++;
if(count==CYCLE)
{
count=0;
if(PWM_ON!=0)
dianji=1;
}
}
/******************速度调节程序*****************************/
void aspeed (uchar num)
{
static int temp;
if(num>temp)
{
if(PWM_ON<CYCLE)
PWM_ON++;
}
else
{
if(PWM_ON<CYCLE)
PWM_ON--;
}
temp=num;
}
/******************速度检测程序*****************************/
uchar speed_text(uchar a) //1S内计算的转速
{
uchar b;
b=a*2*3.14*10;//10表示半径10mm
return b;
}
/*************************判是否有键按下**************************************/
K=keyscan(); //调键扫
switch(K)
{
case 0x18: // 按下C键进入显示界面
lcd12864_write_command(0x01);
rate=speed_text(b); //获取速度
xianshi(); //显示速度
lcd12864_display(2,1, "当前速度为:");
lcd12864_display(3,3,speed_1 );
lcd12864_display(4,1, "按D键设置速度");
Delay_ms(3000);
break;
case 0x28: // 按下D键进入速度加减界面
lcd12864_write_command(0x01);
lcd12864_display(2,1, "按E键加速");
lcd12864_display(3,1, "按F键减速");
break;
case 0x48: // 按下E键加速
lcd12864_write_command(0x01);
lcd12864_display(1,1, "速度+");
lcd12864_display(2,1, " ");
aspeed (num);//速度调节
num++; // 加速键按下,速度标志加1
if(num==3)
num=3; // 达到最大3,则保持
break;
case 0x88: // 按下F键减速
lcd12864_write_command(0x01);
lcd12864_display(1,1, "速度-");
lcd12864_display(2,1, " ");
aspeed (num);//速度调节
if(num!=0)
num--;
else
num=0; // 达到最小3,则保持
break;
}
#include<reg52.h>
#include"dc motor.h"
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int
extern uchar PWM_ON;
/******************外部中断0服务程序*****************************/
void INT_0() interrupt 0
{
speed_num++;
}
/***************定时器0中断服务程序*****************************/
void timer_0() interrupt 1
{
uchar counter=0;
TH0=(65536-10000)/256; //重设定时器0初值
TL0=(65536-10000)%256;
counter++;
if(100==counter)
{
a=speed_num; //到1S就计算收到多少个脉冲
counter=0;
}
}
/***************定时器1中断服务程序*****************************/
void timer_1() interrupt 3
{
static uchar count=0;
TH1=(65536-20000)/256; //重设定时器1初值
TL1=(65536-20000)%256;
count++;
if(count==PWM_ON)
{
dianji=0;
}
count++;
if(count==CYCLE)
{
count=0;
if(PWM_ON!=0)
dianji=1;
}
}
/******************速度调节程序*****************************/
void aspeed (uchar num)
{
static int temp;
if(num>temp)
{
if(PWM_ON<CYCLE)
PWM_ON++;
}
else
{
if(PWM_ON<CYCLE)
PWM_ON--;
}
temp=num;
}
/******************速度检测程序*****************************/
uchar speed_text(uchar a) //1S内计算的转速
{
uchar b;
b=a*2*3.14*10;//10表示半径10mm
return b;
}
/*************************判是否有键按下**************************************/
K=keyscan(); //调键扫
switch(K)
{
case 0x18: // 按下C键进入显示界面
lcd12864_write_command(0x01);
rate=speed_text(b); //获取速度
xianshi(); //显示速度
lcd12864_display(2,1, "当前速度为:");
lcd12864_display(3,3,speed_1 );
lcd12864_display(4,1, "按D键设置速度");
Delay_ms(3000);
break;
case 0x28: // 按下D键进入速度加减界面
lcd12864_write_command(0x01);
lcd12864_display(2,1, "按E键加速");
lcd12864_display(3,1, "按F键减速");
break;
case 0x48: // 按下E键加速
lcd12864_write_command(0x01);
lcd12864_display(1,1, "速度+");
lcd12864_display(2,1, " ");
aspeed (num);//速度调节
num++; // 加速键按下,速度标志加1
if(num==3)
num=3; // 达到最大3,则保持
break;
case 0x88: // 按下F键减速
lcd12864_write_command(0x01);
lcd12864_display(1,1, "速度-");
lcd12864_display(2,1, " ");
aspeed (num);//速度调节
if(num!=0)
num--;
else
num=0; // 达到最小3,则保持
break;
}