機(jī)器人教程1:如何利用51單片機(jī)輸出PWM波
/************電機(jī)正反向控制**************/
void Motor_turn(void)
{
if(key_turn==0)
{
delayxms(2);//此處時間不能太長,否者會的中斷產(chǎn)生沖突
if(key_turn==0)
{
flag=~flag;
}
while(!key_turn);
}
}
/***********定時器0初始化***********/
void timer0_init(void)
{
TMOD=0x01; //定時器0工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
ET0=1;
EA=1;
}
/**************定時0中斷處理******************/
void timer0_int(void) interrupt 1
{
TR0=0;//設(shè)置定時器初值期間,關(guān)閉定時器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
if(flag==1)//電機(jī)正轉(zhuǎn)
{
PWM1=0;
time++;
if(time PWM2=1; } else PWM2=0; if(time>=100) { time=0; } } else //電機(jī)反轉(zhuǎn) { PWM2=0; time++; if(time PWM1=1; } else PWM1=0; if(time>=100) { time=0; } } } 4、程序4、使單片機(jī)輸出PWM,并能控制正反轉(zhuǎn)和實(shí)現(xiàn)調(diào)速 為了使大家徹底掌握此方面,下面再給出一個復(fù)雜一點(diǎn)的程序,實(shí)現(xiàn)的功能為通過一個按鍵控制正反轉(zhuǎn)并通過另外兩個按鍵使之可以在0到20級之間調(diào)速的程序。 /*******************************************************************/ /*程序名:PWM直流電機(jī)調(diào)速*/ /*晶振:11.00592 MHz CPU型號:STC89C52 */ /*直流電機(jī)的PWM波控制,可以通過按鍵控制正反轉(zhuǎn)并在0到20級之間調(diào)速*/ /*****************************************************************/ #include #define uint unsigned int #define uchar unsigned char uchar time,count=50,flag=1;//低電平的占空比 sbit PWM1=P2^0;//PWM通道1,反轉(zhuǎn)脈沖 sbit PWM2=P2^1;//PWM通道2,正轉(zhuǎn)脈沖 sbit key_add=P3^5;//電機(jī)加速 sbit key_dec=P3^6;//電機(jī)減速 sbit key_turn=P3^7;//電機(jī)換向 /************函數(shù)聲明**************/ void delayxms(uint z); void Motor_turn(); void Motor_add(); void Motor_dec(); void timer0_init(); /*********主函數(shù)********************/ void main() { timer0_init(); while(1) { Motor_turn(); Motor_add(); Motor_dec(); } } /****************延時處理**********************/ void delayxms(uint z)//延時xms程序 { uint x,y; for(y=z;x>0;x--) for(y=110;y>0;y--); } /************電機(jī)正反向控制**************/ void Motor_turn() { if(key_turn==0) { delayxms(2);//此處時間不能太長,否者會的中斷產(chǎn)生沖突 if(key_turn==0) { flag=~flag; } while(!key_turn); } } void Motor_add()//電機(jī)加速 { if(key_add==0) { delayxms(2);//此處時間不能太長,否者會的中斷產(chǎn)生沖突 if(key_add==0) { count+=5; if(count>=100) { count=0; } } while(!key_add); } } void Motor_dec()//電機(jī)加減速 { if(key_dec==0) { delayxms(2);//此處時間不能太長,否者會的中斷產(chǎn)生沖突 if(key_dec==0) { count-=5; if(count>=100) { count=0; } } while(!key_dec); } } /***********定時器0初始化***********/ void timer0_init() { TMOD=0x01; //定時器0工作于方式1 TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1; ET0=1; EA=1; }
評論