




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/*舞蹈机器人程序*作者 : 梦想科技 * 老高* Email:9902013327* 单片机采用AT89S52晶振频率为:12.00MHz/*/#include <AT89X55.H>/51 芯片管脚定义头文件#include <intrins.h>/ 内部包含延时函数 _nop_()#define uchar unsigned char#define uint unsigned int串行数据输入移位时钟脉冲 输出锁存器控制脉冲/ 步骤标记/ 同时工作的电数sbit SDATA_595=P 39 ; / sbit SCLK_595 =P 3八1 ; / sbit R
2、CK_595 =P 3八6 ; / uchar run=0; uchar num=0;uchar i;sbit inO=P MO; sbit in仁P IM; sbit in2=P 1八2; sbit in3=P 1八3; sbit in4=P 1M; sbit in5=P 1八5; sbit in6=P 1八6; sbit in7=P 1八7; sbit in8=P 09;unsigned char stateO_A=O; unsigned char state0_B=0; unsigned char state1_A=0; unsigned char state1_B=0; unsigne
3、d char state2_A=0; unsigned char state2_B=0; unsigned char state3_A=0; unsigned char state3_B=0; unsigned char state4_A=0; unsigned char state4_B=0; unsigned char state5_A=0;/0 的状态 0 的状态 1 的状态 1 的状态定义电机 定义电机 定义电机 定义电机 定义电机 2 的状态定义电机 2 的状态 定义电机 3 的状态 定义电机 3 的状态 定义电机 4 的状态 定义电机 4 的状态 定义电机 5 的状态ABABABA
4、BABAunsigned char state5_B=0; unsigned char state6_A=0; unsigned char state6_B=0; /unsigned char state7_A=0; /unsigned char state7_B=0; /unsigned char state8_A=0; /unsigned char state8_B=0;/定义电机 定义电机 定义电机 定义电机 定义电机5 的状态6 的状态6 的状态7 的状态7的状态定义电机 8 的状态 定义电机 8 的状态BABABABunsigned int temp=0xffff; unsigned
5、 int temp_595; unsigned int temp_0; unsigned int temp_1; unsigned int temp_2; unsigned int temp_3; unsigned int temp_4; unsigned int temp_5; unsigned int temp_6; unsigned int temp_7; unsigned char P17_temp; unsigned char P17_flag; unsigned int num_0=0xffff; unsigned int num_1=0xffff; unsigned int nu
6、m_2=0xffff; unsigned int num_3=0xffff; unsigned int num_4=0xffff; unsigned int num_5=0xffff; unsigned int num_6=0xffff; /unsigned int num_7=0xffff; /unsigned int num_8=0xffff; unsigned int count_0=0; unsigned int count_1=0; unsigned int count_2=0; unsigned int count_3=0; unsigned int count_4=0; unsi
7、gned int count_5=0; unsigned int count_6=0; /unsigned int count_7=0; /unsigned int count_8=0;void WR_595();void OUT_595();void scan();void start_595(void);void stop(void);void moto0(unsigned char s0); void moto1(unsigned char s1); void moto2(unsigned char s2); void moto3(unsigned char s3); void moto
8、4(unsigned char s4); void moto5(unsigned char s5); void moto6(unsigned char s6); void moto7(unsigned char s7); void scan0(unsigned int n0); void scan1(unsigned int n1); void scan2(unsigned int n2); void scan3(unsigned int n3); void scan4(unsigned int n4); void scan5(unsigned int n5); void scan6(unsi
9、gned int n6); void scan7(unsigned int n7);void delay50ms(int ms);/*/*将显示数据送入74HC595内部移位寄存器/*/*/void WR_595(void) uchar j ; temp_595=temp;for (j=0 ;j<16 ;j+)temp_595=temp_595<<1 ;SDATA_595=CY ;SCLK_595=1 ;_nop_() ;_nop_() ;SCLK_595=0 ;/上升沿发生移位/*/* 将移位寄存器内的数据锁存到输出寄存器并显示/*/*/void OUT_595(void)
10、RCK_595=0 ;_nop_() ;_nop_() ;RCK_595=1 ;_nop_() ;_nop_() ;_nop_() ;RCK_595=0 ; /上升沿将数据送到输出锁存器/*/* 595 开启子程序 */*/void start_595(void)WR_595();OUT_595();_nop_() ;/*/ /* 停止子程序 */ /*/ void stop(void) temp=0xffff;WR_595();器OUT_595();_nop_() ;/*/ /* 延时子程序 */ /*/ void delay50ms(int ms)int k ;while(ms-)for(
11、k=12500; k>0 ; k-)_nop_() ;_nop_() ;_nop_() ;_nop_() ;/取数据/ 把数据写入 595 的寄存/*/ /*/* 0-关电机 /关某位用 1 或,其他位为 0*/* 1-正转 /开某位用 0 与,其他位为 1*/* 2-反转*/开关电机*/*/void moto0(unsigned char s0)break ;switch(s0) /break ;/break ;/case 0: temp_0=temp; temp_0|=0x0003; temp=temp_0; 关电机case 1: temp_0=temp; temp_0&=0
12、xfffe; temp=temp_0; 正转case 2: temp_0=temp; temp_0&=0xfffd; temp=temp_0; 反转void moto1(unsigned char s1)break ;switch(s1) /break ;/break ;/case 0: temp_1=temp; temp_1|=0x000c; temp=temp_1; 关电机case 1: temp_1=temp; temp_1&=0xfffb; temp=temp_1; 正转case 2: temp_1=temp; temp_1&=0xfff7; temp=temp
13、_1; 反转void moto2(unsigned char s2)break ;switch(s2) /break ;/break ;/case 0: temp_2=temp; temp_2|=0x0030; temp=temp_2; 关电机case 1: temp_2=temp; temp_2&=0xffef; temp=temp_2; 正转case 2: temp_2=temp; temp_2&=0xffdf; temp=temp_2; 反转void moto3(unsigned char s3) switch(s3) /break ;break ;/case 0: te
14、mp_3=temp; temp_3|=0x00c0; temp=temp_3; 关电机case 1: temp_3=temp; temp_3&=0xffbf; temp=temp_3; 正转case 2: temp_3=temp; temp_3&=0xff7f; temp=temp_3; break ; / 反转void moto4(unsigned char s4)break ;switch(s4) /break ;/break ;/case 0: temp_4=temp; temp_4|=0x0300; temp=temp_4; 关电机case 1: temp_4=temp
15、; temp_4&=0xfeff; temp=temp_4; 正转case 2: temp_4=temp; temp_4&=0xfdff; temp=temp_4; 反转void moto5(unsigned char s5)break ;switch(s5) /break ;/break ;/case 0: temp_5=temp; temp_5|=0x0c00; temp=temp_5; 关电机case 1: temp_5=temp; temp_5&=0xfbff; temp=temp_5; 正转case 2: temp_5=temp; temp_5&=0x
16、f7ff; temp=temp_5; 反转void moto6(unsigned char s6)break ;switch(s6) /break ;/break ;/case 0: temp_6=temp; temp_6|=0x3000; temp=temp_6; 关电机case 1: temp_6=temp; temp_6&=0xefff; temp=temp_6; 正转case 2: temp_6=temp; temp_6&=0xdfff; temp=temp_6; 反转void moto7(unsigned char s7)break ;switch(s7) /brea
17、k ;/break ;/case 0: temp_7=temp; temp_7|=0xc000; temp=temp_7; 关电机case 1: temp_7=temp; temp_7&=0xbfff; temp=temp_7; 正转case 2: temp_7=temp; temp_7&=0x7fff; temp=temp_7; 反转/*/*/*/*/*脉冲电机控制num_i- 输入电机的转动角数 state0_B- 前一个电平状态 state0_A- 当前电平状态 /*/*/*/*/*/void scan0(unsigned int n0) num_0=n0;void sc
18、an1(unsigned int n1) num_1=n1;void scan2(unsigned int n2) num_2=n2; void scan3(unsigned int n3) num_3=n3; void scan4(unsigned int n4) num_4=n4; void scan5(unsigned int n5) num_5=n5;void scan6(unsigned int n6) num_6=n6;/* void scan7(unsigned int n7) num_7=n7; void scan8(unsigned int n5) num_5=n5; */v
19、oid scan(void)/* 第 0 个扫描*/state0_B=state0_A;_nop_() ;state0_A=in0;if(state0_A!=state0_B) /count_0+;if(count_0>num_0)判断是否有电平跳变moto0(0); start_595(); count_0=0; num-; num_0=0xffff;/* 第一个扫描*/state1_B=state1_A;_nop_() ;state1_A=in1; if(state1_A!=state1_B) / 判断是否有电平跳变count_1+; if(count_1>num_1) mot
20、o1(0); start_595(); count_1=0; num-; num_1=0xffff;第二个扫描/*/state2_B=state2_A;_nop_() ;state2_A=in2;if(state2_A!=state2_B) / 判断是否有电平跳变count_2+; if(count_2>num_2) moto2(0); start_595(); count_2=0; num-; num_2=0xffff;/*/第三个扫描state3_B=state3_A;_nop_() ;state3_A=in3;if(state3_A!=state3_B) / count_3+;if
21、(count_3>num_3) 判断是否有电平跳变moto3(0); start_595(); count_3=0; num-; num_3=0xffff;/*第四个扫描 */ state4_B=state4_A;_nop_() ;state4_A=in4;if(state4_A!=state4_B) /判断是否有电平跳变count_4+; if(count_4>num_4) moto4(0); start_595(); count_4=0; num-; num_4=0xffff;/*/第五个扫描state5_B=state5_A;_nop_() ;state5_A=in5;if(
22、state5_A!=state5_B) / 判断是否有电平跳变count_5+; if(count_5>num_5) moto5(0); start_595(); count_5=0; num-; num_5=0xffff;/*/第六个扫描state6_B=state6_A;_nop_() ;state6_A=in6;if(state6_A!=state6_B) / count_6+;if(count_6>num_6) 判断是否有电平跳变P2=0xff; count_6=0; num-; num_6=0xffff;/* 第七个扫描*state7_B=state7_A;_nop_()
23、 ;state7_A=in7; if(state7_A!=state7_B) / 判断是否有电平跳变count_7+;if(count_7>num_7)start_595(); moto7(0); count_7=0; num-; num_7=0xffff;/*第八个扫描state8_B=state8_A;_nop_() ;state8_A=in8;if(state8_A!=state8_B) / 判断是否有电平跳变count_8+; if(count_8>num_5) P2=0xff; count_8=0; num-; num_5=0xffff;*/*/ /* 主程序 */ /*
24、/ void main(void) SCLK_595=0 ;RCK_595=1 ;stop(); run=0;P17_flag=1; while(1) while(P17_flag) switch(run)/0-111111110 95011111011/2-411119501111950P17_temp=P1;P17_temp |=0x7f; if(P17_temp=0x7F)P17_flag=0;case 0:秒, 双手向前伸直,与身体成 90 度 num=2;moto0(1); scan0(950); 电机 0 正转 950 moto1(1); scan1(950); 电机 1 正转 9
25、50 start_595(); while(num>0) scan(); delay50ms(1); num=2;秒, 双手向侧展开与肩水平 moto2(1); scan2(950);电机 2 正转 950 moto3(2);电机 3 反转 950 start_595(); while(num>0) delay50ms(1); run+;break ;/1111/1111950/111111111111111111 1110case 1:scan3(950);scan();num=2;/ 正在工作的电数moto0(2);moto1(2);start_595();2scan0(950
26、);scan1(950);while(num>0) scan();delay50ms(1);num=1;/ 放下右手moto3(1); scan3(950);start_595();while(num>0) scan();/11111111 0111/ 把手放delay50ms(1);num=1;/ 放下左手moto2(2); scan2(950);start_595();while(num>0) scan();delay50ms(1);run+;break ;case 2:/5-8 秒,右手向前伸直,与身体成 90 度, 同时头向右 90度 num=1;moto0(1);
27、scan0(950);start_595();while(num>0) scan(); delay50ms(1); run+;break ;case 3:/ 右手向侧展开与肩水平,然后右手再向前伸直同时头向左 num=2; moto3(2); scan3(950); moto4(2); scan4(600); start_595(); while(num>0) scan(); delay50ms(1); num=2; moto1(1); scan1(950); moto4(1); scan4(600); start_595(); while(num>0) scan(); de
28、lay50ms(1); num=2; moto2(1); scan2(950);scan4(600); / 向左 90 度 start_595();while(num>0) scan(); delay50ms(1); run+;moto4(1);/90度头向右/ 向左 90 度break ;case 4:/9-10 秒,保持前面动作同时左手向后伸,与身体成 60 度 num=3;moto1(2); scan1(1450);moto3(1);moto2(2); scan2(950);scan3(950);/ moto4(2);scan4(600);start_595();while(num
29、>0) scan(); delay50ms(1);run+;break ;/11-14case 5:秒,原地转逆时针一圈moto7(2);moto6(1); /scan6(5000);/scan7(5000);start_595();/delay50ms(37);for(i=3;i>0;i-)P2=0xeb;/小手往下delay50ms(3);P2=0xff;/ delay50ms(1);P2=0xd7;/小手往上delay50ms(6);P2=0xff;P2=0xeb;/小手往下delay50ms(3);P2=0xff;/ delay50ms(1);P2=0xf7; delay5
30、0ms(1);P2=0xff; delay50ms(1);num=1;moto4(2); scan4(600);moto6(0);moto7(0);start_595();while(num>0) scan(); delay50ms(1);num=2;/小手往上/15-17 秒,全部复位moto0(2); scan0(950);moto1(1);scan1(500); start_595(); while(num>0) scan(); delay50ms(1);run+;break ;case 6:num=2;/双手做叉腰状moto3(2);moto2(1); scan2(400)
31、;scan3(400); start_595(); while(num>0) scan(); delay50ms(1);num=1;/上身向左扭 45 度moto5(1); scan5(1100);start_595();while(num>0) scan();delay50ms(2);num=1;/然后再向右扭 90 度moto5(2); scan5(2200); start_595();while(num>0) scan();delay50ms(2);num=1;/然后再向左扭 90 度moto5(1); scan5(1200); start_595();while(nu
32、m>0) scan();delay50ms(2);run+;break ;/18-19case 7: 秒,全部复位num=2;叉腰状复位moto2(2); scan2(400);moto3(1); scan3(400);start_595();while(num>0) scan();delay50ms(3);run+;break ;case 8:/20-24 秒,双手向两侧打开,稍向后,同时做弯腰状num=4;moto2(1); scan2(970);moto3(2);scan3(970);moto0(1); scan0(970);moto1(1);scan1(970);start
33、_595();while(num>0) scan(); delay50ms(1);num=1;的姿势),身体顺时针旋转/ 弯腰状(如飞翔2圈P2=0xfd; scan6(800); while(num>0) scan();/delay50ms(2);P2=0xeb;/ 小手往下/弯腰delay50ms(2);P2=0xff;num=1;状复位/ 转头moto4(2); scan4(600); start_595(); while(num>0) scan();moto6(2); /scan6(5000);moto7(1); /scan7(5000);start_595();de
34、lay50ms(36);num=1;moto4(1); scan4(600); start_595(); while(num>0) scan(); moto6(0);moto7(0);start_595();delay50ms(1); num=1;/ 顺时针旋转 1/转头P2=0xfe; scan6(800); while(num>0) scan();/delay50ms(2);P2=0xd7;/ 小手往上delay50ms(2);P2=0xff; run+;break ;case 9: 左手向前伸直, 与身体成 后放下num=4;/ 25-28 秒,双手放下,90度,然后向侧展开
35、与肩水平同时把头向左 90 度,然moto3(1);moto1(2);/ 双手放下 moto2(2); scan2(950);scan3(930);moto0(2); scan0(940);scan1(940);start_595();while(num>0) scan();delay50ms(1);/ 左手向前伸直num=1;与身体成 90 度moto1(1); scan1(950);start_595();while(num>0) scan(); delay50ms(1);/num=2; 然后向侧展开与肩水平同时把头向左 90 度moto2(1); scan2(950);mot
36、o4(1); scan4(600); start_595();while(num>0) scan(); delay50ms(1);num=3;/然后放下scan2(950);scan4(600);scan1(950);moto2(2);moto4(2);moto1(2);start_595();while(num>0) scan();delay50ms(1); num=1;/左手向前伸直与身体成 90 度moto0(1); scan0(950); start_595();while(num>0) scan();delay50ms(1);num=2;/ 然后向侧展开与肩水平同时
37、把头向左 90 度 moto3(2); scan3(950); moto4(2); scan4(600); start_595();while(num>0) scan(); delay50ms(1);num=3;/ 然后放下scan3(940);scan4(600);scan0(950);moto3(1);moto4(1);moto0(2);start_595();while(num>0) scan();delay50ms(1);run+;break ;case 10: /29-33 秒,双手向侧展开与肩水平, 然后双 手向前伸直,与身体成 90 度,再双手向侧展开与肩水平,然后双
38、手向前伸直与 身体成 90 度,然后全部复位。/ 双手num=4;向侧展开与肩水平/ 再moto2(1); scan2(970);scan3(970);moto3(2);moto0(1); scan0(980);moto1(1);start_595();while(num>0) scan();delay50ms(2); num=2;90度moto2(2); scan2(950);scan3(950); start_595(); while(num>0) scan(); delay50ms(2); num=2;scan1(980);/ 然后双手向前伸直,与身体成moto3(1);双手
39、向侧展开与肩水平moto2(1); scan2(950);moto3(2);scan3(950); start_595(); while(num>0) scan(); delay50ms(2);后双手向前伸直与身体成moto3(1);num=4;90 度 然后全部复位 moto2(2); scan2(950); scan3(950);moto0(2); scan0(950);moto1(2);start_595();while(num>0) delay50ms(2);run+;scan1(950);scan();/ 然break ;case 11:秒,双手向侧展开与肩水平然后上身向
40、右扭45度,再向左扭 90 度,/34-38重复一次双手向侧展开与肩水平moto3(2);向左扭 45 度再向右扭 90 度再向左扭 45 度break ;num=2;/ 再moto2(1); scan2(600); scan3(600);start_595();while(num>0) scan();delay50ms(1);num=1;moto5(2); scan5(1200);start_595();while(num>0) scan();delay50ms(2);num=1;moto5(1); scan5(2400); start_595();while(num>0)
41、 scan();delay50ms(2);num=1;moto5(2); scan5(1300);start_595();while(num>0) scan();delay50ms(2);run+;/上身然后然后放下,双手向侧展开与肩水平,case 12:后双手向侧展开与肩水平,逆时针旋转/39-43 秒,全部复位, 放下重复,同时身体/num=2;手放下moto3(1);/ moto7(2);moto7(2);双手向侧展开与肩水平moto3(2);moto7(2);手放下moto3(1);moto7(2);moto2(2); scan2(590); scan3(580);/ moto6
42、(1);/逆时针旋转start_595();while(num>0)/ delay50ms(2);moto6(1);start_595(); for(i=3;i>0;i-) num=2;scan();/逆时针旋转/moto2(1); scan2(800); scan3(800);moto6(1); /start_595();while(num>0) scan();delay50ms(3);num=2;moto2(2); scan2(800); scan3(800);moto6(1); /start_595();while(num>0) scan();delay50ms(
43、3); moto6(0); moto7(0); start_595();delay50ms(1); run+;逆时针旋转逆时针旋转/状复位break ; case 13:/44-47 秒,双手向后伸,与身体成 60 度,然后前进 2 秒 /moto1(2);moto7(2);num=3;moto0(2); scan0(500);scan1(500); P2=0xfd; scan6(450); moto6(2); /start_595();while(num>0) scan();P2=0xeb; delay50ms(2);P2=0xff; delay50ms(18);num=3;前进/弯腰
44、moto1(1);break ; case 14: 秒,双手复位,双手向侧展开与肩水平同时抬头,然后后退 num=3;/48-532秒/ 再双手向侧展开与肩水平moto3(2);moto2(1); scan2(1000); scan3(1000);P2=0xfd; scan6(700);moto6(1); / 后退弯腰状moto7(1);P2=0xfe; scan6(450); moto0(1); scan0(500);scan1(500); moto6(0); moto7(0); start_595(); while(num>0) scan(); P2=0xd7; delay50ms(2)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024抚州幼儿师范高等专科学校辅导员招聘笔试真题
- 2025年铁路货物运输服务项目合作计划书
- 2025年金华市级机关基层遴选公务员考试试题【答案】
- 2025年经典心理健康知识竞赛考试练习题库(250题)【答案】
- 2025年教师资格证考试常考知识点归纳总结【答案】
- 2025年吉林通化市东昌区事业单位招聘考试笔试试题【答案】
- 2025年精密陶瓷劈刀项目合作计划书
- 2025年南通市少年宫选聘教师考试笔试试题【答案】
- 消费升级视域下体育用品制造业高质量发展的内在机理、现实困境及推进路径
- 2025年电子计步器实验分析仪器项目合作计划书
- 2025年北京市中考数学真题试卷及答案
- 硬笔书法全册教案共20课时
- 车辆转让及新能源充电桩安装与运营服务合同
- 2025年视觉传达设计考试试题及答案解析
- 北京昌平霍营街道社区“两委”干部储备人才招募笔试真题2024
- 贷款逾期催收保证合同范本
- 2025至2030中国邻氨基苯甲酸市场发展趋势及未来前景展望报告
- 中心血站培训课件
- 2025至2030中国现金支付行业发展分析及投资风险预警与发展策略报告
- DB 5201∕T 152.2-2025 交通大数据 第2部分:数据资源目录
- 2025-2030中国建筑项目管理软件行业应用状况与需求趋势预测报告
评论
0/150
提交评论