導航:首頁 > 操作系統 > 51單片機控制舵機程序

51單片機控制舵機程序

發布時間:2022-07-30 19:40:41

A. 51單片機控制舵機轉角的C語言程序

舵機頻率50hz就是說一周期是20ms,占空比在百分之2.5到12.5可以從-90轉到90度
單片機內部有工作的晶振頻率,定時器就是基於這個頻率計時,根據程序可以知道,20ms計時20000,所以計時器每加一的時間為1us,這個程序的意思就是先工作定時器0,20ms後輸出置為1並打開定時器1,定時器1計時到1.5ms後觸發中斷使得輸出為0,即占空比為1.5/20=百分之7.5,中間位置
定時器的寄存器加到0會觸發中斷,所以寄存器都寫負數,如想要20ms就寫-20000,這樣往上加到0需要的計數的次數就為20000,一次計數為1us,所以為20ms,而寄存器是由兩個八位寄存器組成的,所以20000要分開寫
建議有時間可以去看一下郭天祥老師的51單片機視頻,能搜到而且不多,貌似第三集是講的定時器

B. 用51單片機產生pwm信號來控制舵機轉動的程序

文庫裡面有一篇文獻,就是講51單片機控制舵機動作的,你去看看吧:
http://wenku..com/link?url=__2hvi9kxz6j8TcBa70mt15lzAC

C. 菜鳥求助 51單片機 90度舵機 程序怎樣寫

你好!
1、舵機角度控制,步進是多少
2、藍牙需要串口通訊,單片機編程
3、藍牙接收是手機,需要 APP編程
4、逐步完成程序,分步調試,最後完成
5、有其他問題,可,以,私,信,我

D. 跪求51單片機控制舵機程序(切記,單片機,不要弄個C來忽悠啊)

我現在也在做舵機控制,這是控制一個舵機的程序,可以參考!
通過按鍵,改變單片機輸出脈沖寬度1ms~2ms,使舵機在-90°~+90°間轉動

ORG 0000H
AJMP MAIN ;轉主程序
ORG 000BH
AJMP INTT0 ;轉定時中斷子程序

MAIN: MOV SP,#80H
SETB EA ;開總中斷
SETB ET0 ;允許T0中斷
CLR P3.7 ;脈沖波形起始狀態
MOV TMOD,#01H ;定時,方式0
MOV 30H,#2EH ;舵機0 位,1.5ms定時初始值,TL0值存30H
MOV 31H,#0FAH ;TH0值存31H
MOV 32H,#0B2H ;18.5ms定時初始值,TL0值存32H
MOV 33H,#0B7H ;TH0存33H
CLR F0 ;清標志位
SETB TR0 ;啟動T0

K1: JB P1.4,K2 ;右轉鍵未按下,轉K2,判左轉鍵
ACALL D10MS ;按下,延時,防抖
JNB P1.4,$ ;等待釋放
ACALL D10MS
MOV A,30H
CJNE A,#3AH,K10 ;判斷是否到90°
AJMP K2 ;到90°,不改變定時時間常數,轉K2
K10: CLR C ;未到90°,清進位位,下條指令為帶進位減,必須先清進位
SUBB A,#20 ;減小時間常數,即加大高電平脈沖寬度,每次0.02ms遞增,舵機轉動3.6°
JNC K11
DEC 31H ;借位
K11: MOV 30H,A
CLR C
MOV A,32H
ADD A,#20 ;加大時間常數,即減小低電平脈沖寬度
JNC K12
INC 33H
K12: MOV 32H,A

K2: JB P1.5,K3
ACALL D10MS
JNB P1.5,$
ACALL D10MS
MOV A,30H
CJNE A,#22H,K20
AJMP K3
K20: CLR C
ADD A,#20
JNC K21
INC 31H
K21: MOV 30H,A
CLR C
MOV A,32H
SUBB A,#20
JNC K22
DEC 33H
K22: MOV 32H,A
CLR C

K3: JB P1.6,K1 ;判斷電機回0 鍵是否按下
ACALL D10MS
JNB P1.6,$
ACALL D10MS
MOV 30H,#2EH ;舵機0 位,脈寬1.5ms
MOV 31H,#0FAH
MOV 32H,#0B2H
MOV 33H,#0B7H
AJMP K1

INTT0: CPL F0 ;中斷服務程序
CPL P3.7 ;輸出高、低電平脈沖
JB F0,HIGH1
LOW0: MOV TL0,32H ;低電平脈沖定時常數
MOV TH0,33H
RETI
HIGH1: MOV TL0,30H ;高電平脈沖定時常數
MOV TH0,31H
RETI
D10MS: MOV R2,#20
MOV R1,#250
DJNZ R1,$
DJNZ R2,$-4
RET

END

E. 如何用51單片機控制舵機的單片機程序是怎麼寫的希望你也能給我發一個編寫程序和電路圖

