资讯详情

舵机速度控制的51单片机程序

本程序中用到的头文件12c5a.h下载: http://www.51hei.com/f/12c5a.rar #include <12c5a.H> //C12C5A系列单片机 #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; } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台