51单片机超高精度6路舵机控制程序_第1页
51单片机超高精度6路舵机控制程序_第2页
51单片机超高精度6路舵机控制程序_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、51单片机超高精度 6 路舵机控制程序#include <reg52.h> / 包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned intP0M1=0X00;P0M0=0XFF;/ 设置 P0 为强推挽输出sbit servo0=P0A0;sbit servo 仁卩0人1;sbit servo2=P0A2;sbit servo3=P0A3;sbit servo4=P0A4;sbit servo5=P0A5;sbit servo6=P0A6;sbit servo7=P0A7;uchar serVal2;uint p

2、wm=1382,1382,1382,1382,1382,1382,1382,1382; / 初始 90度,(实际是 1 382.4,取整 得 1382 )uchar pwm_flag=0;uint code ms0_5Con=461; /0.5ms 计数 (实际是 460.8,取整得 461)uint code ms2_5Con=2304; /2.5ms 计数/* 功能 : 串口初始化,晶振 11.0592,波特率 9600,使能了串口中断 */ void Com_Init()TMOD |= 0x20; /用定时器设置串口波特率TH1=0xFD; /(32*12*9600)=253 (FD)T

3、L1=0xFD;/ 同上TR1=1;定时器1开关打开REN=1;/开启允许串行接收位SM0=0;串口方式,8位数据SM1=1; 同上EA=1;/开启总中断ES=1;/串行口中断允许位 /* 功能 : 舵机 PWM 中断初始化 */void Timer0Init()0 度=0.5ms, 45 度=1ms, 90 度=1.5ms, 135 度=2ms, 180 度=2.5ms2.5 ms 初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)TMOD |= 0x01; /使用模式 1 , 1 6位定时器,使用

4、"|"符号可以在使用多个定时器时不受影 响TH0=-ms2_5Con>>8;/给定初值, 17ms 中断TL0=-ms2_5Con;EA=1;/总中断打开ET0=1;/定时器 0中断打开TR0=1;/定时器 0开关打开/* 功能 : 舵机 PWM 中断 , /舵机控制函数 周期为 20ms 一个循环 20MS = 8*2.5ms */void SteeringGear() interrupt 1switch(pwm_flag)case 1: servo0=1; TH0=-pwm0>>8; TL0=-pwm0; break;case 2: servo0

5、=0; TH0=-(ms2_5Con-pwm0)>>8; TL0=-(ms2_5Con-pwm0); break; case 3: servo1=1; TH0=-pwm1>>8; TL0=-pwm1; break;case 4: servo1=0; TH0=-(ms2_5Con-pwm1)>>8; TL0=-(ms2_5Con-pwm1); break;case 5: servo2=1; TH0=-pwm2>>8; TL0=-pwm2; break;case 6: servo2=0; TH0=-(ms2_5Con-pwm2)>>8;

6、TL0=-(ms2_5Con-pwm2); break; case 7: servo3=1; TH0=-pwm3>>8; TL0=-pwm3; break;case 8: servo3=0; TH0=-(ms2_5Con-pwm3)>>8; TL0=-(ms2_5Con-pwm3); break; case 9: servo4=1; TH0=-pwm4>>8; TL0=-pwm4; break;case 10: servo4=0; TH0=-(ms2_5Con-pwm4)>>8; TL0=-(ms2_5Con-pwm4); break; case

7、 11: servo5=1; TH0=-pwm5>>8; TL0=-pwm5; break;case 12: servo5=0; TH0=-(ms2_5Con-pwm5)>>8; TL0=-(ms2_5Con-pwm5); break; case 13: servo6=1;TH0=-pwm6>>8; TL0=-pwm6; break;case 14: servo6=0;TH0=-(ms2_5Con-pwm6)>>8; TL0=-(ms2_5Con-pwm6); break; case 15: servo7=1;TH0=-pwm7>>8

8、;TL0=-pwm7; break;case 16: servo7=0;TH0=-(ms2_5Con-pwm7)>>8; TL0=-(ms2_5Con-pwm7); break; default: TH0=0xff; TL0=0x80; pwm_flag=0;pwm_flag+;void SetSteeringGear(uchar i, uchar val)uint a = (val+46)*10;if(a<ms0_5Con)a=ms0_5Con;if(a>ms2_5Con)a=ms2_5Con;pwmi=a;serVal0=255; / 清除缓存void Steeri

9、ngGearUp(uchar i)if(pwmi>ms0_5Con) pwmi=pwmi-10;void SteeringGearDown(uchar i)if(pwmi<ms2_5Con)pwmi=pwmi+10;/* 功能 : 串口中断接收数据* void ser() interrupt 4serVal0=serVal1;serVal1=SBUF;RI=0;/ 串口中断清 0/* 函数功能 : 主函数*/void main()bit started=0; / 路由是否已经启动完毕Com_Init();/ 串口初始化Timer0Init();/ 舵机初始化while(1) if(

10、serVal0='w' && serVal1='d') started=1; /路由启动最后会出现: ar71xx-wdt ,由此判断路由已经启动 if(started)if(serVal0=0)switch(serVal1)case 'A': SteeringGearUp(0); break;case 'B': SteeringGearDown(0); break;case 'C': SteeringGearUp(1); break;case 'D': SteeringGearDo

11、wn(1); break;case 'E': SteeringGearUp(2); break;case 'F': SteeringGearDown(2); break;case 'G': SteeringGearUp(3); break;case 'H': SteeringGearDown(3); break;case 'I': SteeringGearUp(4); break;case 'J': SteeringGearDown(4); break;case 'K': SteeringGearUp(5); break;case 'L': SteeringGearDown(5); break; default:break;serVal0=255; / 清除缓存else if(serVal0=1) SetSteeringGear(0,serVal1);else if(serVal0=2) SetSteeringGear(1,serVal1);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论