51單片機除了幾款加強版的帶pwm,,很多都不帶,,所以要用51控制伺服電機很多時候就要軟件模擬pwm??戳诵┐a有的是通過延時來輸出pwm波,,有的也用了定時器但是那些代碼要驅(qū)動多路伺服電路就顯得比較麻煩。下面的代碼是通過定時器0產(chǎn)生每0.5ms一次的提醒,,程序在大循環(huán)中通過調(diào)用DJ()函數(shù)可以返還值給伺服電機信號引腳,,DJ()函數(shù)可以定旋轉(zhuǎn)的角度,但是因為定時器設置是0.5ms的中斷這就決定了旋轉(zhuǎn)呢角度只能是-45,,-90,,0,45,90。如果要提高精度就要通過設置定時器的初值,,改變函數(shù)的num值來達成,。 #include"reg52.h" unsigned int num=0; //舵機 sbit DJ1=P3^6; sbit DJ2=P3^7; /*引腳定義*/ int DJ(int a); //函數(shù)聲明 timerinit() //定時器中斷初始化 { TMOD=0x01; //設置定時器0為工作方式1 EA=1; //開總中斷 ET0=1; //定時器0中斷允許 TH0 = (65536-500)/256; //初值使得定時器0.5毫秒溢出 TL0 = (65536-500)%256; TR0=0; } main() { timerinit(); while(1) { } } timer() interrupt 0 //0.5ms發(fā)生一次中斷,20ms后定時器置0重新計數(shù) { num++; DJ1=DJ(3); DJ2=DJ(3); if(num>=40) { num=0; TH0 = (65536-500)/256; //初值使得定時器0.5毫秒溢出 TL0 = (65536-500)%256; return; } } int DJ(char a) //當a=3舵機所在的位置是0度a=2 a=1分別對應的位置是-45 -90度a=4 a=5對應位置為45 90度 { if(num>=a||num>=5) return 0; if(num>=1) return 1; } 時間倉促還沒有測試程序的可行性(通常是沒有問題呢,,呵呵),,等有時間的話會繼續(xù)完善程序加上可以控制舵機旋轉(zhuǎn)速度的功能。如果要弄機器人的話還是弄塊專業(yè)的驅(qū)動板吧,,那樣調(diào)試起來會很直觀很方便呢減少許多不必要的麻煩呢,。 |
|