單片機系統實現對舵機輸出轉角的控制,必須首先完成兩項任務:首先,產生基本的PWM周期信號,即產生20ms的周期信號;其次,調整脈寬,即單片機調節PWM信號的占空比。單片機能使PWM信號的脈沖寬度實現微秒級的變化,從而提高舵機的轉角精度。單片機完成控制演算法,再將PWM信號輸出到舵機。
發一個自己原來寫的簡單的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延時函數
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);

}
//定時器初始化
void Time0_init()
{
TMOD=0x01; //定時器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定時器0中斷程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判斷0.5ms次數是否小於角度標識
pwm=1; //是,pwm輸出高電平
else
pwm=0; //否,輸出低電平
count=count+1;
count=count%40; //次數始終保持為40,即保持周期為20ms
}
//按鍵掃描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按鍵按下則20ms周期重新開始計時
if(jd==6)
jd=5; //已經是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已經0度,保持
while(jian==0);
}
}
}
//數碼管顯示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
電路圖很簡單的,幾個按鍵,再在單片機最小系統上接出一個信號線,再給舵機供上電就可以了。

F. 51單片機控制舵機左轉90然後延時2秒再右轉180,延時兩秒回到中間,怎麼做

以下程序可供參考
//用一個定時器定時100US產生PWM波
//周期200*100us=20ms
//改變b的值可改變占空比 b=10對應高電平時間1ms
#include<STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P2^0;

uchar a=200,b=15;//b=15對應舵機0度
void Delay1ms(uint i) //1ms延時程序

{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}

void main()
{
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1;
EA=1;
TR0=1;
P1M0=0X0F; //低4位推挽輸出 控制兩個電機正反轉
P1M1=0X00;

P2M0=0X01; //最低位推挽輸出 控制舵機
P2M1=0X00;

while(1)
{
P1=0x0a;
b=15;Delay1ms(2000);//直行
b=10;Delay1ms(1000);//左轉
b=15;Delay1ms(2000);//直行
b=20;Delay1ms(1000);//右轉
b=15;Delay1ms(2000);//直行
P1=0x05;
b=15;Delay1ms(2000);//後退
b=10;Delay1ms(1000);//後左轉
b=15;Delay1ms(2000);//後退
b=20;Delay1ms(1000);//後右轉
b=15;Delay1ms(2000);//後退
}

}
void timer0()interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
a++;
if(a<=b) PWM=1;
else PWM=0;
if(a==200){a=0;PWM=1;}
}

G. 51單片機控制舵機(MG995).

舵機是通過占空比,來控制它的旋轉角度,控制信號從單片機輸出之後,不能直接接舵機,因為功率不夠,中間接一個非門就可以了。控制信號的編程應該來說是很簡單的,就是總周期是固定的,角度不同,高電平的持續時間就不同,然後,比如,50的高電平,150的低電平,那麼這樣的周期要多少個呢,這也是一個問題,太少了,旋轉時間不夠,太多了,連續的角度變化的話就會不流暢。多嘗試一下吧,還有,這種例子也很多,我們那個時候調了一星期才調好,單片機的型號,引腳關系大嘛?只要是通用的io口都可以用啊

H. 單片機控制舵機程序

//12MHz
#include <reg51.h>

void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0B1;
TL0 = 0x0E0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay(void) //誤差 0us 延時1ms 此處可以修改高電平周期
//修改此處的延時可以更改舵機轉的角度 ,45度具體是多少 你可以試試
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main(void)
{
InitTimer0();
P1_2=0;
while(1);
}

void Timer0Interrupt(void) interrupt 1
{
//20ms中斷
TH0 = 0x0B1;
TL0 = 0x0E0;
P1_2=1;
delay();
P1_2=0;
}

I. 求助大神,51單片機控制360度連續旋轉舵機的程序參考

控製程序和普通舵機一樣。只是360度連續旋轉舵機不能精確控制旋轉角度,只能控制旋轉方向和旋轉速度。

閱讀全文

與51單片機控制舵機程序相關的資料

熱點內容
麥當勞點餐app哪個好 瀏覽:585
手機網站圖片壓縮 瀏覽:172
前端程序員幹嘛 瀏覽:564
女權主義pdf 瀏覽:458
阿里雲伺服器低價續費 瀏覽:337
python監控日誌腳本 瀏覽:134
雲伺服器實例是什麼意思 瀏覽:710
小尋app是做什麼的 瀏覽:649
c語言中編譯和運行 瀏覽:1000
畫流圖找循環編譯原理 瀏覽:158
oppo手機西瓜視頻的文件夾 瀏覽:867
騎手一般用哪個app 瀏覽:610
程序員老闆用什麼手機 瀏覽:848
比心app頭像不通過為什麼 瀏覽:105
加密幣市值前十走勢 瀏覽:190
單片機學習推薦課程 瀏覽:473
對數ln的運演算法則圖片 瀏覽:735
仿微博app源碼 瀏覽:781
怎麼取消調用app 瀏覽:545
程序員去哪裡求助 瀏覽:834