本程序中用到的頭文件12c5a.h下載: http://www.zg4o1577.cn/f/12c5a.rar
#include <12c5a.H> //STC12C5A系列單片機
#include"intrins.h"
void delay(uint16 time); //軟件延時函數
void Timer_init(); //定時器初始化函數
void Timer0(uint32 us); //定時器0定時函數
void qhuan(unsigned int ms50,char zushu);
char n,a=101;
int LK[8]={0},*K;
int shuju[8][8]=
{ //舵機動作數據
{2500,2500,2500,2500,2500,2500,2500,2500},
{500,500,500,500,500,500,500,500},
{2500,2500,2500,2500,2500,2500,2500,2500},
{500,500,500,500,500,500,500,500},
{2500,2500,2500,2500,2500,2500,2500,2500},
{500,500,500,500,500,500,500,500},
{2500,2500,2500,2500,2500,2500,2500,2500},
{500,500,500,500,500,500,500,500},
};
int *PWMM,pwm[8]; //PWMM用以尋址動作數據的指針,LP接收信息時用以指向數據緩存
unsigned int thesea;
sbit pwm8=P0^5;
sbit pwm7=P0^6;
sbit pwm6=P0^7;
sbit pwm5=P4^6;
sbit pwm4=P4^1;
sbit pwm3=P4^5;
sbit pwm2=P4^4;
sbit pwm1=P2^7;
void main(void)
{
uint8 i=0;
P0M1=0; //設置P口為強推免輸出模式,下同
P0M0=0XFF;
P1M1=0;
P1M0=0XFF;
P2M1=0;
P2M0=0XFF;
P3M1=0;
P3M0=0XFF;
Timer_init(); //定時器初始化
Timer0(31); //通過一個定時值進入定時循環
K=LK;
PWMM=shuju[0];
delay(100);
while(1)
{
;
}
}
void delay(uint16 time)
{
uint16 i;
uint16 j;
for(i=0;i<1000;i++)
for(j=0;j<time;j++);
}
void Timer_init()
{
EA=1; //開總中斷
AUXR|=0xC0; //T0,T1工作在1T
TMOD|= 0x11; //T0工作在方式1,16位
ET0 = 1; //開定時器0中斷
ET1 = 1;
TR0=1;
TR1=0;
}
void Timer0(uint32 us)
{
uint32 valu;
valu=us*11; //工作在1T,最大定時時間0xffff/11us
valu=valu;
valu=0xffff-valu; //
TH0=valu>>8;
TL0=valu;
}
/************************************************************************************************/
void qhuan(unsigned int ms50,char zushu) //控速算法
{
char i;
if(thesea>=ms50&a>100) //檢驗定時和舵機是否到達指定時間和位置,到達更新
{
n++;
if(n<zushu)
PWMM=shuju[n];
else
PWMM=shuju[0];
for(i=0;i<8;i++)
{
if(n<(zushu))
*(K+i)=(shuju[n][i]-shuju[n-1][i])/100;
else
*(K+i)=(shuju[0][i]-shuju[zushu-1][i])/100;
}
if(n>=zushu)
n=0;
thesea=0;
a=0;
}
}
void T0zd(void) interrupt 1
{
static uint8 i=0,irm=0;
++i;
++irm;
qhuan(640,4);
if((a<=100)&(irm>=64))
{
a+=10; //自加在40就已經是舵機不控速的最快速度了
irm=0;
}
thesea++;
switch(i)
{
case 1:
{
pwm1=1;
Timer0(*(PWMM)-*(K)*(100-a)); //定時
} return;
case 2:
{
pwm1=0; //pwm1變低
Timer0(2500-*(PWMM)+*(K)*(100-a));// 定時
} return;
case 3:
{
pwm2=1; //pwm2變高
Timer0(*(PWMM+1)-*(K+1)*(100-a));// 定時時常為pwm[2]
} return;
case 4:
{
pwm2=0; //pwm2變低
Timer0(2500-*(PWMM+1)+*(K+1)*(100-a));// 定時時常為pwm[2]
} return;
case 5:
{
pwm3=1; //pwm3變高
Timer0(*(PWMM+2)-*(K+2)*(100-a));// 定時時常為pwm[3]
} return;
case 6:
{
pwm3=0; //pwm3變低
Timer0(2500-*(PWMM+2)+*(K+2)*(100-a));// 定時
} return;
case 7:
{
pwm4=1; //pwm4變高
Timer0(*(PWMM+3)-*(K+3)*(100-a));// 定時
} return;
case 8:
{
pwm4=0; //pwm4變低
Timer0(2500-*(PWMM+3)+*(K+3)*(100-a));// 定時
} return;
case 9:
{
pwm5=1; //pwm5變高
Timer0(*(PWMM+4)-*(K+4)*(100-a));// 定時
} return;
case 10:
{
pwm5=0; //pwm5變低
Timer0(2500-*(PWMM+4)+*(K+4)*(100-a));// 定時
} return;
case 11:
{
pwm6=1; //pwm6變高
Timer0(*(PWMM+5)-*(K+5)*(100-a));// 定時
} return;
case 12:
{
pwm6=0; //pwm6變低
Timer0(2500-*(PWMM+5)+*(K+5)*(100-a));// 定時
} return;
case 13:
{
pwm7=1; //pwm7變高
Timer0(*(PWMM+6)-*(K+6)*(100-a));// 定時
} return;
case 14:
{
pwm7=0; //pwm7變低
Timer0(2500-*(PWMM+6)+*(K+6)*(100-a));// 定時
} return;
case 15:
{
pwm8=1; //pwm8變高
Timer0(*(PWMM+7)-*(K+7)*(100-a));// 定時
} return;
case 16:
{
pwm8=0; //pwm8變低
Timer0(2500-*(PWMM+7)+*(K+7)*(100-a));// 定時
i=0;
} return;
default:return;
}
}