求帮我写一个简单的51单片机控制舵机程序 10
芯片是STC89C52RC晶振是11.0592端口是P1^6帮忙写两个函数分别是向左向右转大约10度,主函数留给我自己写可以了,万分感激.9g舵机C语言程序...
芯片是STC 89C52RC 晶振是11.0592 端口是P1^6 帮忙写两个函数分别是向左向右转大约10度,主函数留给我自己写可以了,万分感激.
9g舵机 C语言程序 展开
9g舵机 C语言程序 展开
2个回答
展开全部
下面是我之前写的程序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
追答
这个没什么影响。晶振只代表工作的周期,只在定时器的时候有影响。其他都一样。你可以看看相关的单片机资料。这个的慢慢学,东西又多又杂。
2014-01-27
展开全部
汇编还是C语音啊?
追问
C语言程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询