版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、/* 舞蹈機器人程序* 作者 :夢想科技*老高* 單片機采用AT89S52,晶振頻率為:12.00MHz。/*/ #include <AT89X55.H>/51芯片管腳定義頭文件#include <intrins.h> /內(nèi)部包含延時函數(shù) _nop_()#define uchar unsigned char#define uint unsigned intsbit SDATA_595=P30 ; /串行數(shù)據(jù)輸入sbit SCLK_595 =P31 ; /移位時鐘脈沖sbit RCK_595 =P36 ; /輸出鎖存器控制脈沖 uchar run=0; /步驟標(biāo)記ucha
2、r num=0; /同時工作的電數(shù)uchar i;sbit in0=P10;sbit in1=P11;sbit in2=P12;sbit in3=P13;sbit in4=P14;sbit in5=P15;sbit in6=P16;sbit in7=P17;sbit in8=P00;unsigned char state0_A=0;/定義電機0的狀態(tài)Aunsigned char state0_B=0;/定義電機0的狀態(tài)B unsigned char state1_A=0;/定義電機1的狀態(tài)Aunsigned char state1_B=0;/定義電機1的狀態(tài)B unsigned char st
3、ate2_A=0;/定義電機2的狀態(tài)Aunsigned char state2_B=0;/定義電機2的狀態(tài)Bunsigned char state3_A=0;/定義電機3的狀態(tài)Aunsigned char state3_B=0;/定義電機3的狀態(tài)Bunsigned char state4_A=0;/定義電機4的狀態(tài)Aunsigned char state4_B=0;/定義電機4的狀態(tài)Bunsigned char state5_A=0;/定義電機5的狀態(tài)Aunsigned char state5_B=0;/定義電機5的狀態(tài)Bunsigned char state6_A=0;/定義電機6的狀態(tài)Au
4、nsigned char state6_B=0;/定義電機6的狀態(tài)B/unsigned char state7_A=0;/定義電機7的狀態(tài)A/unsigned char state7_B=0;/定義電機7的狀態(tài)B/unsigned char state8_A=0;/定義電機8的狀態(tài)A/unsigned char state8_B=0;/定義電機8的狀態(tài)Bunsigned int temp=0xffff;unsigned int temp_595;unsigned int temp_0;unsigned int temp_1;unsigned int temp_2;unsigned int te
5、mp_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 num_2=0xffff;unsigned int num_3=0xffff;unsigned int num_4=0xffff;unsigned int num_5=0xffff;unsigned int
6、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;unsigned int count_5=0;unsigned int count_6=0;/unsigned int count_7=0;/unsigned int count_8=0; void WR_595(); void OUT
7、_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 moto4(unsigned char s4); void moto5(unsigned char s5); void moto6(unsigned char s6); void moto7(unsigned char s7);
8、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(unsigned int n6); void scan7(unsigned int n7); void delay50ms(int ms);/*/*將顯示數(shù)據(jù)送入74HC595內(nèi)部移位寄存器 */*/void WR_595(voi
9、d) uchar j ; temp_595=temp; for (j=0 ;j<16 ;j+) temp_595=temp_595<<1 ; SDATA_595=CY ; SCLK_595=1 ; /上升沿發(fā)生移位 _nop_() ; _nop_() ; SCLK_595=0 ; /*/*將移位寄存器內(nèi)的數(shù)據(jù)鎖存到輸出寄存器并顯示 */*/ void OUT_595(void) RCK_595=0 ; _nop_() ; _nop_() ; RCK_595=1 ; /上升沿將數(shù)據(jù)送到輸出鎖存器 _nop_() ; _nop_() ; _nop_() ; RCK_595=0 ;
10、/*/* 595開啟子程序 */*/ void start_595(void) WR_595();OUT_595();_nop_() ; /*/* 停止子程序 */*/ void stop(void) temp=0xffff; /取數(shù)據(jù) WR_595(); /把數(shù)據(jù)寫入595的寄存器 OUT_595(); _nop_() ; /*/* 延時子程序 */*/void delay50ms(int ms) int k ; while(ms-) for(k=12500; k>0 ; k-) _nop_() ; _nop_() ; _nop_() ; _nop_() ; /*/* 開關(guān)電機 */*
11、 0-關(guān)電機 /關(guān)某位用 1 或,其他位為0 */* 1-正轉(zhuǎn) /開某位用 0 與,其他位為1 */* 2-反轉(zhuǎn) */*/void moto0(unsigned char s0) switch(s0)case 0: temp_0=temp; temp_0|=0x0003; temp=temp_0; break ; /關(guān)電機 case 1: temp_0=temp; temp_0&=0xfffe; temp=temp_0; break ; /正轉(zhuǎn)case 2:temp_0=temp; temp_0&=0xfffd; temp=temp_0; break ; /反轉(zhuǎn)void mot
12、o1(unsigned char s1) switch(s1)case 0: temp_1=temp; temp_1|=0x000c; temp=temp_1; break ; /關(guān)電機 case 1: temp_1=temp; temp_1&=0xfffb; temp=temp_1; break ; /正轉(zhuǎn)case 2:temp_1=temp; temp_1&=0xfff7; temp=temp_1; break ; /反轉(zhuǎn) void moto2(unsigned char s2) switch(s2)case 0: temp_2=temp; temp_2|=0x0030;
13、temp=temp_2; break ; /關(guān)電機 case 1: temp_2=temp; temp_2&=0xffef; temp=temp_2; break ; /正轉(zhuǎn)case 2:temp_2=temp; temp_2&=0xffdf; temp=temp_2; break ; /反轉(zhuǎn)void moto3(unsigned char s3) switch(s3)case 0: temp_3=temp; temp_3|=0x00c0; temp=temp_3; break ; /關(guān)電機 case 1: temp_3=temp; temp_3&=0xffbf; te
14、mp=temp_3; break ; /正轉(zhuǎn)case 2:temp_3=temp; temp_3&=0xff7f; temp=temp_3; break ; /反轉(zhuǎn)void moto4(unsigned char s4) switch(s4)case 0: temp_4=temp; temp_4|=0x0300; temp=temp_4; break ; /關(guān)電機 case 1: temp_4=temp; temp_4&=0xfeff; temp=temp_4; break ; /正轉(zhuǎn)case 2:temp_4=temp; temp_4&=0xfdff; temp=te
15、mp_4; break ; /反轉(zhuǎn)void moto5(unsigned char s5) switch(s5)case 0: temp_5=temp; temp_5|=0x0c00; temp=temp_5; break ; /關(guān)電機 case 1: temp_5=temp; temp_5&=0xfbff; temp=temp_5; break ; /正轉(zhuǎn)case 2:temp_5=temp; temp_5&=0xf7ff; temp=temp_5; break ; /反轉(zhuǎn)void moto6(unsigned char s6) switch(s6)case 0: temp_
16、6=temp; temp_6|=0x3000; temp=temp_6; break ; /關(guān)電機 case 1: temp_6=temp; temp_6&=0xefff; temp=temp_6; break ; /正轉(zhuǎn)case 2:temp_6=temp; temp_6&=0xdfff; temp=temp_6; break ; /反轉(zhuǎn)void moto7(unsigned char s7) switch(s7)case 0: temp_7=temp; temp_7|=0xc000; temp=temp_7; break ; /關(guān)電機 case 1: temp_7=temp
17、; temp_7&=0xbfff; temp=temp_7; break ; /正轉(zhuǎn)case 2:temp_7=temp; temp_7&=0x7fff; temp=temp_7; break ; /反轉(zhuǎn)/*/* 脈沖電機控制 */* num_i-輸入電機的轉(zhuǎn)動角數(shù) */* state0_B-前一個電平狀態(tài) */* state0_A-當(dāng)前電平狀態(tài) */*/void scan0(unsigned int n0) num_0=n0; void scan1(unsigned int n1) num_1=n1; void scan2(unsigned int n2) num_2=n2;
18、 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; */void scan(void)/* 第 0 個掃描 */state0_B=state0_A; _nop_() ;state0_A=i
19、n0;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)moto1(0);start_595();count_1=0;num-;num_1=0xffff; /* 第二個掃描 */ state
20、2_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(count_3>num_3)moto3(0);start_595();count_3=0;num-
21、;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(state5_A!=state5_B) /判斷是否有電平跳變 count_5+;if(count_5>num_5)mot
22、o5(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_() ;state7_A=in7;if(state7_A!=state7_B) /判斷是否有電平跳變 count_7+;if(co
23、unt_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; */*/* 主程序 */*/void main(void) SCLK_595=0 ; RCK_595=1 ;stop();run=0; P17_flag=1; wh
24、ile(1) while(P17_flag) P17_temp=P1;P17_temp |=0x7f;if(P17_temp=0x7F)P17_flag=0; switch(run) case 0: /0-1秒,雙手向前伸直,與身體成90度 num=2; moto0(1); scan0(950); /1111 11111 1111 1110 950 電機 0 正轉(zhuǎn)950 moto1(1); scan1(950); /1111 11111 1111 1011 950 電機 1 正轉(zhuǎn)950 start_595(); while(num>0) scan(); delay50ms(1); num
25、=2; /2-4秒,雙手向側(cè)展開與肩水平 moto2(1); scan2(950);/1111 1111 1110 1111 950 電機 2 正轉(zhuǎn)950 moto3(2); scan3(950); /1111 1111 0111 1111 950 電機 3 反轉(zhuǎn)950 start_595(); while(num>0)scan(); delay50ms(1); run+; break ; case 1: /把手放平 num=2; /正在工作的電數(shù) 2 moto0(2); scan0(950); moto1(2); scan1(950); start_595(); while(num&g
26、t;0) scan(); delay50ms(1); num=1; /放下右手 moto3(1); scan3(950); start_595(); while(num>0) scan(); 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); scan0(950); start_595(); while(n
27、um>0)scan(); delay50ms(1); run+; break ;case 3: /右手向側(cè)展開與肩水平,然后右手再向前伸直同時頭向左90度 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); /向左90度 start_595(); while(num>0)scan(); delay50ms(1); num=
28、2; moto2(1); scan2(950); moto4(1); scan4(600); /向左90度 start_595(); while(num>0) scan(); delay50ms(1); run+; break ;case 4: /9-10秒,保持前面動作同時左手向后伸,與身體成60度 num=3; moto1(2); scan1(1450); moto2(2); scan2(950); moto3(1); scan3(950); / moto4(2); scan4(600); start_595(); while(num>0)scan(); delay50ms(1
29、); run+; break ; case 5:/11-14秒,原地轉(zhuǎn)逆時針一圈 moto6(1); /scan6(5000); moto7(2); /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秒,全部復(fù)位 moto0(2); scan0(950); moto1(1); scan1(500); start_595(); while(num>0)scan(); delay50ms(1); run+; break ;case 6: num=2; /雙手做叉腰狀 moto2(1); scan2(400)
31、; moto3(2); 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); st
32、art_595(); while(num>0)scan(); delay50ms(2); run+; break ; case 7: /18-19秒,全部復(fù)位 num=2; /雙手叉腰狀復(fù)位 moto2(2); scan2(400); moto3(1); scan3(400); start_595(); while(num>0)scan(); delay50ms(3); run+; break ; case 8: /20-24秒,雙手向兩側(cè)打開,稍向后,同時做彎腰狀 num=4; moto2(1); scan2(970); moto3(2); scan3(970); moto0(1
33、); scan0(970); moto1(1); scan1(970); start_595(); while(num>0)scan(); delay50ms(1); num=1; /彎腰狀(如飛翔的姿勢),身體順時針旋轉(zhuǎn)2圈 P2=0xfd; scan6(800); while(num>0)scan(); /delay50ms(2); P2=0xeb;/小手往下 delay50ms(2); P2=0xff; num=1; / 轉(zhuǎn)頭 moto4(2); scan4(600); start_595(); while(num>0)scan(); moto6(2); /scan6(
34、5000);/順時針旋轉(zhuǎn)1圈 moto7(1); /scan7(5000); start_595(); delay50ms(36); num=1; / 轉(zhuǎn)頭 moto4(1); scan4(600); start_595(); while(num>0)scan(); moto6(0); moto7(0); start_595(); delay50ms(1); num=1; /彎腰狀復(fù)位 P2=0xfe; scan6(800); while(num>0)scan(); /delay50ms(2); P2=0xd7;/小手往上 delay50ms(2); P2=0xff; run+;
35、break ;case 9: / 25-28秒,雙手放下,左手向前伸直,與身體成90度,然后向側(cè)展開與肩水平同時把頭向左90度,然后放下 num=4; / 雙手放下 moto2(2); scan2(950); moto3(1); scan3(930); moto0(2); scan0(940); moto1(2); scan1(940); start_595(); while(num>0)scan(); delay50ms(1); num=1; /左手向前伸直與身體成90度 moto1(1); scan1(950); start_595(); while(num>0) scan()
36、; delay50ms(1); num=2; /然后向側(cè)展開與肩水平同時把頭向左90度 moto2(1); scan2(950); moto4(1); scan4(600); start_595(); while(num>0) scan(); delay50ms(1); num=3; /然后放下 moto2(2); scan2(950); moto4(2); scan4(600); moto1(2); scan1(950); start_595(); while(num>0) scan(); delay50ms(1); num=1; /左手向前伸直與身體成90度 moto0(1);
37、 scan0(950); start_595(); while(num>0) scan(); delay50ms(1); num=2; /然后向側(cè)展開與肩水平同時把頭向左90度 moto3(2); scan3(950); moto4(2); scan4(600); start_595(); while(num>0) scan(); delay50ms(1); num=3; /然后放下 moto3(1); scan3(940); moto4(1); scan4(600); moto0(2); scan0(950); start_595(); while(num>0) scan(
38、); delay50ms(1); run+; break ;case 10: /29-33秒,雙手向側(cè)展開與肩水平,然后雙手向前伸直,與身體成90度,再雙手向側(cè)展開與肩水平,然后雙手向前伸直與身體成90度,然后全部復(fù)位。 num=4; /雙手向側(cè)展開與肩水平 moto2(1); scan2(970); moto3(2); scan3(970); moto0(1); scan0(980); moto1(1); scan1(980); start_595(); while(num>0)scan(); delay50ms(2); num=2; /然后雙手向前伸直,與身體成90度 moto2(2); scan2(950); moto3(1); scan3(950); star
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度環(huán)境污染治理與修復(fù)合同
- 2024年版建筑項目合同樣本
- 永磁同步電機的課程設(shè)計
- 企業(yè)建筑施工安全生產(chǎn)管理制度匯編
- 花瓶插花課程設(shè)計
- 中國石化安全風(fēng)險評估指導(dǎo)意見
- 部編版八年級《道德與法治》上冊同步練習(xí)(全冊,含答案)
- 系統(tǒng)文件監(jiān)控課程設(shè)計
- 網(wǎng)紅飲料制作課程設(shè)計
- 股市基金課程設(shè)計
- 殘疾兒童(孤獨癥)康復(fù)服務(wù)機構(gòu)采購項目招標(biāo)文件
- 室內(nèi)墻地磚鋪貼施工技術(shù)交底
- 少先隊活動課《民族團結(jié)一家親-同心共筑中國夢》課件
- 廣西河池市2023-2024學(xué)年七年級上學(xué)期語文期末試卷(含答案)
- 江蘇省蘇州市(2024年-2025年小學(xué)五年級語文)統(tǒng)編版期末考試((上下)學(xué)期)試卷及答案
- 供應(yīng)鏈年終總結(jié)報告
- 體育訓(xùn)練服務(wù)行業(yè)市場調(diào)研分析報告
- 肝性腦病的護理課件-
- 2024年丟失物品索償協(xié)議書模板
- 2025年八省聯(lián)考新高考 語文試卷
- 建筑物拆除場地清理垃圾外運施工方案
評論
0/150
提交評論