51单片机直流电机转速

我想把数码管换成LM016L具体的程序怎么改:
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define THC0 0xf9
#define TLC0 0x0f //2ms
unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管
unsigned char Data_Buffer[8]={0,0,0,0,0,0,0,0}; // 显示缓存

uchar i=0;
sbit AddSpeed=P1^1;
sbit SubSpeed=P1^2;
sbit PWM_FC=P1^0;
int e ,e1 ,e2 ;//pid偏差
float uk ,uk1 ,duk ;//pid输出值
float Kp=5,Ki=10,Kd=1.9;//pid控制系数
int out=0;
uint SpeedSet=380;
uint cnt=0;
uint Inpluse=0,num=0;//脉冲计数
uint PWMTime=100;//脉冲宽度
unsigned char arry[];
void SendString(uint ch);
void PIDControl();
void SystemInit();
void delay(uchar x);
void PWMOUT();
void SetSpeed();
void SegRefre();
/**************主函数************/
void main()
{
SystemInit();
while(1)
{
SetSpeed(); //按键设定速度
SegRefre(); //数码管显示刷新
PWMOUT(); //输出PWM

}
}

void PIDControl() //pid偏差计算
{
e=SpeedSet-num; //误差=设定值-1S采集的脉冲值
duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;
uk=uk1+duk;
out=(int)uk; //输出为占空比
if(out>1000)
{
out=1000;
}
else if(out<0)
{
out=0;
}
uk1=uk; //变量值移位
e2=e1;
e1=e;
PWMTime=out;
}

void delay(uchar x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=50;j>0;j--);
}

void PWMOUT() //输出PWM脉冲
{
if(cnt<PWMTime) //高电平时间为PID输出PWMTime
{
PWM_FC=1;
}
else
{
PWM_FC=0;
}
if(cnt>1000) cnt=0;
}
void SystemInit()
{
TMOD=0X21;
TH0=THC0;
TL0=TLC0;
TH1=0xC0;
TL1=0XC0;
ET1=1;
ET0=1;
TR0=1;
TR1=1;
EX0=1; //中断0用来测量转速
IT0=1;
EA=1;
e =0; //初始化差值
e1=0;
e2=0;
}
void SetSpeed()
{
if(AddSpeed==0)
{
delay(200); //消抖处理
if(AddSpeed==0)
{
SpeedSet+=10;
if(SpeedSet>1500)
{
SpeedSet=1500;
}
}
}
if(SubSpeed==0)
{
delay(200);
if(SubSpeed==0)
{
SpeedSet-=10;
if(SpeedSet<0) SpeedSet=0;
}
}
}
void SegRefre() //显示刷新
{
Data_Buffer[0]=SpeedSet/1000; //分离设定值各位
Data_Buffer[1]=SpeedSet%1000/100;
Data_Buffer[2]=SpeedSet%100/10;
Data_Buffer[3]=SpeedSet%10;
Data_Buffer[4]=num/1000; //分离采集脉冲数各位
Data_Buffer[5]=num%1000/100;
Data_Buffer[6]=num%100/10;
Data_Buffer[7]=num%10;
}
程序还有出不来这么多,求大神,有偿

第1个回答  2016-05-08
你好!需要你提供仿真图然后配合程序,然后才能帮你改
相似回答