① 求一段簡單的51單片機的程序,通電後舵機順時針旋轉180度,2秒後恢復。
51單片機控制舵機程序
#include <reg52.h>
#define Stop 0 //宏定義,停止
#define Left 1 //宏定義,左轉
#define Right 2 //宏定義,右轉
sbit ControlPort = P2^0; //舵機信號埠
sbit KeyLeft = P1^0; //左轉按鍵埠
sbit KeyRight = P1^1; //右轉按鍵埠
sbit KeyStop = P1^2; //歸位按鍵埠
unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定時器溢出計數 LeftOrRight:舵機左右旋轉標志
void InitialTimer ( void )
{
TMOD=0x10; //定時/計數器1工作於方式1
TH1 = ( 65535 - 500 ) / 256; //0.25ms
TL1 = ( 65535 - 500 ) % 256;
EA=1; //開總中斷
ET1=1; //允許定時/計數器1 中斷
TR1=1; //啟動定時/計數器1 中斷
}
void ControlLeftOrRight ( void ) //控制舵機函數
{
if( KeyStop == 0 )
{
//while ( !KeyStop ); //使標志等於Stop(0),在中斷函數中將用到 LeftOrRight = Stop;
}
if( KeyLeft == 0 )
{
//while ( !KeyLeft ); //使標志等於Left(1),在中斷函數中將用到 LeftOrRight = Left;
}
if( KeyRight == 0 )
{
//while ( !KeyRight ); //使標志等於Right(2),在中斷函數中將用到 LeftOrRight = Right;
}
② 單片機控制舵機程序
//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;
}
③ 跪求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
④ 專家進!怎樣用單片機控制舵機 (滿意+100分)
請看圖,圖上標注了角度和脈沖兩個參數,你仔細看,每個脈沖寬度對應一個角度,你只要寫程序,用單片機給舵機發送圖上任意一個有效的固定寬度的脈沖,那麼舵機就轉到這個脈沖對應的角度上了。
⑤ 如何用51單片機控制舵機的怎樣編寫程序啊大哥幫幫忙
舵機是一種位置伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。其工作原理是:控制信號由接收機的通道進入信號調制晶元,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最後,電壓差的正負輸出到電機驅動晶元決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。編程的時候也很簡單,你將一根管腳初始化為低電平,然後寫一個while循環,在循環中將該腳職位高電平,延時,再拉為低電平,如此不停的循環就是PWM波,你需要控制的是高電平產生的時間,根據高電平的時間來控制舵機的角度的,希望能幫的上你
⑥ 單片機控制舵機程序
//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;
}
⑦ 單片機 舵機程序
//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;
}
⑧ 求一個PWM單片機簡單控制舵機程序
以前幫人解決的;
/**舵機控制——火柴天堂作品-20120314**/
/**50Hz舵機,0.5ms-2.5ms 對應 0-180°(-90°~90°)**/
/**51系列單片機,晶振12MHz,P1.0輸出50Hz PWM調制方波(即周期20ms)驅動舵機,方波由T0定時器產生
P11-P17,7個光電檢測,P11-130.5°,P12-108°,P13-99°,P14-90°,P15-81°,P16-72°,P17-49.5°,優先順序高-低:P14→P11/P17→P12/P16→P13/P15 **/
#include"reg52.h" //包含52系列頭文件
#define uchar unsigned char //定義 無符號字元型
#define uint unsigned int //定義 無符號整型
//#define TRUE 1 //定義 邏輯真
//#define FALSE 0 //定義 邏輯假
//最小角度4.5°,時間應該為2ms×4.5°/180°=50us,故定時器T0定時時間為 50us
#define th0 0xce //50us for Model2 at 12HMz Fosc
#define DutyDeno 40 //定義 占空比分母(舵機轉動范圍) 為:180°/4.5°=40
#define SteeringBasic 10 //舵機基準角 0.5ms, 0.5ms/50us=10
#define SteerineSigne 400 //舵機信號 20ms, 20ms/50us=400
uchar code SteeringList[8]={0,29,24,22,20,18,16,11}; //P11-P17光電檢測對應舵機轉角列表,單位4.5°,第一個元素為空
sbit PS1=P1^0; //定義 光電開關1 介面
sbit PS2=P1^1; //定義 光電開關2 介面
sbit PS3=P1^2; //定義 光電開關3 介面
sbit PS4=P1^3; //定義 光電開關4 介面
sbit PS5=P1^4; //定義 光電開關5 介面
sbit PS6=P1^5; //定義 光電開關6 介面
sbit PS7=P1^6; //定義 光電開關7 介面
sbit Steering=P1^7; //定義 舵機輸出 介面
#define PS1_Value 1 //定義 光電開關1 值
#define PS2_Value 2 //定義 光電開關2 值
#define PS3_Value 3 //定義 光電開關3 值
#define PS4_Value 4 //定義 光電開關4 值
#define PS5_Value 5 //定義 光電開關5 值
#define PS6_Value 6 //定義 光電開關6 值
#define PS7_Value 7 //定義 光電開關7 值
uchar DutyNume; //定義 占空比分子(舵機轉角) 變數,單位4.5°
void Timer0() interrupt 1 //定時器T0 中斷 函數
{
static uint ty_time=0; //定義靜態變數,作為 占空比 輸出時間的參考值(50us)
ty_time=++ty_time%SteerineSigne; //該句等效於:ty_time++;ty_time%=SteerineSigne;
if(ty_time<DutyNume+SteeringBasic) Steering=1; //若計時時間小於 占空比分子,則輸出應為 高電平
else Steering=0; //若計時時間大於 占空比分子,則輸出應為 低電平
}
void TimerInit() //定時器初始化 函數
{
TMOD=0x02; //T0 8位自重裝定時器
EA=1; //允許系統中斷
ET0=1; //允許T0中斷
TH0=th0;
TL0=th0; //50us 初值
TR0=1; //T0開始計時
}
uchar PhotoSwitchScan() //光電開關掃描 函數
{
if(!PS4) return PS4_Value; //返回光電開關對應值
if(!PS1) return PS1_Value;
if(!PS7) return PS7_Value;
if(!PS2) return PS2_Value;
if(!PS6) return PS6_Value;
if(!PS3) return PS3_Value;
if(!PS5) return PS5_Value; //返回光電開關對應值
return PS4_Value; //其它情況,均保持跟最高級別一致
}
void PhotoSwitchResp() //光電開關響應 函數
{
//uchar PS_value=PhotoSwitchScan(); //掃描光電開關
//if(PS_value)DutyNume=SteeringList[PS_value]; //占空比分子 加1,即舵機轉角加4.5°,到180°後,再加歸零
DutyNume=SteeringList[PhotoSwitchScan()];
}
void main() //主函數
{
TimerInit(); //調用 定時器初始化 函數
while(1) //循環系統
{
PhotoSwitchResp(); //調用 光電開關響應 函數
}
}
⑨ 52單片機介面與舵機控製程序
可以用任意一個IO引腳和舵機連接,程序上,用兩個定時器,定時器1定時20ms,中斷時讓IO管腳輸出高電平,並啟動定時器2,定時器2定時1.5至2.5ms,對應舵機的角度,中斷時讓該管腳輸出低電平,並關閉自身。改變定時器2的定時時間,即改變了舵機的轉角。
⑩ 如何用單片機控制舵機及程序詳細
//雙定時器產生PWM波,控制舵機
//定時器0負責置高電平和控制定時器1的開停,定時器1負責置低電平
#include<STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P3^7;
uint b=1500;//1.5ms 舵機0位
void Delay1ms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main()
{
b=1500;
TMOD=0X11;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TH1=(65536-b)/256;
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
P1M0=0X0F; //P1低4位推挽輸出 接L298N直流電機驅動模塊 帶動後輪兩個電機
P1M1=0X00;
while(1)
{
P1=0x0a; //低4位 1010 正轉
b=1500;Delay1ms(2000);//直行
b=1000;Delay1ms(1000);//左轉
b=1500;Delay1ms(2000);//直行
b=2000;Delay1ms(1000);//右轉
b=1500;Delay1ms(2000);//直行
P1=0x05; //低4位 0101 反轉
b=1500;Delay1ms(2000);//後退
b=1000;Delay1ms(1000);//後左轉
b=1500;Delay1ms(2000);//後退
b=2000;Delay1ms(1000);//後右轉
b=1500;Delay1ms(2000);//後退
}
}
void timer0()interrupt 1//定時器0定時20ms
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void timer1()interrupt 3//定時器1定時1到2ms
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}