//制作:猴子
//制作思路:舵机周期为20ms,控制范围在0.5-2.5ms内,一路输出高电平时段,其它所有输出低电平,一路一路轮流切换,最多控制8路,可以随意调节。
小弟菜鸟,刚接触c语言, 有不足之处,请多多指教。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ZQ 20000
uint PWM_S[3];
uint PWM_DD;
uchar BC,RXS; // 路标,第几路PWM、接收数据存储器
sbit PWM_0=P1^0;
sbit PWM_1=P1^1;
sbit PWM_2=P1^2;
void tt0()
{TMOD=0x01;
TH0=(65536-PWM_S[2])/256;
TL0=(65536-PWM_S[2])%256;
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1;//启动定时器0
EX0= 1;
PT0=1; //定时器0 设置为最高优先中断
PX0=0; // 外部中断0 设置最低中断
}
void timer0(void) interrupt 1
{
switch(BC)
{
case 1WM_0=0;
PWM_2=1;
PWM_DD=PWM_DD+PWM_S[0] ;
TH0=-(65536-PWM_S[0])/256; //第一路 输出低电平时长
TL0=-(65536-PWM_S[0])%256;
break;
case 2WM_2=0;
PWM_1=1;
PWM_DD=PWM_DD+PWM_S[1] ;
TH0=-(65536-PWM_S[1])/256; //第二路 输出低电平时长
TL0=-(65536-PWM_S[1])%256;
break;
case 3WM_1=0;
PWM_0=1;
PWM_DD=PWM_DD+PWM_S[2] ;
TH0=-(65536-PWM_S[2])/256; //第三路 输出低电平时长
TL0=-(65536-PWM_S[2])%256;
break;
case 4: PWM_2=0;
PWM_1=0;
PWM_0=0;
TH0=-(65536-ZQ+PWM_DD)/256;
TL0=-(65536-ZQ+PWM_DD)%256;
PWM_DD=0;
BC=0;
break;
}
BC++;
}
void WBZD0(void) interrupt 0 //有接收信号中断
{
RXS=P2 ;
}
void KEY() //处理控制信号
{
switch(RXS)
{
case 1:
PWM_S[0] ++;
break;
case 2:
PWM_S[0] --;
break;
}
}
void main(void)
{
PWM_S[0]=100;
PWM_S[1]=100;
PWM_S[2]=1500;
tt0();
while(1)
{
if(RXS!=0) // 判断有无接收
{
KEY();
}
}
}
|