單片機(jī)控制 舵機(jī) 參考程序
#include
sbit duoji1=P3^2;//PWM輸出口1
sbit duoji2=P2^4;//PWM輸出口2
sbit duoji3=P2^5;//PWM輸出口3
intt,xinhao[3],flag;//xinhao[3]是上位機(jī)傳來(lái)的三個(gè)控制信號(hào)
void main()
{
EA=1;
flag=0;
for(t=0;t<3;t++)
xinhao[t]=15;//初始化控制信號(hào)
t=0;
TMOD=0x21;//設(shè)置定時(shí)器1的工作方式為3,用于產(chǎn)生波特率, //接收串口的數(shù)據(jù),設(shè)置定時(shí)器0的工作方式為1, //用于控制舵機(jī)的PWM波輸出
TH1=0xfd;//設(shè)置串口波特率為9600
TL1=0xfd;
TR1=1;
ES=1;
REN=1;
SM0=0;
SM1=1;
PCON=0x00;
TH0=(65536-40)/256;//定時(shí)器0每40微妙產(chǎn)生一次中斷,注意: //中斷產(chǎn)生的頻率越高,單片機(jī)運(yùn)行速度也//會(huì)越慢,但控制信號(hào)寬度會(huì)變寬,控制也//越精準(zhǔn),需要各位自己權(quán)衡
TL0=(65536-40)%256;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1//PWM波輸出控制
{
TH0=(65536-40)/256;
TL0=(65536-40)%256;
t++;
if(t==xinhao[0])
duoji1=0;
if(t==xinhao[1])
duoji2=0;
if(t==xinhao[2])
duoji3=0;
if(t==500)//
{
t=0;
duoji1=1;
duoji2=1;
duoji3=1;
}
}
void serial() interrupt 4//接收上位機(jī)的控制數(shù)據(jù)
{
if(flag==0)
{
xinhao[0]=SBUF;
flag=1;
RI=0;
}
else if(flag==1)
{
xinhao[1]=SBUF;
flag=2;
RI=0;
}
else if(flag==2)
{
xinhao[2]=SBUF;
flag=0;
RI=0;
}
}
評(píng)論