




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科学年论文简易人形机器人的设计院 系 电子信息工程学院自动化系专业名称 自 动 化 年 级 2008 级 学生姓名 魏 杰 学 号 00824031 指导教师 仲 兆 楠 2011年09月20日 基于单片机的人形机器人的设计与实现摘 要本文介绍的人形机器人采用新华龙公司的C8051F310单片机为控制核心,利用舵机完成人形机器人的各种动作。该人形机器人可以完成下蹲、起立、走步,侧移和踢球等动作。舵机均采用单片机C8051F310内部的PCA模块产生的PWM波调节其转向和转角的大小从而实现人形机器人的各种动作。关键字:C8051F310 舵机 PCA模块 PWMDesign and Realization Humanoid Robot Based on MCUAbstractHumanoid Robot that is described in this article is using Nc Dragon single-chip microcomputer as control core,using rudder to complete various action。The Humanoid Robot can complete the squatting , standing up , walking , lateral moving and kicking actions. Rudder is controlled by PWM waves produced by C8051F310 MCU internal PCA module . Those actions is achieved through adjusting steering and rudder angle .Keywords: C8051F310 Rudder PCA module PWM概述本项目是基于51单片机的人形机器人的设计,整个程序采用C语言。近年来机器人就有很大的发展潜力,随着科技的进步,机器人将会做的越来越完善。人形机器人的产生解决的许多生产中的难题,它可以代替人类做许多危险而又高难度的工作。在一些场合机器人已经可以代替人类,相信在今后的时间里,人形机器人将会为我带来许多帮助。原理图的设计一、单片机外围电路本单片机的晶振为32.768MHZ,但是在后期的测试发现外部晶振输出不稳定,因此本项目采用的是内部晶振。我们所设计的机器人总共有12个舵机,而这款F310最多只能输出5路PWM,因此需要3块板子。二、电源驱动电路电源芯片采用AZ1084和LM1117。其中AZ1084输入电压为7.2v,输出电压为5v,LM1117输入电压为5v,输出电压为3.3v。F310单片机的工作电压是3.3v,因此需要经过两次降压达到3.3v。为了稳定工作电压,采用IB0505LS来稳定单片机的工作电压。三、通信接口我们需要3块电路板来是机器人工作,因此通信是必须考虑的问题。在此我们采用485来实现单片机之间的通信,通过一块主板来控制其余两块副板子的工作。485的好处就是它不像232那样要考虑电平匹配的问题。四、舵机接口采用光电隔离来稳定输出,是舵机正常稳定的工作。机器人有两条腿,每条腿由6路舵机来控制。PCB图制作一、 普通前二、 普通后(顶层)三、 普通后(底层)元器件列表 源程序左腿初始化:#include c8051f310.h#define uchar unsigned char#define uint unsigned intsbitP2_7 = P2 7;#define walk_zuo_1 186#define walk_zuo_2 187#define walk_zuo_3 188#define walk_zuo_4 189#define walk_zuo_5 190#definewalk_mark 222ucharmark;uchar act,arc;void Init_Variables()act=0;arc=0;void PCA_Init()PCA0CN = 0x40; PCA0MD &= 0x40; PCA0MD = 0x02; PCA0CPM0 = 0xC2; PCA0CPM1 = 0xC2; PCA0CPM2 = 0xC2; PCA0CPM3 = 0xC2; PCA0CPM4 = 0xC2;PCA0CPL0 = (uchar)(uint)(31*141.6+58000)%256);PCA0CPH0 = (uchar)(31*141.6+58000)/256);PCA0CPL1 = (uchar)(uint)(31*45.3+58000)%256);PCA0CPH1 = (uchar)(31*45.3+58000)/256);PCA0CPL2 = (uchar)(uint)(31*90.8+58000)%256);PCA0CPH2 = (uchar)(31*90.8+58000)/256);PCA0CPL3 = (uchar)(uint)(31*49.7+58000)%256);PCA0CPH3 = (uchar)(31*49.7+58000)/256);PCA0CPL4 = (uchar)(uint)(31*147.9+58000)%256);PCA0CPH4 = (uchar)(31*147.9+58000)/256);void Port_IO_Init() P0MDOUT = 0xC3; P1MDOUT = 0x01; P2MDOUT = 0x80; P0SKIP = 0x0C; P1SKIP = 0x06; XBR0 = 0x01; XBR1 = 0x45;P2_7 = 0;void Oscillator_Init() OSCICN = 0x82;void Timer_Init() TCON = 0x40; TMOD = 0x20; CKCON = 0x01; TL1 = 0x61; TH1 = 0x61;void UART_Init() SCON0 = 0x10;void Interrupts_Init() IE = 0x90;void Delay(uint dly)uint i,j;for(i=0;idly;i+)for(j=0;j1000;j+);/ Initialization function for device,/ Call Init_Device() from your main programvoid Init_Device(void) Init_Variables();PCA_Init(); Port_IO_Init(); Oscillator_Init(); Timer_Init();/Delay(5); UART_Init(); Interrupts_Init();void zuo_1_duoji(uchar x)PCA0CPL0 = (uchar)(uint)(31*x+58000)%256);PCA0CPH0 = (uchar)(31*x+58000)/256);void zuo_2_duoji(uchar x)PCA0CPL1 = (uchar)(uint)(31*x+58000)%256);PCA0CPH1 = (uchar)(31*x+58000)/256);void zuo_3_duoji(uchar x)PCA0CPL2 = (uchar)(uint)(31*x+58000)%256);PCA0CPH2 = (uchar)(31*x+58000)/256);void zuo_4_duoji(uchar x)PCA0CPL3 = (uchar)(uint)(31*x+58000)%256);PCA0CPH3 = (uchar)(31*x+58000)/256);void zuo_5_duoji(uchar x)PCA0CPL4 = (uchar)(uint)(31*x+58000)%256);PCA0CPH4 = (uchar)(31*x+58000)/256);void walk()switch(act)case walk_zuo_1 : zuo_1_duoji(arc);break;case walk_zuo_5 : zuo_5_duoji(arc);break;case walk_zuo_2 : zuo_2_duoji(arc);break;case walk_zuo_3 : zuo_3_duoji(arc);break;case walk_zuo_4 : zuo_4_duoji(arc);break;default :break;void main()Init_Device();while(1);void UART_Interrupt(void) interrupt 4uchar dat,i;/ucharmark;if(RI0=1)for(i=0;i180)act=dat;elsearc=dat;RI0=0;walk();右腿初始化:#include c8051f310.h#define uchar unsigned char#define uint unsigned intsbitP2_7 = P2 7;#define walk_you_1 181#define walk_you_2 182#define walk_you_3 183#define walk_you_4 184#define walk_you_5 185#definewalk_mark 223ucharmark;uchar act,arc;void Init_Variables()act=0;arc=0;void PCA_Init() PCA0CN = 0x40; PCA0MD &= 0x40; PCA0MD = 0x02; PCA0CPM0 = 0xC2; PCA0CPM1 = 0xC2; PCA0CPM2 = 0xC2; PCA0CPM3 = 0xC2; PCA0CPM4 = 0xC2;PCA0CPL0 = (uchar)(uint)(31*20+58000)%256);PCA0CPH0 = (uchar)(31*20+58000)/256);PCA0CPL1 = (uchar)(uint)(31*64.5+58000)%256);PCA0CPH1 = (uchar)(31*64.5+58000)/256);PCA0CPL2 = (uchar)(uint)(31*92.8+58000)%256);PCA0CPH2 = (uchar)(31*92.8+58000)/256);PCA0CPL3 = (uchar)(uint)(31*136.2+58000)%256);PCA0CPH3 = (uchar)(31*136.2+58000)/256);PCA0CPL4 = (uchar)(uint)(31*30+58000)%256);PCA0CPH4 = (uchar)(31*30+58000)/256);void Port_IO_Init() P0MDOUT = 0xC3; P1MDOUT = 0x01; P2MDOUT = 0x80; P0SKIP = 0x0C; P1SKIP = 0x06; XBR0 = 0x01; XBR1 = 0x45;P2_7 = 0;void Oscillator_Init() OSCICN = 0x82;void Timer_Init() TCON = 0x40; TMOD = 0x20; CKCON = 0x01; TL1 = 0x61; TH1 = 0x61;void UART_Init() SCON0 = 0x10;void Interrupts_Init() IE = 0x90;void Delay(uint dly)uint i,j;for(i=0;idly;i+)for(j=0;j1000;j+);/ Initialization function for device,/ Call Init_Device() from your main programvoid Init_Device(void) Init_Variables();PCA_Init(); Port_IO_Init(); Oscillator_Init(); Timer_Init();/Delay(5); UART_Init(); Interrupts_Init();void you_1_duoji(uchar x)PCA0CPL0 = (uchar)(uint)(31*x+58000)%256);PCA0CPH0 = (uchar)(31*x+58000)/256);void you_2_duoji(uchar x)PCA0CPL1 = (uchar)(uint)(31*x+58000)%256);PCA0CPH1 = (uchar)(31*x+58000)/256);void you_3_duoji(uchar x)PCA0CPL2 = (uchar)(uint)(31*x+58000)%256);PCA0CPH2 = (uchar)(31*x+58000)/256);void you_4_duoji(uchar x)PCA0CPL3 = (uchar)(uint)(31*x+58000)%256);PCA0CPH3 = (uchar)(31*x+58000)/256);void you_5_duoji(uchar x)PCA0CPL4 = (uchar)(uint)(31*x+58000)%256);PCA0CPH4 = (uchar)(31*x+58000)/256);void walk()switch(act)case walk_you_1 : you_1_duoji(arc);break;case walk_you_5 : you_5_duoji(arc);break;case walk_you_2 : you_2_duoji(arc);break;case walk_you_3 : you_3_duoji(arc);break;case walk_you_4 : you_4_duoji(arc);break;default :break;void main()Init_Device();while(1);void UART_Interrupt(void) interrupt 4uchar dat,i;/ucharmark;if(RI0=1)for(i=0;i180)act=dat;elsearc=dat;RI0=0;walk();主控制板初始化:#include c8051f310.hvoid PCA_Init() PCA0CN = 0x40; PCA0MD &= 0x40; PCA0MD = 0x08; PCA0CPM0 = 0xC2; PCA0CPM1 = 0xC2; PCA0CPM2 = 0xC2; PCA0CPM3 = 0xC2; PCA0CPM4 = 0xC2; PCA0CPL0 = 0xB8; PCA0CPL1 = 0xB8; PCA0CPL2 = 0xB8; PCA0CPL3 = 0xB8; PCA0CPL4 = 0xB8; PCA0CPH0 = 0xFE; PCA0CPH1 = 0xFE; PCA0CPH2 = 0xFE; PCA0CPH3 = 0xFE; PCA0CPH4 = 0xFE;void Port_IO_Init() P0SKIP = 0x0C; P1SKIP = 0x06; XBR0 = 0x01; XBR1 = 0x4D;void Oscillator_Init() int i = 0; OSCXCN = 0x67; for (i = 0; i 3000; i+); / Wait 1ms for initialization while (OSCXCN & 0x80) = 0); CLKSEL = 0x01; OSCICN = 0x00;void Timer_Init() TMOD = 0x20; CKCON = 0x01; TL1 = 0x70; TH1 = 0x70;void UART_Init() SCON0 = 0x10;void Interrupts_Init() IE = 0x90;/ Initialization function for device,/ Call Init_Device() from your main programvoid Init_Device(void) PCA_Init(); Port_IO_Init(); Oscillator_Init(); Timer_Init(); UART_Init(); Interrupts_Init();voidmain()Init_Device();执行动作:void Walk(void)uchar i;for(i=0;i11;i+) /右腿,关节抬起。Uart_Send(walk_you_2);Uart_Send(64-3*i);Delay(5);Uart_Send(walk_you_3);Uart_Send(93+2*i);Delay(5);Uart_Send(walk_you_4);Uart_Send(136-i);Delay(5);Uart_Send(walk_zuo_1); /左腿,关节调节重心位置Uart_Send(142-i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143+i);Delay(200);Delay(1500);for(i=0;i0;i-)Uart_Send(walk_you_2);/ 右腿伸直Uart_Send(64-3*i);Delay(5);Uart_Send(walk_you_3);Uart_Send(93+2*i);Delay(5);Uart_Send(walk_you_4);Uart_Send(136-i);Delay(5);Uart_Send(walk_zuo_1);Uart_Send(142-i);Delay(2);Uart_Send(walk_zuo_2);/左腿伸直Uart_Send(45-i);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-i);Delay(200);Delay(1500);for(i=0;i11;i+)Uart_Send(walk_zuo_2);/左腿抬起迈步 Uart_Send(45+i*3);Delay(5);Uart_Send(walk_zuo_3);Uart_Send(91-2*i);Delay(5);Uart_Send(walk_zuo_4);Uart_Send(50+i);Delay(5);Uart_Send(walk_you_1);/调节重心Uart_Send(20+i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30+i);Delay(200);Delay(1500);for(i=0;i0;i-)Uart_Send(walk_zuo_2);/左腿伸直 Uart_Send(45+i*3);Delay(5);Uart_Send(walk_zuo_3);Uart_Send(91-i*2);Delay(5);Uart_Send(walk_zuo_4);Uart_Send(50+2*i);Delay(5);Uart_Send(walk_you_1);Uart_Send(20+i);Delay(2);Uart_Send(walk_you_2);/右腿伸直Uart_Send(65+i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+i);Delay(5);Uart_Send(walk_you_4);Uart_Send(136+i*2);Delay(200);Delay(1500);void Stop()Uart_Send(walk_you_1);Uart_Send(13);Delay(5);Uart_Send(walk_zuo_1);Uart_Send(142);Delay(100);Uart_Send(walk_you_2);Uart_Send(65);Delay(5);Uart_Send(walk_zuo_2);Uart_Send(45);Delay(100);Uart_Send(walk_you_3);Uart_Send(91);Delay(5);Uart_Send(walk_zuo_3);Uart_Send(93);Delay(100);Uart_Send(walk_you_4);Uart_Send(136);Delay(5);Uart_Send(walk_zuo_4);Uart_Send(50);Delay(100);Uart_Send(walk_you_5);Uart_Send(32);Delay(5);Uart_Send(walk_zuo_5);Uart_Send(143);Delay(100);void Dunxia()uchar i;/蹲下for(i=0;i16;i+)Uart_Send(walk_you_4);Uart_Send(136+2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+i*4);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-i*4);Delay(2);Uart_Send(walk_you_2);Uart_Send(65-i*3);Delay(2);Uart_Send(walk_zuo_2);Uart_Send(45+i*2);Delay(500);for(i=0;i0;i-)Uart_Send(walk_you_4);Uart_Send(136+2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+i*4);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-i*4);Delay(2);Uart_Send(walk_you_2);Uart_Send(65-i*3);Delay(2);Uart_Send(walk_zuo_2);Uart_Send(45+i*2);Delay(500);void Dunxia_bf_Left_Move()uchar i;for(i=0;i0;i-)Uart_Send(walk_zuo_2);Uart_Send(45+3*i);Delay(2);Uart_Send(walk_you_2);Uart_Send(65-3*i);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-i);Delay(2);Uart_Send(walk_you_4);Uart_Send(136+i);Delay(400);void Left_Move()uchar i;for(i=0;i0;i-)Uart_Send(walk_you_1);Uart_Send(20-i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30+i);Delay(500);Delay(2000);for(i=10;i0;i-)Uart_Send(walk_zuo_2);/左腿伸直Uart_Send(75+3*i);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(71-2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(40+i);Delay(2);Uart_Send(walk_zuo_1);Uart_Send(142-2*i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143+2*i);Delay(2);/Uart_Send(walk_you_2);/右腿后蹬/Uart_Send(65-3*i);/Delay(2);Uart_Send(walk_you_3);Uart_Send(103+i);Delay(2);Uart_Send(walk_you_4);Uart_Send(136+i);Delay(2);Uart_Send(walk_you_1);Uart_Send(30-i);Delay(2);Uart_Send(walk_you_5);Uart_Send(20+i);Delay(500);Delay(5000);for(i=0;i0;i-)Uart_Send(walk_zuo_1);Uart_Send(142-i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143-i);Delay(2);Uart_Send(walk_you_2);Uart_Send(35-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(113+2*i);Delay(2);Uart_Send(walk_you_4);Uart_Send(146+2*i);Delay(2);Delay(500);Delay(5000);void kick_ball()uchar i;for(i=0;i11;i+)/重心左移Uart_Send(walk_zuo_1);Uart_Send(142-2*i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143-2*i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30-2*i);Delay(500);Delay(10000);for(i=0;i11;i+)/向后方抬起右腿Uart_Send(walk_you_2);Uart_Send(65+5*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(91+2*i);Delay(2);Delay(1000);Delay(20000);for(i=0;i4;i+)/向前踢大腿Uart_Send(walk_you_2);Uart_Send(15+20*i);/Delay(2000);/Delay(20000);for(i=0;i6;i+)/向前踢小腿部分Uart_Send(walk_y
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《谈时间》梁实秋课件
- 亲有过谏使更课件
- 护理人员生物污染预防
- 经济管理系工作总结
- 公司级安全培训频率课件
- 公司级安全培训模板课件
- 零售行业招聘年终总结
- 青年医生病历汇报
- 语言表演教学汇报
- 舌系带过短护理
- 剪切工技能理论考试题库(含答案)
- 塔吊月检表优质资料
- 污水改排工程监理实施细则
- 石材检测报告2023
- 高三上学期体育单招考试英语模拟卷3
- DB37-T 1997.1-2019.物业服务规范 第1部分:通则
- DLT 1055-2021 火力发电厂汽轮机技术监督导则
- 安全(文明施工)检查记录表
- 通信光缆线路工程安全技术交底大全
- 综合实践活动:我们身边的一次性物品PPT通用课件
- 圆木桩护岸施工组织设计
评论
0/150
提交评论