51单片机控制舵机程序精度,数量,占用时间优化方案及程序
- 格式:doc
- 大小:36.00 KB
- 文档页数:4
单片机控制舵机参考程序
51 单片机的资源都差不多,这里采用STC89C52 作为控制芯片,上位机的输出控制信号,利用串口接收控制舵机。
理论上,只用一个定时器就可以产生无限多路PWM波输出,但事实上,PWM输出越多,定时器中断里面操作的语句就越多,很繁杂,单片机的运行速度会变得很慢,以致于输出PWM波周期大于一般舵机的控制周期20ms,或者频率产生误差,导致舵机的颤抖。
所以,只利用一个定时器输出PWM有一定限制,路数不能太多,如果需要控制的舵机数量太多,建议更换带有PWM输出的单片机。
下面是单片机控制三路舵机的程序。
#include
sbit duoji1=P3 ;//PWM 输出口1
sbit duoji2=P2;//PWM输出口2
sbit duoji3=P2 ;//PWM 输出口3
intt,xinhao[3],flag;//xinhao[3]是上位机传来的三个控制信号
void main()
{
EA=1;
flag=0;
for(t=0;t xinhao[t]=15;//初始化控制信号
t=0;
TMOD=0x21;//设置定时器1 的工作方式为3,用于产生波特率,//接收串口的数据,设置定时器0 的工作方式为1,//用于控制舵机的PWM 波输出TH1=0xfd;//设置串口波特率为9600
TL1=0xfd;。
51 多路舵机控制多路舵机控制技术研究摘要:多路舵机控制技术在机器人控制、航空模型飞行控制等领域得到了广泛应用。
本文主要研究了多路舵机控制技术的原理和应用,主要包括舵机控制器设计、舵机的动力学建模和控制算法的设计。
研究结果表明,多路舵机控制技术具有较好的控制精度和可靠性,为机器人及其他相关领域的控制系统设计提供了有效的方法。
第一章引言近年来,随着机器人技术和自动控制技术的快速发展,多路舵机控制技术在机器人控制、航空模型飞行控制等领域得到了广泛应用。
多路舵机控制技术能够实现对多个舵机的精确控制,为机器人的运动、姿态调整等提供了重要支持。
本章主要介绍了多路舵机控制技术的研究背景、意义和国内外研究现状,并对本文的研究内容做了简要描述。
第二章多路舵机控制器设计多路舵机控制器是实现对多个舵机的精确控制的重要装置。
本章首先介绍了多路舵机控制器的工作原理和结构,然后详细分析了多路舵机控制器的设计要点,包括硬件设计和软件设计。
其中,硬件设计主要包括电路设计和舵机接口设计,软件设计主要包括控制算法的实现和舵机控制命令的生成。
最后介绍了一种基于ARM处理器的多路舵机控制器设计方案。
第三章舵机的动力学建模舵机的动力学建模是实现对舵机的精确控制的基础。
本章主要介绍了舵机的动力学建模方法,包括基于力学方程的建模方法和基于系统辨识的建模方法。
其中,基于力学方程的建模方法主要是通过对舵机的结构和工作原理进行理论分析,得到舵机的数学模型;基于系统辨识的建模方法主要是通过实验数据对舵机进行辨识,得到舵机的数学模型。
最后对比分析了两种方法的优缺点,并提出了一种综合利用两种方法的舵机动力学建模方法。
第四章多路舵机控制算法设计多路舵机控制算法设计是实现对多个舵机的精确控制的核心内容。
本章首先介绍了多路舵机控制的目标和要求,然后详细分析了多路舵机控制算法设计的关键问题,包括舵机之间的互斥控制、舵机的同步控制、舵机控制输入的平滑过渡等。
在此基础上,提出了一种基于PID控制算法的多路舵机控制算法设计方案,并进行了仿真实验。
51单片机舵机控制程序题目:基于51单片机的舵机控制程序设计与实现第一章:引言1.1 研究背景51单片机是一种广泛应用于嵌入式系统中的微控制器,具有成本低、功耗低、可靠性高等优点。
而舵机是一种能够控制角度的电机装置,广泛应用于机器人、航模和自动化设备等领域。
本章旨在探讨基于51单片机的舵机控制程序设计与实现的意义和必要性。
1.2 研究目的本研究的主要目的在于设计并实现一套稳定、高效的舵机控制程序,为使用51单片机的嵌入式系统提供角度控制功能。
通过本研究,可以提高舵机控制的精度和稳定性,拓展舵机的应用领域。
第二章:51单片机舵机控制程序的设计2.1 硬件设计根据舵机的控制特点,我们需要通过PWM信号控制舵机转动的角度。
在硬件设计上,我们需要使用51单片机的定时器功能产生PWM信号,并通过IO口输出给舵机。
具体的设计方案包括选择合适的定时器、设置定时器的工作模式和频率等。
2.2 软件设计在软件设计上,我们需要通过编写51单片机的控制程序实现舵机的控制。
具体的设计流程包括:(1)初始化:设置定时器的工作模式和频率,配置IO口的输出模式。
(2)角度控制:根据舵机的角度范围和控制精度,将目标角度转换为占空比,并通过PWM信号控制舵机转动到目标角度。
(3)稳定性优化:通过对定时器周期和占空比的调整,优化舵机的稳定性,减小舵机的误差。
第三章:51单片机舵机控制程序的实现3.1 硬件搭建在实现阶段,我们需要根据硬件设计方案选购相应的硬件元件,并将其搭建成一个完整的舵机控制系统。
具体的搭建过程包括:(1)选购舵机和51单片机等硬件元件,并连接相关的信号线。
(2)按照硬件设计方案,搭建并调试舵机控制系统。
3.2 软件编写在软件实现阶段,我们需要使用51单片机的编程语言(如C语言或汇编语言)编写舵机控制程序,并通过编译和烧录等步骤将程序下载到51单片机中。
具体的编写过程包括:(1)按照软件设计方案,编写舵机控制程序的相关函数和逻辑。
基于51单片机的舵机控制2010-05-2319:48基于单片机的舵机控制方法具有简单、精度高、成本低、体积小的特点,并可根据不同的舵机数量加以灵活应用在机器人机电控制系统中,舵机控制效果是性能的重要影响因素・舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统•其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压・它内部有一个基准电路,产生周期为20m6宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出口最后,电压差的正负输出到电机驱动芯片决定电机的正反转・当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动*舵机的控制信号是PWM1号,利用占空比的变化改变舵机的位置・一般舵机的控制要求如图1所示力腌8脉维=2ins图1舵机的控制要求单片机实现舵机转角控制可以使用FPGA模拟电路、单片机来产生舵机的控制信号,但FPG腋本高且电路复杂・对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用口5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV所以滤波电路的精度难以达到舵机的控制精度要求也可以用单片机作为舵机的控制单元,使PWM&号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度・单片机完成控制算法,再将计算结果转化为PWM1号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PW惆期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM1号的输出,并且调整占空比・当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断“这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高具体的设计过程:例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为20ms-2ms=18ms所以开始时在控制口发送高电平,然后设置定时器在2ms后发生中断,中断发生后,在中断程序里将控制口改为低电平,并将中断时间改为18ms 再过18ms进入下一次定时中断,再将控制口改为高电平,并将定时器初值改为2m§等待下次中断到来,如此往复实现PWM1号输出到舵机・用修改定时器中断初值的方法巧妙形成了脉冲信号,调整时间段的宽度便可使伺服机灵活运动为保证软件在定时中断里采集其他信号,并且使发生PWM1号的程序不影响中断程序的运行(如果这些程序所占用时间过长,有可能会发生中断程序还未结束,下次中断又到来的后果),所以需要将采集信号的函数放在长定时中断过程中执行,也就是说每经过两次中断执行一次这些程序,执行的周期还是20ms软件流程如图2所示*开足附中断改变定时时间中断程序(中断返图2产生PWMf号的软件流程如果系统中需要控制几个舵机的准确转动,可以用单片机和计数器进行脉冲计数产生PWM1号脉冲计数可以利用51单片机的内部计数器来实现,但是从软件系统的稳定性和程序结构的合适性看,宜使用外部的计数器,还可以提高CPU勺工作效率・实验后从精度上考虑,对于FUTAB麻列的接收机,当采用1MHz勺外部晶振时,其控制电压幅值的变化为0.6mV,而且不会出现误差积累,可以满足控制舵机的要求•最后考虑数字系统的离散误差,经估算误差的范围在±0.3%内,所以采用单片机和8253、8254这样的计数器芯片的PWM1号产生电路是可靠的•图3是硬件连接图图3PWA信号的计数和输出电路(点击放大)基于8253产生PWM1号的程序主要包括三方面内容:一是定义8253寄存器的地址,二是控制字的写入,三是数据的写入•软件流程如图4所示,具体代码如下・//关键程序及注释://定时器T0中断,向8253发送控制字和数据voidT0Int()interrupt1(TH0=0xB1;TL0=0xE0;//20ms的时钟基准//先写入控制字,再写入计数值SERVO0=0x30;//选择计数器0,写入控制字PWM0=BUF0L;〃先写低,后写高PWM0=BUF0H;SERVO1=0x70;//选择计数器1,写入控制字PWM1=BUF1L;PWM1=BUF1H;SERVO2=0xB0;//选择计数器2,写入控制字PWM2=BUF2L;PWM2=BUF2H;}定义8253寄存器地址图4基于8253产生PWAS号的软件流程当系统的主要工作任务就是控制多舵机的工作,并且使用的舵机工作周期均为20ms时,要求硬件产生的多路PW械的周期也相同・使用51单片机的内部定时器产生脉冲计数,一般工作正脉冲宽度小于周期的1/8,这样可以在1个周期内分时启动各路PW瞰的上升沿,再利J用定时器中断T0确定各路PW瞰的输出宽度,定时器中断T1控制20ms的基准时间<■第1次定时器中断T0按20ms的1/8设置初值,并设置输出I/O口,第1次T0定时中断响应后,将当前输出I/O口对应的引脚输出置高电平,设置该路输出正脉冲宽度,并启动第2次定时器中断,输出I/O口指向下一个输出口•第2次定时器定时时间结束后,将当前输出引脚置低电平,设置此中断周期为20ms的1/8减去正脉冲的时间,此路PWM言号在该周期中输出完毕,往复输出•在每次循环的第16次(2X8=16)中断实行关定时中断T0的操作,最后就可以实现8路舵机控制信号的输出也可以采用外部计数器进行多路舵机的控制,但是因为常见的8253、8254芯片都只有3个计数器,所以当系统需要产生多路PWM1号时,使用上述方法可以减少电路,降低成本,也可以达到较高的精度•调试时注意到由于程序中脉冲宽度的调整是靠调整定时器的初值,中断程序也被分成了8个状态周期,并且需要严格的周期循环,而且运行其他中断程序代码的时间需要严格把握在实际应用中,采用51单片机简单方便地实现了舵机控制需要的PWMF号・对机器人舵机控制的测试表明,舵机控制系统工作稳定,PWM■空比(0.5〜2.5ms的正脉冲宽度)和舵机的转角(-90°〜90°)线性度较好.。
51控制舵机第一章:引言舵机是一种常用于控制机械系统运动的重要设备。
它具有反馈控制功能,能够根据输入信号调整输出角度,实现精准控制。
在机械自动化、航空航天、机器人等领域中广泛应用。
然而,舵机的控制方法和技术一直是研究的焦点之一。
本论文将介绍一种基于51单片机控制舵机的方法,并对其性能进行评估。
第二章:舵机控制原理2.1 舵机概述舵机通常由电机、减速器、位置传感器和控制电路组成。
其中,控制电路是关键部分,负责接收输入信号并控制电机旋转到特定位置。
2.2 舵机控制信号舵机控制信号一般为PWM信号,通过改变PWM信号的占空比来控制舵机的角度。
占空比代表信号中高电平的时间与一个周期的比例。
2.3 舵机控制原理舵机的工作原理是在电机内设置一个反馈机构,并通过位置传感器获取实际位置。
然后,将实际位置与期望位置进行比较,通过控制电路调整电机旋转方向和速度,最终使舵机旋转到期望位置。
第三章:基于51单片机的舵机控制系统设计3.1 硬件设计本文选用51单片机作为控制器,通过数字输出口产生PWM信号,并通过连接在数字输出口上的驱动电路控制舵机。
同时,采用位置传感器获取舵机的实际位置。
3.2 软件设计在软件设计中,使用C语言编程,通过对定时器的设置,产生PWM信号,并通过编写相应的算法实现舵机的控制。
同时,通过AD转换读取位置传感器的值,并与期望位置进行比较,调整舵机角度。
3.3 控制系统集成将硬件设计和软件设计相结合,搭建整个控制系统,实现对舵机的精确控制。
第四章:性能评估与总结4.1 性能评估为了评估舵机控制系统的性能,本论文进行了一系列实验。
通过对舵机控制信号的测试和实际应用的验证,分析控制系统的精确性、响应速度和稳定性等指标。
4.2 结果分析实验结果表明,基于51单片机的舵机控制系统具有较高的精确度和响应速度。
系统能够快速而准确地将舵机旋转到期望位置,并处于稳定状态。
4.3 总结本论文介绍了一种基于51单片机的舵机控制方法。
单片机控制舵机的C51程序用stc89c51 单片机来控制舵机的程序,测试成功,仅供大家参考.#include “reg52.h”unsigned char count; //0.5ms 次数标识sbit pwm =P3 ; //PWM 信号输出sbit jia =P3;//角度增加按键检测IO 口sbit jan=P3;//角度减少按键检测IO 口unsigned char jd; //角度标识void delay(unsigned char i)//延时{unsigned char j,k;for(j=i;j0;j--) for(k=125;k0;k--);}void Time0_Init() //定时器初始化{TMOD = 0x01;//定时器0 工作在方式1 IE = 0x82;TH0 = 0xfe;TL0 = 0x33;//11.0592MZ 晶振,0.5msTR0=1; //定时器开始}void Time0_Int() interrupt 1 //中断程序{TH0 = 0xfe; //重新赋值TL0= 0x33;if(count jd) //判断0.5ms 次数是否小于角度标识pwm=1;//确实小于,PWM 输出高电平elsepwm=0; //大于则输出低电平count=(count+1); //0.5ms 次数加1count=count%40; //次数始终保持为40 即保持周期为20ms}void keyscan() //按键扫描{if(jia==0) //角度增加按键是否按下{delay(10); //按下延时,消抖if(jia==0) //确实按下{jd++;//角度标识加1count=0; //按键按下则20ms 周期从新开始if(jd==6)jd=5; //已经是180 度,则保持while(jia==0);//等待按键放开}}if(jan==0) //角度减小按键是否按下{delay(10);if(jan==0){jd--; //角度标识减1count=0;if(jd==0)jd=1;//已经是0 度,则保持while(jan==0);}}}void main(){jd=1;count=0; Time0_Init(); while(1){keyscan(); //按键扫描}}tips:感谢大家的阅读,本文由我司收集整编。
51舵机控制第一章:引言51舵机是一种广泛应用于机器人和航空模型等领域的电子组件,可实现精确的角度控制和动作实现。
本文旨在介绍51舵机的原理和控制方法,并探讨其在实际应用中的优势和局限性。
第二章:51舵机的工作原理51舵机是一种电机与减速装置的组合,通过电机控制减速装置的运动,从而实现角度的变化。
其内部包含有感应器和控制电路,能够探测舵机的角度,并根据输入的控制信号调整舵机的位置。
第三章:51舵机的控制方法51舵机可以通过PWM信号来控制。
PWM信号的周期通常为20ms,高电平的宽度通过改变来实现不同的角度控制。
具体控制方法包括设置舵机的中位角度、最大旋转角度和最小旋转角度,以及根据需求编写相应的控制程序。
第四章:51舵机在实际应用中的优势和局限性51舵机具有体积小、重量轻、控制精确等优势,在机器人、航空模型等领域有广泛的应用。
然而,其局限性也不可忽视,如成本较高、容易受到外界环境的影响等。
因此,在实际应用中需要对其优势和局限性进行综合考虑,选择合适的控制方法和适用场景。
综上所述,本文对51舵机的工作原理和控制方法进行了介绍,分析了其在实际应用中的优势和局限性。
通过深入研究和实践,可以进一步提升51舵机的控制效果和应用范围,为机器人和航空模型等领域的发展做出更大的贡献。
第一章:引言51舵机作为一种常用的电子组件,广泛应用于机器人和航空模型等领域,其精确的角度控制和动作实现功能使其成为了许多项目的重要组成部分。
本文将介绍51舵机的工作原理和控制方法,并探讨其在实际应用中的优势和局限性,以期为读者提供更多了解和应用该舵机的参考。
第二章:51舵机的工作原理51舵机的工作原理主要通过电机控制减速装置的运动,从而实现角度的变化。
舵机内部包含有感应器和控制电路,感应器负责测量舵机的角度,而控制电路接收输入的控制信号并相应调整电力输出,以使舵机转动到指定位置。
舵机通常采用直流电机和减速装置的组合,其中减速装置会将电机输出的高速转动转变为较低速度和更高扭矩的转动,以提供更精确和平稳的运动。
51单片机舵机控制论文题目:基于51单片机的舵机控制研究第一章:引言1.1 研究背景舵机是一种常用的电子元器件,广泛应用于自动化系统、机器人和遥控模型等领域。
通过控制舵机角度和转速,可以实现物体位置和方向的控制。
因此,舵机控制技术对于自动控制系统的实现具有重要意义。
1.2 研究目的本研究旨在通过基于51单片机的舵机控制,探索舵机控制的原理、方法和应用,为相关领域的开发和应用提供参考。
第二章:舵机控制原理2.1 舵机工作原理舵机是一种精密的转动执行器,根据输入的控制信号控制转动角度和转速。
舵机内部包含电机、减速机构和位置反馈装置。
通过控制输入信号的脉宽,可以控制舵机的转动范围。
2.2 51单片机51单片机是一种常用的微控制器,具有丰富的外设接口和强大的控制能力。
通过编写程序,可以实现对舵机的控制。
第三章:舵机控制方法3.1 舵机控制电路设计通过设计合适的电路,可以提供稳定的电源和信号输入。
电路包括电源电路和信号输入电路。
3.2 舵机控制程序设计通过编写51单片机的程序,实现舵机控制功能。
程序通过控制脉冲信号的宽度和频率,控制舵机的角度和转速。
第四章:舵机控制应用4.1 自动化系统中的舵机控制舵机可以应用于自动控制系统中,实现对物体位置和方向的控制。
例如,可以通过舵机控制机械手臂的运动,实现精确抓取和放置操作。
4.2 机器人中的舵机控制舵机是机器人关节控制的核心部件,通过控制舵机的转动角度,可以实现机器人各个关节的运动。
舵机控制技术是机器人动作的基础。
4.3 遥控模型中的舵机控制舵机广泛应用于遥控模型中,用于控制模型车辆、飞机等的转向。
舵机控制技术可以提高遥控模型的灵活性和操控性。
结论本研究基于51单片机的舵机控制研究,通过对舵机的工作原理和控制方法进行分析,实现了对舵机的精确控制。
舵机控制技术在自动化系统、机器人和遥控模型等领域具有广泛应用前景。
本研究的成果对相关领域的开发和应用具有重要意义。
4.1 自动化系统中的舵机控制在自动化系统中,舵机常用于控制机械手臂的运动。
51控制多路舵机章节一:引言(约250字)近年来,随着机器人技术的迅速发展,多路舵机控制系统的研究成为了热点领域之一。
多路舵机控制系统可以实现机器人各个部件的精确控制,为机器人动作的灵活性与多样性带来了巨大的提升。
本文将介绍一种基于51单片机的多路舵机控制方法,其具有简单、稳定、高效的特点。
章节二:设计与实现(约250字)本文中,我们设计了一个基于51单片机的多路舵机控制系统。
系统由一个主控制板和多个舵机组成,其中主控制板负责接收外部输入信号,通过PWM信号驱动各个舵机实现精确控制。
为了提高控制的稳定性,我们使用了PID控制算法来对舵机的角度进行调整和修正。
为了提高系统的可拓展性,我们还设计了扩展接口,可以根据需要连接更多的舵机。
章节三:系统性能测试与分析(约250字)为了验证本文所设计的多路舵机控制系统的性能,我们进行了一系列的实验。
在实验中,我们测试了系统的控制精度、动作反应速度以及稳定性。
实验结果表明,本文所设计的多路舵机控制系统具有较高的控制精度和动作反应速度,在稳定性方面表现出色。
章节四:结论(约250字)本文提出了一种基于51单片机的多路舵机控制系统的设计方案。
通过采用PID控制算法和PWM信号驱动技术,系统可以实现对多个舵机的精确控制。
实验结果证明了系统的稳定性和可靠性。
然而,本文所设计的多路舵机控制系统仍然存在一些局限性,如可拓展性不够强、算法复杂度较高等。
在未来的研究中,可以进一步改进系统设计,提高其性能和可拓展性,以满足不同领域的需求。
章节二:设计与实现(续)(约250字)在设计与实现的过程中,我们首先确定了舵机的数量和位置,根据需求选择了适当的舵机型号。
接下来,我们设计了主控制板的电路图和PCB布局,并进行了制造和组装。
主控制板上集成了51单片机、PWM模块和扩展接口等功能模块,以实现对舵机的精确控制和扩展能力。
在软件方面,我们使用C语言编写了控制程序。
首先,我们编写了舵机驱动模块,实现了PWM信号的发生和舵机角度的控制。
#include<reg52.h>
#include<intrins.h>
//本程序经软仿真调试在机器周期为1us时理论误差为0,不需要占用太多的cpu运行时间就可以控制8路舵机,精度为1ms-2ms 平均分成100份,在时间消耗和舵机数量上
//明显优于网上常见的舵机控制程序,keil3使用9(最高)编译器优化时达到理论误差为0,编译器优化级别过低时无法使用unsigned char gai;
unsigned char nt[8];
unsigned char nw[8];
unsigned char pwmbuffer[8] = {50,50,50,50,50,50,50,50};
void set(unsigned char m,unsigned char n){
if((m<8)&&(n<101)){ //如果输入合法则记录新数据并将状态改变标志置位pwmbuffer[m] = n;
gai = 1;
}
}
void tim(void){
unsigned char a1,a2,tempt,tempw; //a1,a2作为循环变量,tempt,tempw作为排序交换用临时变量
for(a1 = 0; a1 < 8; a1++){ //由舵机控制数据设置用于排序的表(两行八列)nt[a1] = pwmbuffer[a1]; //第几个舵机所需的高电平时长
nw[a1] = 1 << a1; //用第几位置一来表示第几个舵机
}
for(a1 = 0; a1 < 7; a1++){ //简单排序算法,找出最小的与第一个交换,在从剩余的中找出最小的与第二个交换,以此类推
unsigned char min = a1; //用于记录哪一个是最小的
for(a2 = a1 + 1; a2 < 8; a2++){ //从剩余项中找出最小的
if(nt[a2] < nt[min]){
min = a2;
}
}
tempt = nt[a1]; //交换
tempw = nw[a1];
nt[a1] = nt[min];
nw[a1] = nw[min];
nt[min] = tempt;
nw[min] = tempw;
}
for(a1 = 1; a1 < 8; a1++){ //之前记录应该变成低电平的输出口,之后记录应该是低电平的输出口nw[a1] |= nw[a1-1];
}
a2 = 0;
for(a1 = 0; a1 < 7; a1++){ //去掉重复
if(nt[a1] != nt[a1 + 1]){
nt[a2] = nt[a1];
nw[a2] = nw[a1];
a2++;
}
}
nt[a2] = nt[7];
nw[a2] = nw[7];
for(a2++; a2 < 8; a2++){
nt[a2] = 0;
nw[a2] = 0xFF;
}
for(a1 = 7; a1 > 0; a1--){ //之前记录每个输出口应持续高电平的时间,之后记录与上一次变化间隔时间if(nt[a1]){
nt[a1] = nt[a1] - nt[a1-1] - 1;
}
}
for(a1 = 0; a1 < 8; a1++){ //避免对0减1发生溢出跳到255,因为已经去掉重复所以不影响经度nw[a1] = ~nw[a1];
if(nt[a1] < 2){
nt[a1] = 1;
}
else{
nt[a1] -= 1;
}
}
}
void Timer0(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0xE0;
TH0 = 0xB1;
TR0 = 1;
ET0 = 1;
}
void setuart(unsigned int a){ SCON = 0x50; //设置串口为模式1 TMOD &= 0x0F; //设置定时器T1为自动重装模式TMOD |= 0x20; //设置定时器T1为自动重装模式TH1 = 256 -(12000000/12/2/16)/a; //计算T1重载值TL1 = TH1; //手动初次重装ET1 = 0; //定时器中断关闭ES = 1; //串口中断启动EA = 1; //总中断启动TR1 = 1; //定时器T1启动}
void delayus(void){ //延时函数,加上外层的loop指令正好十个机器周期unsigned char i;
_nop_();
i = 1;
while (--i);
}
void delaypw(unsigned char a){ //可调延时函数产生误差多7个机器周期do{
delayus();
}while(--a);
}
void pwm(void) interrupt 1{
P0 = 0xFF; //所有输出口输出高电平
delaypw(99); //原定1000个机器周期减去10加7加3正好是1000
_nop_();_nop_();_nop_();
delaypw(nt[0]); //从数组取数需要两个周期输出需要一个周期加误差7个周期正好是10个周期
P0 = nw[0]; //nw记录了当前哪些输出口应该置为低电平
delaypw(nt[1]); //nt记录了到下一次输出变化应间隔的时间
P0 = nw[1];
delaypw(nt[2]);
P0 = nw[2];
delaypw(nt[3]);
P0 = nw[3];
delaypw(nt[4]);
P0 = nw[4];
delaypw(nt[5]);
P0 = nw[5];
delaypw(nt[6]);
P0 = nw[6];
delaypw(nt[7]);
P0 = nw[7];
if(gai){ //如果舵机位置被改变标志位置位则重新计算舵机参数nt,nw tim();
}
}
void uart(void) interrupt 4 {
static unsigned char z = 0; //静态变量用于储存舵机序号
unsigned char y; //临时变量暂存SBUF
if(RI){
RI = 0; //中断标志位清空
y = SBUF; //读取SBUF
if(y == 101){ //判断是否是清除信号
z = 0;
}
else if((z != 0)&&(y < 101)){ //如果以输入了舵机序号且新输入的角度信号没有溢出则更新数据
set(z,y);
}
else if((z == 0)&&(y < 8)){ //如果未输入舵机序号且新输入的舵机序号合法则记录舵机序号
z = y;
}
}
if(TI){
TI = 0;
}
}
void main(void){
tim(); //计算舵机所需参数nt,nw
Timer0(); //定时器初始化
setuart(600); //串口初始化,因为需要正好1us的的延时所以晶振必须用12MHz,通讯速率无法在高P0 = nt[0]; //查看参数计算结果,用于调试
P0 = nw[0];
P0 = nt[1];
P0 = nw[1];
P0 = nt[2];
P0 = nw[2];
P0 = nt[3];
P0 = nw[3];
P0 = nt[4];
P0 = nw[4];
while(1); }。