舵机控制八路伺服电机.doc
文本预览下载声明
控制八路伺服电机。J6,J7,J8,J10,J11,J12插座为1~6路,P1.3,P1.4为7~8路。注意:伺服电机数据线是I/O-VCC-GNDChip type : AT89S52 Clock frequency : 24MHz *//********************************************************************************/#include reg52.h#define delay_time 0xcbeb //定义延时常量sbit P2_3=P2^3;//以下常量对应的角度(n为负) n90 n45 0 45 90unsigned int loc_angle[5]={0x014d,0x029B,0x04e8,0x0535,0x0683};unsigned int delay_timel,delay_timeh; //低电平延时时间,高电平延时时间unsigned char pwm_number=0; //脉冲数unsigned char pwm_outword=1; //输出命令void delay_1ms() //1毫秒延时程序 {unsigned char j=0,i=8;do{while(--j) ; }while(--i);}void delay(unsigned char i) //毫秒级延时程序{while(i--)delay_1ms(); }void timer0(void) interrupt 1 //T0定时中断服务子程序{unsigned int temp; //临时变量if (pwm_outword!=0x10){temp=delay_timeh; //装入高电平延时值P1=0XFF;P2=0XFF; //输出控制命令pwm_outword=1; //控制命令左移一位}else {temp=delay_timel; //装入低电平延时值pwm_outword=1;P1=0; //输出低电平P2=0X0F;pwm_number++; //低电平输出完成,脉冲数++}TL0=(unsigned char)temp; //装入值temp=8;TH0=(unsigned char)temp;}void time0_init() //定时器初始化{TMOD=0x01; //设置成16位定时器TH0=0x44; //设置中断初值TL0=0x44;EA=1; //使能全局中断ET0=1; //使能T0中断TR0=1; //启动T0}void main(){unsigned char i_temp; //临时变量do{}while(P2_3); //声控for(i_temp=0;i_temp10;i_temp++) //开始时,灯闪烁10次{ P0=0; //灯亮delay(100); //延时0.2SP0=0xff; //灯灭delay(100); //延时0.2S}time0_init(); //定时器初始化while(1) //循环{for (i_temp=0;i_temp5;i_temp++) //5个位置依次切换{delay_timeh=0xffff-loc_angle[i_temp];delay_timel=delay_time+loc_angle[i_temp];while(pwm_number50);pwm_number=0;}} //while 结束}//main
SL-DIY08-52引脚功能分配
52pdi.jpg (56.17 KB) 被浏览 153 次
********************************************************************************/ORG 0000HLJMP mainORG 000BHLJMP time0ORG 0030Hpwm_outword EQU 0010H ;控制命令delay_timeh EQU 0012H ;高电平延时值delay_timel EQU 0014H ;低电平延时值pwm_number EQU 0016H ;脉冲数delay_100ms: ;100毫秒延时子程序MOV R2,#0C8H ;取延时外循环数200D2: MOV R1,#0FAH ;取延时内循环数250D1: DJNZ R1 ,D1 ;内循环,累减一,DJNZ R2, D2 ;外循环,累减一RETtime0: ;定时器0中断服务程序MOV
显示全部