求帮我写一个简单的51单片机控制舵机程序

芯片是STC 89C52RC 晶振是11.0592 端口是P1^6 帮忙写两个函数分别是向左向右转大约10度,主函数留给我自己写可以了,万分感激.
9g舵机 C语言程序

    下面是我之前写的程序51单片机写的和你的一样我的是12Mhz的,里面有很详细的注解。用什么不懂的问题,追问我。



////////////////////////////////////////////////////////////////////////////////////////////
//程序名称:小车循迹程序。
//程序目的:跟着黑线走。
//时    间:2013年10月
/////////////////////////////////////////////////////////////////////////////////////////////
 #include <reg52.h>
unsigned int int_time;   //用于记录 溢出的次数。
sbit PWM=P0^0;           //舵机的控制位。

sbit SS1=P2^0;              //前面的光感应定义 I/O 口
sbit SS2=P2^1;
sbit SS3=P2^2;
sbit SS4=P2^3;
sbit SS5=P2^4;

sbit M1_in1=P1^0;    //电机定义 I/O 口  M1右电机 M2左电机;
sbit M1_in2=P1^1;
sbit M2_in1=P1^2;
sbit M2_in2=P1^3;


/*
void delay(unsigned int  N)//延时程序:    实现(16*N+24)us 的延时,11.0592的条件下。N=1000 对应 20ms.
{
  int i;
  for(i=0;i<N;i++);
 
  
}
*/ 
void init() //初始化中断
{
    ////100微秒@12.000MHz 0x
TMOD = 0x02; //设置定时器模式
EA=1;
ET0=1;

TF0 =0; //清除TF0标志 
TL0 =236; //设置定时初值
TH0 =236; //设置定时重载值
TR0 = 1; //定时器0开始计时  
int_time=0;  

}
  
 void occupy(int all,int part)  //占用宽度,即调节脉宽PWM中高电平的时间占用

if(int_time>all)  //all表示一个周期所用int_time(中断一次的时间)的次数,  
int_time=0;
if(int_time<=part) //part表示一个周期类高电平时所用int_time的次数。
PWM=1;
else 
PWM=0;

     

   

main()   //主函数

    int s1=0,s2=0,s3=0,s4=0,s5=0;




init();  //初始化中断  ||(LED1==1&&LED2==1&&LED3==1&&LED4==1&&LED5==1  

while(1)
{    
  if(SS1==0&&SS2==0&&SS3==0&&SS4==0&&SS5==0)      // 当没有检测到黑线时,电机(M1 M2)停止工作。
{
 M1_in1=0;
     M1_in2=0;
     M2_in1=0;
     M2_in2=0;
 }   
       
  while(SS1==1||SS2==1||SS3==1||SS4==1||SS5==1)
   {
     M1_in1=1;
     M1_in2=0;
     M2_in1=0;
     M2_in2=1;
   
    while(SS1==0&&SS2==1&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS1检测到黑线。   
 {occupy(1000,60);}
    while(SS1==0&&SS2==0&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS1和SS2检测到黑线。   
 {occupy(1000,85);}  
while(SS1==1&&SS2==0&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS2检测到黑线。   
 {occupy(1000,80);}
    while(SS1==1&&SS2==0&&SS3==0&&SS4==1&&SS5==1) // 向左转弯时:SS2和SS3检测到黑线。   
 {occupy(1000,77);}
while(SS1==1&&SS2==1&&SS3==0&&SS4==1&&SS5==1) // 直线向前时:SS3检测到黑线。 8888888888888 
 {occupy(1000,75);}  
    while(SS1==1&&SS2==1&&SS3==0&&SS4==0&&SS5==1) // 向右转弯时:SS3和SS4 检测到黑线。     
 {occupy(1000,72);}
      while(SS1==1&&SS2==1&&SS3==1&&SS4==0&&SS5==1) // 向右转弯时:SS4检测到黑线。
     {occupy(1000,70);}  
    while(SS1==0&&SS2==0&&SS3==1&&SS4==0&&SS5==0) // 向左转弯时:SS4和SS5检测到黑线。   
 {occupy(1000,65);}
    while(SS1==1&&SS2==1&&SS3==1&&SS4==1&&SS5==0) // 向右转弯时:SS5检测到黑线。
     {occupy(1000,90);}  
    }       
    }




 
void ABC(void) interrupt 1               //进入中断一次,将计数量int_time加1。 
{
int_time++;
}  
  //  M2_in1=0;
// M2_in2=1;
// delay(1000);
//  M2_in1=0;
// M2_in2=0;
// delay(1000) ;

追问

我的晶振是11.0592

追答

这个没什么影响。晶振只代表工作的周期,只在定时器的时候有影响。其他都一样。你可以看看相关的单片机资料。这个的慢慢学,东西又多又杂。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-27
汇编还是C语音啊?追问

C语言程序