Futaba S3010舵机测试程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#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--);
}