搜档网
当前位置:搜档网 › 51单片机控制8路舵机

51单片机控制8路舵机

51单片机控制8路舵机
51单片机控制8路舵机

#include

#define uint unsigned int

#define uchar unsigned char

#define zhouqi 2180

uchar order;

uint PWM[8]={1308,1308,1308,1308,1308,1308,1308,1308}; void initPWM();

void main()

{

initPWM();

P1=-PWM[0]/256;

P2=-PWM[0]%256;

while(1);

}

void t0() interrupt 1

{

switch(order)

{

case 1: P0=0x01;

TH0=-PWM[0]/256;

TL0=-PWM[0]%256;

break;

case 2: P0=0x00;

TH0=-(zhouqi-PWM[0])/256;

TL0=-(zhouqi-PWM[0])%256;

break;

case 3: P0=0x02;

TH0=-PWM[1]/256;

TL0=-PWM[1]%256;

break;

case 4: P0=0x00;

TH0=-(zhouqi-PWM[1])/256;

TL0=-(zhouqi-PWM[1])%256;

break;

case 5: P0=0x04;

TH0=-PWM[2]/256;

TL0=-PWM[2]%256;

break;

case 6: P0=0x00;

TH0=-(zhouqi-PWM[2])/256;

TL0=-(zhouqi-PWM[2])%256;

break;

case 7: P0=0x08;

TH0=-PWM[3]/256;

TL0=-PWM[3]%256;

break;

case 8: P0=0x00;

TH0=-(zhouqi-PWM[3])/256;

TL0=-(zhouqi-PWM[3])%256;

break;

case 9: P0=0x10;

TH0=-PWM[4]/256;

TL0=-PWM[4]%256;

break;

case 10:P0=0x00;

TH0=-(zhouqi-PWM[4])/256;

TL0=-(zhouqi-PWM[4])%256;

break;

case 11:P0=0x20;

TH0=-PWM[5]/256;

TL0=-PWM[5]%256;

break;

case 12:P0=0x00;

TH0=-(zhouqi-PWM[5])/256;

TL0=-(zhouqi-PWM[5])%256;

break;

case 13:P0=0x40;

TH0=-PWM[6]/256;

TL0=-PWM[6]%256;

break;

case 14:P0=0x00;

TH0=-(zhouqi-PWM[6])/256;

TL0=-(zhouqi-PWM[6])%256;

break;

case 15:P0=0x80;

TH0=-PWM[7]/256;

TL0=-PWM[7]%256;

break;

case 16:P0=0x00;

TH0=-(zhouqi-PWM[7])/256;

TL0=-(zhouqi-PWM[7])%256;

order=0;

break;

default:order=0;

}

order++;

}

void initPWM()

{

order=1;

TMOD=0X11;

TH0=(65536-1500)/256;

TL0=(65536-1500)%256;

EA=1;

TR0=1;

ET0=1;

}

51单片机超高精度6路舵机控制程序

51单片机超高精度6路舵机控制程序 #include //包含单片机寄存器的头文件 #define uchar unsigned char #define uint unsigned int P0M1=0X00; P0M0=0XFF;//设置P0 为强推挽输出 sbit servo0=P0^0; sbit servo1=P0^1; sbit servo2=P0^2; sbit servo3=P0^3; sbit servo4=P0^4; sbit servo5=P0^5; sbit servo6=P0^6; sbit servo7=P0^7; uchar serVal[2]; uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382) uchar pwm_flag=0; uint code ms0_5Con=461; //0.5ms计数(实际是460.8,取整得461) uint code ms2_5Con=2304; //2.5ms计数 /******************************************************************** * 功能: 串口初始化,晶振11.0592,波特率9600,使能了串口中断 ***********************************************************************/ void Com_Init() { TMOD |= 0x20; //用定时器设置串口波特率 TH1=0xFD; //256-11059200/(32*12*9600)=253 (FD) TL1=0xFD;//同上 TR1=1;//定时器1开关打开 REN=1; //开启允许串行接收位 SM0=0;//串口方式,8位数据 SM1=1;//同上 EA=1; //开启总中断 ES=1; //串行口中断允许位 } /******************************************************************** * 功能: 舵机PWM中断初始化 ***********************************************************************/ void Timer0Init()

飞鸿16路舵机控制器使用说明书

