基本思路为pca用于产生50hz脉冲,两个定时器分别控制8个舵机
单片机源程序如下:
- #include"STC12C5A60S2.h" //@12Mhz
- #include<intrins.h>
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- u16 time;//PCA counts 20ms
- u8 pwm_turn[2]={0,0};
- u8 data1[8]={1500,1500,1500,1500,1500,1500,1500,1500};
- u8 data2[8]={1500,1500,1500,1500,1500,1500,1500,1500};
- void sys_init()
- {
- P0M0=0xff;
- P2M0=0xff;
-
- time=20000;
- CCON=0;
- CL=0;
- CH=0;
- CMOD=0x00;
- CCAP0L=time;
- CCAP0H=time>>8;
- CCAPM0=0x49;
- CR=1;
-
- TMOD|=0X11;
- TH0=0XFE;
- TL0=0X0C;
- TH1=0XFC;
- TL1=0X18;
- ET0=1;//打开定时器0中断允许
- ET1=1;//打开定时器1中断允许
-
- EA=1;
- }
- void main()
- {
- int j,k;
- for(j=0;j<100;j++)
- for(k=0;k<100;k++);
- sys_init();
- while(1);
- }
- void Timer0() interrupt 1
- {
- if(pwm_turn[0]>8)
- {
- pwm_turn[0]=0;
- TR0=0;
- P0=0;
- }
- else
- {
- pwm_turn[0]++;
- P0<<=1;
- }
- TH0=(65536-data1[pwm_turn[0]])>>8;
- TL0=(65536-data1[pwm_turn[0]])%256;
- }
- void Timer1() interrupt 3
- {
- if(pwm_turn[1]>8)
- {
- pwm_turn[1]=0;
- TR1=0;
- P2=0;
- }
- else
- {
- pwm_turn[1]++;
- P2<<=1;
- }
- TH1=(65536-data2[pwm_turn[1]])>>8;
- TL1=(65536-data2[pwm_turn[1]])%256;
- }
- void PCA() interrupt 7
- {
- CCF0=0;
- TR0=1;//打开定时器
- TR1=1;//打开定时器
- P0=0x01;
- P2=0x01;
- time+=20000;
- CCAP0L=time;
- CCAP0H=time>>8;
- }
复制代码
所有资料51hei提供下载:
Text1.rar
(673 Bytes, 下载次数: 15)
|