|
STC89C52,以下程序可以仿真運(yùn)行,就是用按鍵改變頻率和脈沖數(shù)量不能準(zhǔn)確實(shí)現(xiàn),頻率加可以循環(huán),頻率減也可以,而且不準(zhǔn)確。角度加按到最后就直接成單一電平,不再變化,角度減按下就直接成單一電平,不能再變化。本人初學(xué)C語言,求高人指點(diǎn)問題出在哪里?是參數(shù)設(shè)置和單片機(jī)不匹配還是程序不完善?
#include reg52.h //這是一個(gè)按鍵驅(qū)動(dòng)步進(jìn)電機(jī)的程序
sbit k1=P1^2;//k1按下執(zhí)行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;//電機(jī)使能
unsigned int i,tt=1500,step=50;定義變量,tt用來確定頻率,step用來確定脈沖數(shù)量
void keyscan();//按鍵k1檢測
void keyscan1();//按鍵k9~k12檢測
void Manual();步進(jìn)電機(jī)手動(dòng)控制程序
void shoudong();//手動(dòng)程序調(diào)用開中斷程序
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初始值設(shè)置為1500,這是減速語句,變化范圍1500~500
}
else if(k10==0)
{
tt > 500;//這是加速語句
tt=tt-100;
}
else if(k11==0)
{
step < 200;//step初始設(shè)置50,范圍50~200,實(shí)際測試50時(shí)25個(gè)脈沖
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;
}
}
|
|