FH24路舵机控制器使用说明书 飞鸿科技 2012-5-24 一、产品介绍 (1) 二、功能特点 (3) 三、接口说明 (4) 四、指令说明 (6) 五、16路舵机调试软件使用说明 (7) 二、连接PC上位机 (9) 三、上位机界面编辑 (10) 四、单路舵机调试 (11) 五、动作组编辑 (12) 六、注意事项及故障解决 (13) 产品介绍 一、 一、产品介绍 设计该舵机控制板是为了方便新手学习多路舵机的控制。多路舵机控制并不很复杂,但至今网上关于多路舵机控制的资源很少,当前淘宝上的舵机控制板也都不提供程序代码。由于这些原因,大批的机器人爱好者不能掌握多路舵机控制。使得很多机器人爱好者停滞不前,在这些最基本的地方浪费大量时间,不能不精力放到更高层的机器人控制方面的研究。如果每个人

都从头做起,整体的进步必将非常的缓慢。别人做好的东西我们不妨拿来学习,这样要节省很多的时间与精力。在这个基础上继续前进,做出属于自己的更高级的机器人。 由于本人在这些基础的东西上耗费的大量的精力,导致我没有时间去做高级的控制,如自平衡,语音识别等。大学接近尾声,没能让自己的机器人进一步升级感到非常遗憾。 基于方便学习的原则,本板子的设计有一下几个特点: 1、选用大家熟悉的,容易掌握的51单片机。但不是普通51单片机,是功能强大的增强型单片机STC12C5A60S2。 有人说51控制的精度肯定不如ARM。是的,这是明显的事实。但是我用ARM的芯片来写教程,只能给少数人看,而且如果那个人ARM掌握的都很好了,也不需要看此教程了。该控制板设计的目的就是给机器人初级爱好者学习,仅仅因为这一点,选择51单片机是最恰当不过了。 我最初做的32路舵机控制板就是在arm芯片上做的,那些不适合新手学习,在51上学会了舵机控制的基本方法,等你会使用更高级单片机的时候可以很容易的移植到上面,实现更多舵机,更高精度的控制。 STC12C5A60S2单片机属于增强型51。他兼容传统的51单片机,也就是说,你原来的学习的、编写的51程序不用改动就能在这个单片机上直接使用,不会出现问题,而且速度提高8~12倍。但是它与传统51相比,在速度性能与资源方面都有了很大的提升。 (1)60K的flash程序存储器。89C52只有8K。 (2)1280字节的SRAM。你课本上学的RAM只有128字节。1280足够用了,省去外部扩展的麻烦。 (3)两个串口。 (4)独立波特率发生器。做机器人定时器往往很不够用,而传统51单片机串口通信还要占用定时器,有了独立波特率发生器就可以节省出一个定时器。 (5)PCA模块。可以硬件输出快速PWM。可以扩展出两个定时器。 (6)8路A/D转换通道。A/D转换在机器人、各种比赛中都很常用,使用这款单片机就不必再做AD转换电路。 2、程序下载接口、IO口引出。该板是单片机最小系统板+16路舵机控制板。不是单纯的舵机控制板,而是一款可以用来学习、编程、二次开发的开发板。可以直接用来参加比赛,DIY,毕业设计。 5、详细的教程,丰富的资料。该板子是淘宝中唯一提供程序代码、可以学习的舵机控制板。提供原理图、接口示意图、程序代码、上位机软件。另外购买该产品赠送本人搜集的单片机开发常用工具软件,机器人资料,单片机视频教程以及丰富的例程。

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.sodocs.net/doc/7113750888.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

51单片机程序:按键控制舵机角度

#include "reg52.h" unsigned char count; //0.5ms次数标识 sbit pwm =P2^7 ; //PWM信号输出 sbit jia =P2^4; //角度增加按键检测IO口 sbit jan =P2^5; //角度减少按键检测IO口 unsigned char jd=5; //角度标识 void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE = 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count< jd) //判断0.5ms次数是否小于角度标识 pwm=1; //确实小于,PWM输出高电平 else pwm=0; //大于则输出低电平 count=(count+1); //0.5ms次数加1 count=count%40; //次数始终保持为40 即保持周期为20ms } void keyscan() //按键扫描 { if(jia==0) //角度增加按键是否按下 { delay(10); //按下延时,消抖 if(jia==0) //确实按下 { jd++; //角度标识加1 count=0; //按键按下则20ms周期从新开始 if(jd==6) jd=5; //已经是180度,则保持 while(jia==0); //等待按键放开

舵机测试方案

