好像你的程序是一個固定的PWM啊,這不對嘛。
舵機是針對不同的PWM轉到對應的角度,你的程序只有一個PWM,則轉動到相應位置,就不會動了。
我有個試驗程序,你可以看看,參考一下。#include<reg51.h>
#define GPIO_KEY P1//矩陣鍵盤
sbit DJ=P2^7;//SG90舵機的數據口
unsigned char KeyValue,GT,DT;
bit KeyState;
void KeyDown();
void DJZD (void);
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for(c;c>0;c--)
{
for(b=44;b>0;b--)
{
for (a=112;a>0;a--)
{
}
}
}
}
void main(void)//主函數
{
KeyState=0;
GT=30;DT=350;DJ=1;
Delay10ms(1);
DJ=0;
while (1)//主循環
{
KeyDown();
if(KeyState==1)
{
switch (KeyValue)
{
case (0):GT=10;DT=390;DJZD ();break;//轉動到0度
case (2):GT=20;DT=380;DJZD ();break;//轉動到45度
case (4):GT=30;DT=370;DJZD ();break;//轉動到90度
case (6):GT=40;DT=360;DJZD ();break;//轉動到135度
case (8):GT=50;DT=350;DJZD ();break;//轉動到180度
}
KeyState=0;
}
}
}
void DJZD (void)
{
unsigned char i;
for (i=0;i<75;i++)
{
DJ=1;
Delay50us(GT);
DJ=0;
Delay50us(DT);
}
DJ=0;
}
void KeyDown(void)
{
unsigned char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
Delay10ms(1);
if(GPIO_KEY!=0x0f)
{
KeyState=1;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_KEY=0Xf0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
for (a=0;(a<25)&&(GPIO_KEY!=0xf0);a++)
{
Delay10ms(1);
}
}
}
}
|