STC89C52,以下程序可以仿真运行,就是用按键改变频率和脉冲数量不能准确实现,频率加可以循环,频率减也可以,而且不准确。角度加按到最后就直接成单一电平,不再变化,角度减按下就直接成单一电平,不能再变化。本人初学C语言,求高人指点问题出在哪里?是参数设置和单片机不匹配还是程序不完善?
#include reg52.h //这是一个按键驱动步进电机的程序
sbit k1=P1^2;//k1按下执行void Manual();
sbit k9=P3^1; //频率减
sbit k10=P3^0; //频率加
sbit k11=P2^7;//角度加
sbit k12=P2^6;//角度减
sbit PWM=P2^3;//pwm输出
sbit DIR=P2^4;//换向电平输出
sbit EN=P2^5;//电机使能
unsigned int i,tt=1500,step=50;定义变量,tt用来确定频率,step用来确定脉冲数量
void keyscan();//按键k1检测
void keyscan1();//按键k9~k12检测
void Manual();步进电机手动控制程序
void shoudong();//手动程序调用开中断程序
void main(void)//主程序,主要是按键k1检测
{
while(1)
{
keyscan();
}
}
void keyscan()
{
while(1)
{
if(k1==0) Manual();
}
}
void keyscan1()//按键k9~12检测程序及改变tt、step的值
{
while(1)
{
if(k9==0)
{
tt < 1500;
tt=tt+100;//tt初始值设置为1500,这是减速语句,变化范围1500~500
}
else if(k10==0)
{
tt > 500;//这是加速语句
tt=tt-100;
}
else if(k11==0)
{
step < 200;//step初始设置50,范围50~200,实际测试50时25个脉冲
step=step+50;
}
else if(k12==0)
{
step > 50;
step=step-50;
}
}
}
void Manual()
{
while(1)
{
shoudong();
keyscan1();
keyscan();
}
}
void shoudong()
{
TMOD=0x01;
TH0=(65536-tt)/256;
TL0=(65536-tt)%256;
EA=1;
ET0=1;
TR0=1;
}
void zhongduan( ) interrupt 1
{
TH0=(65536-tt)/256;
TL0=(65536-tt)%256;
PWM=~PWM;
i++;
if(i==step)
{
i=0;
DIR=~DIR;
}
}
|