舵机测试方案 1、舵机转速测量 方案一:通过测量舵机无负载的情况下转过60°角所需时间来确定舵机转速。以扇形纸板固定在舵盘上,在舵机从-45°~+45°(或-90°~+90°)位置之间的-30°~+30°角线的适当位置制作两小孔(下图A,B处为红外对管信息采集通道),以给红外射对管提供信息传递通道。这样就可以在这两个信息通道采集舵机在转过60°范围的起始位置和结束位置的信号变化,将采集到的信号经过比较器(LM393)整形后送入单片机进行处理(这里可将整形后的数字变化信号进行定时中断处理),就可以获得舵机在转过60°范围的起始位置和结束位置过程中需要的时间值,并将时间值通过数码管显示出来。从而测得舵机的转速值。

方案二:测试设备:舵机控制器速度测试架 操作方法: 1设定好舵机供电电压 2舵机控制器脉冲宽度制调节在,接上舵机,使舵机静止在舵机的中央位置 3舵机固定在角度测试架上,指针较准在90度 4使舵机控制器的脉宽输出变成2ms,记录正向60度角摆幅的时间(正向1) 5使舵机控制器的脉宽输出变回,记录反向60度角摆幅的时间(反向1) 6使舵机控制器的脉宽输出变成,记录反向60度角摆幅的时间(反向2) 7使舵机控制器的脉宽输出变回,记录正向60度角摆幅的时间(正

向2) 8更改舵机供电电压,重覆步骤2到7 2、转矩测量 方案一:通过实际的测试来验证该舵机的转矩。因为舵机扭矩的单位是Kg·cm,所以可以在舵盘上距舵机轴中心水平 距离1cm处,测试舵机能够带动物体的重量。 注意:因为较高的电压可以提高电机的速度和扭矩,所以在测试其性能参数时应根据具体情况合理选择舵机的工作 电压。

51单片机一个定时器控制多路舵机

#ifndef __interrupt0_H__ #define __interrupt0_H__ void interrupt0() //STM中断服务子程序 { _t2af = 0 ; switch (cnt) { case 0: PWMOUT_2 = PWMOUT_3 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_1 = (PWMbuf - PWMOUTbuf_1); _tm2al = PWMOUTbuf_1 & 0x00ff; _tm2ah = PWMOUTbuf_1 >>8 ; //重新定义计数初值 if( PWMOUTbuf_1 >= PWMOUTbufmin1 && PWMOUTbuf_1 <= PWMOUTbufmax1) {PWMOUTbuf_1 = PWMOUTcnt_1; PWMOUT_1 = 1;} else {PWMOUTbuf_1 = PWMbuf-PWMOUTcnt_1; PWMOUT_1 = 0 ; cnt = 1;} //判断脉宽是否在正常范围之内 break; case 1: PWMOUT_1 = PWMOUT_3 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_2 = (PWMbuf - PWMOUTbuf_2); _tm2al = PWMOUTbuf_2 & 0x00ff; //重新定义计数初值 _tm2ah = PWMOUTbuf_2 >> 8; if(PWMOUTbuf_2 >= PWMOUTbufmin1 && PWMOUTbuf_2 <= PWMOUTbufmax1) {PWMOUTbuf_2 = PWMOUTcnt_2; PWMOUT_2 = 1;} else {PWMOUTbuf_2 = PWMbuf-PWMOUTcnt_2;PWMOUT_2 = 0;cnt = 2;} //判断脉宽是否在正常范围之内 break; case 2: PWMOUT_1 = PWMOUT_2 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_3 = (PWMbuf - PWMOUTbuf_3); _tm2al = PWMOUTbuf_3 & 0x00ff; //重新定义计数初值 _tm2ah = PWMOUTbuf_3 >> 8; if(PWMOUTbuf_3 >= PWMOUTbufmin1 && PWMOUTbuf_3 <= PWMOUTbufmax1) {PWMOUTbuf_3 = PWMOUTcnt_3; PWMOUT_3 = 1;}

SSC32舵机控制器用户手册

概述: USBSSC32路舵机控制是专为人形机器人、蜘蛛机器人、机械手等多舵机使用而量身定做的多路舵机控制器。该控制器不但保留了原版的所有功能,还在原版的基础上作了升级,将原来的RS232串口改成了USB接口,方便电脑没有串口的用户使用。控制器还增加蓝牙接口,可实现无线远程控制。USBSSC32路舵机控制控制方式包括实时、定时、定速控制等,与lynxmotion的控制软件完全兼容. 参数: 1.输出通道:32路(脉冲调制输出或TTL电平输出); 2.舵机供电:根据所接舵机额定电压供电,典型DC4.8V~6V; 3.逻辑供电:DC6V~12V或USB供电(具有自恢复保险丝,调试时使用); 4.驱动分辨率:1uS,0.09°; 5.驱动速度分辨率:1uS/秒,0.09°/秒; 6.通讯接口:USB/TTL串口接口; 7.串口波特率:2400、9600、38.4k、115.2k可设置; 接口描述: SSC32舵机控制板接口如下图所示:

