Futaba - S3010舵机测试程序51

更新时间:2023-12-07 20:53:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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)%6; //1.5ms 的高电平 TH1=(65536-46300)/256;

TL1=(65536-46300)%6; //设定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)%6; }

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

TH0=(65535-1500)/256; TL0=(65535-1500)%6; }

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)%6; }

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

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

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

tH=t/100; tM=t/10-tH*10; tL=t; 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--); }

本文来源:https://www.bwwdw.com/article/146t.html

Top