1、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 /宏定义#def
2、ine uchar unsigned char /宏定义sbit P1_0=P10; /PWM 信号输出端 sbit dula=P26;sbit wela=P27; /由于没有板子的原理图,暂时将段选,位选设置为 P26,P27uint t; /时间变量uchar temp=0; /定时器的溢出次数,定时 50msunsigned 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 ,
3、a,b,c,d,e,f/*主函数*/void main() void display(uint ); /数码管显示函数void delay(uint z); /延时子函数P1_0=1; /置 PWM 初始输出为高电平TMOD=0x11; /设置定时器 0,1 为工作方式 1TH0=(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; /开外部中断
4、 0EX1=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.5msTH0=(65535-1500)/256;TL0=(65535-1500)%256;P1_0=P1_0;void in
5、t0() interrupt 0 /外部中断 0 接反相器TR1=1; /启动定时器 1void int1() interrupt 2 /外部中断 1 接反相器TR1=0; /停止定时器 1TH1=TH1-0x4B;TL1=TL1-0x24; t=TH1*256+TL1;t=t/926; /精确到 1 mst=t+50*temp;display(t); /用数码管显示数字(16 进制) void timer1() interrupt 3 /定时器 1 溢出中断temp=temp+;TH1=(65536-46300)/256;TL1=(65536-46300)%256;/*数码管显示函数*/vo
6、id 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=tabletL;dula=0;delay(5);wela=1;P0=0xfe; wela=0; /锁存 dula=1;P0=tabletH;dula=0;delay(5);wela=1;P0=0xfd; /位选,选中两个数码管wela=0; /锁存dula=1;P0=tabletM;dula=0;delay(5);wela=1;P0=0xfb; /位选,选中两个数码管wela=0; /锁存 /*延时函数*/ void delay(uint z) /延时uint x,y;for(x=z;x0;x-)for(y=100;y0;y-);