1.16-31号舵机信号控制引脚,其中G表示GND(黑色排针);V表示VCC(红色排针);S表示信号控制引脚(白色排针)。使用时不要把线接反。 2.0-15号舵机信号控制引脚,其中G表示GND(黑色排针);V表示VCC(红色排针);S表示信号控制引脚(白色排针)。使用时不要把线接反。 3.主控制芯片,采用DIP28脚的Atmega8L单片机,工作频率1 4.7456MHZ。 4.16-31号舵机控制电源输入,可以用来驱动一般的模拟或者是数字舵机。工作电压4.8V -6V,可以使用5片镍氢电池组供电,其中VS2接电源正极,GND接电源负极。 5.0-15号舵机控制电源输入,可以用来驱动一般的模拟或者是数字舵机。工作电压4.8V -6V,可以使用5片镍氢电池组供电,其中VS1接电源正极,GND接电源负极。 6.逻辑供电输入端,输入电压范围 7.5-15V,通过内部的降压给电源提供稳定的5V电源,其中VIN接电源的正极,GND接电源的负极。 7.通信速率选择,通过两组指拨开关选择不同的通信波特率,对应关系如下: 8.ABCD四组模拟/数字输入端子,可以设置为静止或者是锁存。 9.FT232rl通信芯片,提高通信的稳定性。 10.串口选择,默认通过跳线帽连接T、R引脚,去除引脚可以将串口留作它用。 https://www.sodocs.net/doc/7113750888.html,B接口,用来连接控制板到电脑。 12.内部降压模块,采用78D05降压模块为控制单元提供稳定的5V电源。 13.扩展功能,暂时用不到。 14.蓝牙接口,可以通过额外的蓝牙模块轻松实现无线控制。 15.VS1与VS2短接跳线,当两组都插有跳线时,VS1=VS2.这时只需要在VS1或者VS2任意输入一组舵机电源即可;如果去除跳线,VS1与VS2为两组不同的电源输入,不同的舵机电源从VS1与VS2分别输入。

51单片机控制舵机程序演讲稿.doc

#include #define Stop 0 //宏定义,停止 #define Left 1 //宏定义,左转 #define Right 2 //宏定义,右转 sbit ControlPort = P2^0; //舵机信号端口 sbit KeyLeft = P1^0; //左转按键端口 sbit KeyRight = P1^1; //右转按键端口 sbit KeyStop = P1^2; //归位按键端口 unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数LeftOrRight:舵机左右旋转标志 void InitialTimer ( void ) { TMOD=0x10; //定时/计数器1工作于方式1 TH1 = ( 65535 - 500 ) / 256; //0.25ms TL1 = ( 65535 - 500 ) % 256; EA=1; //开总中断 ET1=1; //允许定时/计数器1 中断 TR1=1; //启动定时/计数器1 中断 } void ControlLeftOrRight ( void ) //控制舵机函数 { if( KeyStop == 0 ) { //while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到 LeftOrRight = Stop; } if( KeyLeft == 0 ) { //while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到 LeftOrRight = Left; } if( KeyRight == 0 ) { //while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到 LeftOrRight = Right; }

51单片机按键控制数码管程序

#define uint unsigned int #define uchar unsigned char uchar c; sbit p10=P1^0; sbit p11=P1^1; sbit p12=P1^2; sbit p13=P1^3; sbit p14=P1^4; sbit p15=P1^5; sbit p16=P1^6; sbit p17=P1^7; void delay(uint z); int b[]={0,1,2,3,4,5,6,7};//设置每一位显示的数字 unsigned char code Tab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳极数码管 int a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void main() { EA=1; EX0=1; IT0=1; P1=0xff; while(1) { for(c=0;c<8;c++)//数码管扫描显示

