Futaba S3010舵机测试程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Futaba S3010舵机测试程序

说明:本程序是为了第四届FREESCALE智能车大赛,舵机测试时使用的程序,基于51单片机实验版。利用C语言完成,仅供参考,欢迎批评意见,转载请注明出处。

/********************************************************************

* 舵机测试程序

* SST89E58/SST89E516 Experimental BOARD

* Copyright(C) 2009, Shulin Liu, HUST

* All rights reserved.

* For Freescale Smartcar Match

********************************************************************/

#include //51单片机头文件

#define uint unsigned int //宏定义

#define uchar unsigned char //宏定义

sbit P1_0=P1^0; //PWM信号输出端

sbit dula=P2^6;

sbit wela=P2^7; //由于没有板子的原理图,暂时将段选,位选设置为P2^6,P2^7

uint t; //时间变量

uchar temp=0; //定时器的溢出次数,定时50ms

unsigned char code table[]=

{0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71}; //数码管编码表

//分别为0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f

/****************************主函数***********************************/

void main()

{

void display(uint ); //数码管显示函数

void delay(uint z); //延时子函数

P1_0=1; //置PWM初始输出为高电平

TMOD=0x11; //设置定时器0,1为工作方式1

TH0=(65536-1500)/256;

TL0=(65536-1500)%256; //1.5ms 的高电平

TH1=(65536-46300)/256;

TL1=(65536-46300)%256; //设定T1的计时周期为50ms

//IT0=0, IT1=0 默认电平触发方式

EA=1; //开总中断

EX0=1; //开外部中断0

EX1=1; //开外部中断1

ET0=1; //开定时器0中断

ET1=1;//开启定时器1中断

TR0=1; //启动定时器0

while(1);

}

/******************************中断服务程序**********************************/ void pwm0() interrupt 1 //定时器0 中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为18.5ms

{

TH0=(65536-18500)/256;

TL0=(65536-18500)%256;

}

else //如果上个电平为0,则下个高电平为1.5ms

{

TH0=(65535-1500)/256;

TL0=(65535-1500)%256;

}

P1_0=~P1_0;

}

void int0() interrupt 0 //外部中断0 接反相器

{

TR1=1; //启动定时器1

}

void int1() interrupt 2 //外部中断1 接反相器

{

TR1=0; //停止定时器1

TH1=TH1-0x4B;

TL1=TL1-0x24;

t=TH1*256+TL1;

t=t/926; //精确到1 ms

t=t+50*temp;

display(t); //用数码管显示数字(16进制)

}

void timer1() interrupt 3 //定时器1 溢出中断

{

temp=temp++;

TH1=(65536-46300)/256;

TL1=(65536-46300)%256;

}

/*****************************数码管显示函数*******************************/

void display(uint t) //实现数码管的动态扫描显示

{

uchar tH,tL,tM; //t的高位和低位,板子上有2个数码管,输出两位16进制数tH=t/100;

tM=t/10-tH*10;

tL=t%10;

while(1)

{

dula=1;

P0=table[tL];

dula=0;

delay(5);

wela=1;

P0=0xfe;

wela=0; //锁存

dula=1;

P0=table[tH];

dula=0;

delay(5);

wela=1;

P0=0xfd; //位选,选中两个数码管

wela=0; //锁存

dula=1;

P0=table[tM];

dula=0;

delay(5);

wela=1;

P0=0xfb; //位选,选中两个数码管

wela=0; //锁存

}

}

/****************************延时函数*****************************************/ void delay(uint z) //延时

{

uint x,y;

for(x=z;x>0;x--)

for(y=100;y>0;y--);

}

相关文档
最新文档