P2=a[c]; P0=Tab[b[c]]; delay (1); } } } void delay(uint z) { uint a,b; for(a=z;a>0;a--) for(b=110;b>0;b--); } int_0()interrupt 0 { EA=0; if(p10==0) b[0]=(b[0]+1)%10; if(p11==0) b[1]=(b[1]+1)%10; if(p12==0) b[2]=(b[2]+1)%10; if(p13==0) b[3]=(b[3]+1)%10; if(p14==0) b[4]=(b[4]+1)%10; if(p15==0) b[5]=(b[5]+1)%10; if(p16==0) b[6]=(b[6]+1)%10; if(p17==0) b[7]=(b[7]+1)%10;

51单片机控制舵机程序精度,数量,占用时间优化方案及程序

#include #include //本程序经软仿真调试在机器周期为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;

舵机控制程序

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,

获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制信号是PWM信号,利用占

空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。 图1 舵机的控制要求 单片机实现舵机转角控制可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放 器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV 以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波

电路的精度难以达到舵机的控制精度要求。 也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。 单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。 具体的设计过程: 例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为 20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在

51单片机按键控制花样灯

51单片机按键控制花样灯 时间:2018-09-10 13:50:11 来源:51hei 作者: /**************************************************** * 本程序实现用按键控制花样灯。 * * 当K1按下时,灯从0xfe向左跑一遍; * * 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置; * * 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。 * * 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。 * * 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。 * ******************************************************/ ************************************************* 连接方法:P0接独立按键JP5。P2接LED灯接口JP1 * ***********************************************************/ #include //头文件,函数声明 #include //定义按键所在位 sbit K1=P0^0。 sbit K2=P0^1。 sbit K3=P0^2。 sbit K4=P0^3。 sbit K5=P0^4。 unsigned char led。 unsigned char j。 void delayms(unsigned char ms> // 1ms标准延时 { while(ms--> { for(j=0。j<110。j++>。 //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确 } } void main(> { //P2=led。 unsigned int i。

【51单片机】控制8路舵机源程序

仿真截图: //仿真文件网盘地址:https://www.sodocs.net/doc/7113750888.html,/s/1ntLqf3N //程序: #include sbit PWM0 = P1^0; sbit PWM1 = P1^1; sbit PWM2 = P1^2; sbit PWM3 = P1^3; sbit PWM4 = P1^4; sbit PWM5 = P1^5; sbit PWM6 = P1^6; sbit PWM7 = P1^7; sbit ADD = P3^6; sbit SUB = P3^7; #define uchar unsigned char #define uint unsigned int uint t_up0 = 1500; //舵机PWM高电平时间1000~2000表示1ms到2ms uint t_up1 = 1500; uint t_up2 = 1500; uint t_up3 = 1500;

uint t_up4 = 1500; uint t_up5 = 1500; uint t_up6 = 1500; uint t_up7 = 1500; uint t0_h; uint t0_l; void delayms(uint ms) { unsigned char a,b,c; while(ms--) { for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } } void timer_init() { EA = 1; ET0 = 1; PT0 = 1; TMOD = 0x11; TH0 = (65536 - t_up0)/256; TL0 = (65536 - t_up0)%256; } uchar t0_flag = 0; uint num_max = 65535; //直接用65535 - t_up 不用变量- t_up 时,误差较大,原因暂时不明【注:65536不能存到uint类型变量中】 uint t_change = 63036;//换路周期2.5ms 8路 uchar error0 = 45; uchar error1 = 45; uchar error2 = 52; uchar error3 = 52; uchar error4 = 57; uchar error5 = 57; uchar error6 = 63; uchar error7 = 63; uchar error8 = 70; uchar error9 = 70;

第13讲51单片机按键电路

标题:键盘接口电路 教学目标与要求: 1.键盘去抖动和连接、控制方式 2.独立式按键及其接口电路 3.矩阵式键盘及其接口电路 授课时数:2 教学重点:.矩阵式键盘及其接口电路 教学内容及过程: 一、键盘接口概述 1、按键开关去抖动问题 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图9-11所示,抖动时间的长短与开关的机械特性有关,一般为5 10 ms 在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。图9-12是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。 软件上采取的措施是:在检测到有按键按下时,执行一个10 ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到该键释放后,也应采用相同的步 骤进行确认,从而可消除抖动的影响。

2.编制键盘程序 一个完善的键盘控制程序应具备以下功能: (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。 (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3) 准确输出按键值(或键号),以满足跳转指令要求。 二、独立式按键 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1. 独立式按键结构 独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。 2.矩阵式键盘 I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。特点: ①占用I/O端线较少; ②软件结构教复杂。 适用于按键较多的场合。 3.键盘扫描控制方式 ⑴程序控制扫描方式 键处理程序固定在主程序的某个程序段。 特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。 ⑵定时控制扫描方式 利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。 特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。 ⑶中断控制方式 中断控制方式是利用外部中断源,响应键输入信号。 特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。 三、独立式按键及其接口电路 1、按键直接与I/O口连接

32路舵机控制器

miniUSB32路舵机控制器一、接口 1 、Mini USB接口 2、TTL串口跳线 3、比特率设置 4、对外5V供电接口 5、4路输入接口 6、舵机信号接口 7、舵机电源正极 8、舵机电源负极 9、舵机供电

10、控制板电源 二、指令 1、舵机移动 指令格式:# P S ... # P S T

基于某51单片机地键盘盘可调万年历

开放性实验报告 题目: 基于80C51的万年历设计_ 院系:

专业班级: 学号: 姓名: 指导老师:________________________ 时间:2014年9月8号 摘要 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能。本系统选用DALLAS 公司生产的日历时钟芯片DS1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。该电路采用AT89C52单片机作为核心,用以5V电压供电。 本系统硬件部分由AT89C52单片机、DS1302时钟芯片、LCD1602液晶显示环境下以C51语言编写,包括时间设置、时间显示、时间修正等功能。在仿真的时候,以Proteus 与Keil uVision4软件为基础,编写了MCS-51单片机对LCD1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。

关键词:时钟芯片DS1302;单片机AT89C52;液晶显示1602;独立键盘等

目录 第1章绪论 (1) 1.1实时万年历的简介 (1) 1.2系统所实现的功能 (3) 第2章开发工具软件简介 (4) 2.1K EIL U V ISION4软件简介 (4) 2.2P ROTEUS软件简介 (4)

2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (5) 第3章LCD1602显示控制技术 (6) 3.11602字符型LCD简介 (6) 3.2LCD1602功能 (7) 3.3 LCD1602的指令说明及时序 (8) 3.4LCD1602的RAM地址映射及标准字库表 (7) 3.5 LCD1602的一般初始化(复位)过程 (8) 第4章系统硬件概况 (13) 4.1系统概况 (13) 4.2 MCS-51单片机最小系统模块 (14) 4.3 DS1302时钟芯片控制与键盘设置时间模块 (15) 4.4 LCD1602显示模块 (16) 第5章软件控制系统概况 (18) 5.1程序流程概况 (18) 5.2 流程图 (18) 5.3 源程序代码 (19) 参考文献 (25)

基于C51的多路舵机PWM控制原理(有程序)

一、 基本原理介绍 二、 演示机构采用的是舵机,每个需要一路PWM 波 和两路电源输入。电源输入标准为5V 1-8A ,采用 带输入和输出保护的50w 开关电源供电;PWM 波为 50Hz ,正脉冲时间为0.5-2.5ms ,对应-90°至90° (实际使用中为了保护机械,为0.7-2.3ms ,舵机 旋转范围为-70°至70°)。 由于系统对于输出的频率有5 Hz 的限制,因此使用软件延迟来实现最多八路的 的PWM 波输出。PWM 波由MCU 通过软件延时产生, 算法概述如下(流程图见附件): 1. A 路输出 2.5ms 脉冲(输出正脉冲,不足 时间由低电平 补至2.5ms ),此时其他五 路无输出,相当于输出2.5ms 低电平; 2. B 路输出2.5ms 脉冲(同A 路,不足时间由低电平补齐),此时包括A 路的其他五路无输出,相当于输出2.5ms 低电平; 3. 同理,输出C,D,E,F 路 4. 此时,1-3步总时间为2.5*6=15ms ,其中每路由一个小于2.5ms 的正脉冲和低电平时间组成。由于输出周期为20ms ,故应再输出20ms-15ms=5ms 低电平时间,使得各路频率为50Hz 。 重复1-3步,得到输出波形如下图:(仅以4路为例,使用Proteus 仿真示波器,图 2.2.2) 可以看到,此时各路输出均为50Hz ,正脉冲时间为 0.5-2.5ms 图 2.2.1 舵机及其控制原理

图2.2.2 Proteus仿真 此算法在50Hz(20ms)频率的限制下,最多可输出8路PWM波形(8*2.5ms=20ms) 三、实际程序 程序如下: #include #include #define uchar unsigned char #define uint unsigned int sbit Out1=P2^0; sbit Out2=P2^1; sbit Out3=P2^2; sbit Out4=P2^3; sbit Out5=P2^4;

相关主题