詳細的解說在此,請自行吸收他人的知識: http://myiecs.iecs.fcu.edu.tw/upload/paper_uni/911pdf/910113.pdf 我回答:不必客氣 |
8051 受控端上的程式碼 DEMO EQU 20H RESET EQU 21H DEMOFNL EQU 22H ORG 0 LJMP START ORG 30H ;******************** ;* 初始化一切設定值 ;******************** START: MOV P1,#20H ;傳送燈亮起,傳送出0 MOV R7,#50 CALL DELAY MOV P0,#00H MOV P1,#80H MOV P2,#FFH MOV R0,#1 ;起始指標位置為1 並用以紀錄最後停留的指標位置 MOV R1,#0 ;紀錄總相激磁的大小(也就是激磁Talbe 的大小) MOV R2,#0 ;紀錄R1 所需再重複的次數(Table 重複次數) MOV R3,#0 ;一般暫存用 CLR DEMO CLR RESET CLR DEMOFNL ;DEMO 最後一步的指示旗標 ;**************************************** ;* 主程式,接收指令並適當的做出回應與動作 ;**************************************** OUTPUT: MOV A,P2 ANL A,#0FH JZ OUTPUT CALL Motor JB RESET,START JMP OUTPUT ;************************************************ ;* 依照指令跳至對應的副程式運作,必須使用CALL 呼叫 ;************************************************ Motor: $1: CJNE A,#1,$2 MOV DPTR,#Forward 66 of 74 MOV R1,#8 MOV R2,#80 JMP RUN $2: CJNE A,#2,$3 MOV DPTR,#Backward MOV R1,#8 MOV R2,#80 JMP RUN $3: CJNE A,#3,$4 MOV DPTR,#Left MOV R1,#8 MOV R2,#64 JMP RUN $4: CJNE A,#4,$5 MOV DPTR,#Right MOV R1,#8 MOV R2,#64 JMP RUN $5: CJNE A,#5,$6 ;DEMO1 SETB DEMO MOV A,#1 CALL $1 JB RESET,$INT MOV A,#3 CALL $3 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT MOV A,#3 CALL $3 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT MOV A,#3 CALL $3 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT 67 of 74 MOV A,#3 CALL $3 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT MOV A,#4 CALL $4 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT MOV A,#4 CALL $4 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT MOV A,#4 CALL $4 JB RESET,$INT MOV A,#1 CALL $1 JB RESET,$INT SETB DEMOFNL MOV A,#4 CALL $4 $INT: CLR DEMO CLR DEMOFNL RET $6: CJNE A,#6,$7 ;若Pause/Continue 在這時被按下將不做任何處理 JMP $F $7: CJNE A,#7,$8 ;若RESET 被按下 SETB RESET JMP $F $8: CJNE A,#8,$9 ;逆時針旋轉180 度 MOV DPTR,#Left MOV R1,#8 MOV R2,#128 JMP RUN 68 of 74 $9: CJNE A,#9,$A ;順時針旋轉180 度 MOV DPTR,#Right MOV R1,#8 MOVR2,#128 JMP RUN $A: CJNE A,#AH,$B ;未定義 $B: CJNE A,#BH,$C ;未定義 $C: CJNE A,#CH,$D ;未定義 $D: CJNE A,#DH,$E ;未定義 $E: CJNE A,#EH,$F ;未定義 $F: CALL TOUT ;若指令未定義則不做任何動作 CALL OVER RET ;********************************************** ;* 步進馬達驅動,R0 決定指標值在相激磁表中的位置 ;* R1 決定總驅動的相激磁數目,R2 決定R1 重複的次數 ;* 行程中會檢查暫停/繼續或停止有無被按下,行程 ;* 從Motor 跳過來因此最後會以RET 結束 ;********************************************** RUN: MOV R3,A CALL TOUT LOOP: MOV A,R1 SUBB A,R0 JNZ MotorStep MOV R0,#1 MotorStep: MOV A,R0 MOVC A,@A+DPTR MOV P0,A MOV A,P2 ANL A,#0FH JZ MotorNext CJNE A,#6,$1 ;若Pause/Continue 被按下 CALL TOUT CALL OVER CALL PCCHK JB RESET,$0 CALL TOUT JMP MotorNext 69 of 74 $1: CJNE A,#7,MotorNext SETB RESET CALL TOUT CALL OVER $0: RET MotorNext: CALL DELAYINI INC R0 DJNZ R2,LOOP JNB DEMO,$1 ;若正在演示中就判斷是否要傳送結束位元 JNB DEMOFNL,$2 ;DEMOFNL 被設定表示已達最後一步要傳送結束位元 $1: CALL OVER $2: RET ;************************************************** ;* 負責暫停/繼續的工作,當暫停時行程會被限制在此, ;* 並等待再次暫停指令到來才繼續,必須用CALL 呼叫 ;************************************************** PCCHK: ;Pause/Continue 的檢查機制 $waitp: MOV A,P2 ANL A,#0FH CJNE A,#7,$wait0 SETB RESET CALL TOUT CALL OVER RET $wait0: CJNE A,#6,$waitp ;等待控制端送出Continue 的指令(再次Pause) CALL TOUT CALL OVER MOV A,R3 RET ;***************************************** ;* 負責回傳結束位元使控制端能繼續下一指令 ;* 必須用CALL 呼叫 ;***************************************** OVER: MOV P1,#2FH CALL TDELAY MOV P1,#20H CALL TDELAY MOV P1,#80H 70 of 74 RET ;***************************************** ;* 傳送A 中的資料給控制端,必須使用CALL 呼叫 ;***************************************** TOUT: ADD A,#20H ;使傳送燈亮起的位元 JNB DEMO,$1 ADD A,#10H $1: MOV P1,A SUBB A,#20H ;將A 中的值恢復原狀 JNB DEMO,$2 SUBB A,#10H $2: CALL TDELAY MOV P1,#20H CALL TDELAY JNB DEMO,$3 MOV P1,#90H ;停止傳送,避免影響接收模組,DEMO 指示燈亮 RET $3: MOV P1,#80H ;停止傳送,避免影響接收模組 RET ;********************************************** ;* 傳送專用延遲,使本地端有足夠時間送出回傳值 ;* 給控制端,必須使用CALL 呼叫 ;********************************************** TDELAY: MOV R7,#15 JMP DELAY ;************************************************ ; 步進馬達專用延遲,必須使用CALL 呼叫 ;************************************************ DELAYINI: MOV R7,#4 DELAY: MOV R6,#10 D1: MOV R5,#249 D2: DJNZ R5,D2 DJNZ R6,D1 DJNZ R7,DELAY RET ;************************************************ ;* Motor Table ;************************************************ 71 of 74 Forward DB 45H,61H,29H,A8H,8AH,92H,16H,54H Backward DB 54H,16H,92H,8AH,A8H,29H,61H,45H Left DB 55H,11H,99H,88H,AAH,22H,66H,44H Right DB 44H,66H,22H,AAH,88H,99H,11H,55H END |
手機號碼大大: 這有8051 cotrol HT-12E & 接收HT-12D 的組合語言範例,請參考 8051 控制端上的程式碼 COUNTER REG 20H TRFLAG REG 21H ORG 0 LJMP START ORG 23H LJMP SERVICE ORG 30H ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ START: MOV P1,#00H MOV P2,#FFH CLR COUNTER CLR TRFLAG CLR R0 CLR R1 CLR R2 MOV TMOD,#20H MOV TH1,#FDH MOV SCON,#50H MOV IE,#10010000B SETB TR1 $LOOP: CLR R0 JNB R2,$RESET MOV A,P2 CPL A ANL A,#0FH JZ $LOOP CJNE A,R0,$1 MOV P1,#00H JMP $LOOP $RESET: MOV SBUF,#250 ;Tell PC that RESET has been pressed. SETB R2 SETB TRFLAG JMP $LOOP $1: MOV P1,#00H MOV R0,A $wait: JB TRFLAG,$wait MOV SBUF,A SETB TRFLAG JMP $LOOP ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ORG 100H SERVICE: JB TI,TRANS MOV B,SBUF MOV SBUF,B SETB TRFLAG MOV P1,B CLR RI RETI RSINVALID: RETI TRANS: CLR TRFLAG CLR TI RETI END |
HT-12D解碼IC有4個輸出腳位~ 平常是高電位~等到接收到發射端的訊號後變成低電位~ 小弟我不太懂的是這樣4個輸出腳位要如何運用在8051的IO腳位上呢? 又要如何運用在其他電路上呢? 請各位有經驗的大大多交島一下小弟我吧~ |
十分感謝~慢慢研究一下!! |
雖然我沒摸過SHY-J6122無線模組 大部份的解碼程式應該差不多 你自己看看有那幾行可以利用的 紅外遙控器進行解碼測試 ORG 0000H MAIN: MOV SP,#60H MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH JNB P3.2,$ ;等待遙控信號出現 MOV R6,#10 SB: ACALL YS1 ;呼叫882微秒延時子程式 JB P3.2,MAIN ;延時882微秒後判斷P3.2腳是否出現高電平如果有就離開解碼程式 DJNZ R6, SB ;重複10次,目的是偵測在8820微秒內如果出現高電平就離開解碼程式 ;以上完成對遙控信號的9000微秒的初始低電平信號的識別。 JNB P3.2, $ ;等待高電平避開9毫秒低電平引導脈衝 ACALL YS2 ;延時4.74毫秒避開4.5毫秒的結果碼 MOV R1,#1AH ;設定1AH為起始RAM區 MOV R2,#4 PP: MOV R3,#8 JJJJ: JNB P3.2,$ ;等待位址碼第一位的高電平信號 LCALL YS1 ;高電平開始後用882微秒的時間尺去判斷信號此時的高低電平狀態 MOV C,P3.2 ;將P3.2引腳此時的電平狀態0或1存入C中 JNC UUU ;如果為0就跳前往UUU JB P3.2,$ ;如果為1就等待高電平信號結束 UUU: MOV A,@R1 ;將R1中位址的給A RRC A ;將C中的值0或1移入A中的最低位 MOV @R1,A ;將A中的數暫時存放在R1中 DJNZ R3,JJJJ ;接收位址碼的高8位 INC R1 ;對R1中的值加1,換成下一個RAM DJNZ R2,PP ;接收完16位位址碼和8位數據碼和8位數據反碼,存放在1AH/1BH/1CH/1DH的RAM中 ;以下對代碼是否正確和定義進行識別 MOV A,1AH ;比較高8位位址碼 XRL A,#00000000B ;判斷1AH的值是否等於00000000,相等的話A為0 JNZ MAIN ;如果不相等說明解碼失敗離開解碼程式 MOV A,1BH ;比較低8位位址 XRL A,#11111111B ;再判斷高8位位址是否正確 JNZ MAIN ;如果不相等說明解碼失敗離開解碼程式 MOV A,1CH ;比較數據碼和數據反碼是否正確? CPL A XRL A,1DH ;將1CH的值取反後和1DH比較 不同則無效丟棄,核對數據是否準確 JNZ MAIN ;如果不相等說明解碼失敗離開解碼程式 LCALL SOUND ;解碼成功,聲音提示 MOV A,1AH CPL A MOV P1,A ;遙控碼十六進位值通過P1口LED顯示出來 ;-------- 下面為0~9鍵碼判斷並在實驗板的5位數碼管中顯示鍵值 -------- JZPD: MOV A,1AH IRD0: CJNE A,#00H,IRD1 ;按鍵"0"判斷顯示 MOV P0,#0C0H MOV P2,#11100000B AJMP MAIN IRD1: CJNE A,#01H,IRD2 ;按鍵"1"判斷顯示 MOV P0,#0F9H MOV P2,#11100000B AJMP MAIN IRD2: CJNE A,#02H,IRD3 ;按鍵"2"判斷顯示 MOV P0,#0A4H MOV P2,#11100000B AJMP MAIN IRD3: CJNE A,#03H,IRD4 ;按鍵"3"判斷顯示 MOV P0,#0B0H MOV P2,#11100000B AJMP MAIN IRD4: CJNE A,#04H,IRD5 ;按鍵"4"判斷顯示 MOV P0,#99H MOV P2,#11100000B AJMP MAIN IRD5: CJNE A,#05H,IRD6 ;按鍵"5"判斷顯示 MOV P0,#92H MOV P2,#11100000B AJMP MAIN IRD6: CJNE A,#06H,IRD7 ;按鍵"6"判斷顯示 MOV P0,#82H MOV P2,#11100000B AJMP MAIN IRD7: CJNE A,#07H,IRD8 ;按鍵"7"判斷顯示 MOV P0,#0F8H MOV P2,#11100000B AJMP MAIN IRD8: CJNE A,#08H,IRD9 ;按鍵"8"判斷顯示 MOV P0,#80H MOV P2,#11100000B AJMP MAIN IRD9: CJNE A,#09H,IRDOR ;按鍵"9"判斷顯示 MOV P0,#90H MOV P2,#11100000B AJMP MAIN IRDOR: MOV P2,#0FFH ;關閉數碼管使能。"0~9"以外的非數字功能按鍵鍵值不採用數碼管顯示,直接從P1口輸出鍵值 AJMP MAIN YS1: MOV R4,#19 ;延時子程式1 D1: MOV R5,#18 DJNZ R5,$ DJNZ R4,D1 RET YS2: MOV R4,#10 ;延時子程式2 D2: MOV R5,#216 DJNZ R5,$ DJNZ R4,D2 RET SOUND: MOV R7,#228 ;音效延時子程式 SDL1: CPL P3.7 MOV R6,#0FFH SDL0: DJNZ R6,SDL0 DJNZ R7,SDL1 RET |
今天又將8051配合315M無線模組重新排版製出~ 控制板是用8051加上16個伺服馬達控制排針接頭外掛無線模組組成的~ 再用HT-12D跟12E來做解碼跟編碼的動作! 遙控板跟接收板都可以正常發送跟接收~ 有用電表量出HI~LO訊號! 但想請問各位大大當HI-LO訊號進入8051的IO腳位時~ 組合語言要怎麼宣告怎麼寫語法來用遙控控制各路的伺服馬達? ORG 0000H JMP START ;============================= S1 EQU 30H S2 EQU 31H ;============================= ;計時/計數器0中斷副程式 ;============================= ORG 000BH TIMER0: PUSH ACC ;將ACC暫存器之資料放置於堆疊區 CLR TF0 ;將TF0中斷要求先清除 MOV TH0,#0FFH ;手動載入TH0及TL0的值 MOV TL0,#64H ; INC R0 ;中斷一次就把R0加1 CYCLE: CJNE R0,#200,SERVO1 ;判斷R0是否為200,不是,則跳至SERVO1執行 MOV R0,#0 ;若R0=200,則將R0清為0 SETB P2.0 ;若R0=200,則將PWM1.PWM2設為Hi SETB P2.1 JMP GOBACK SERVO1: MOV A,R0 XRL A,S1 ;判斷R0是否等於S1 JNZ SERVO2 ;若R0不等於S1則跳至SERVO2 CLR P2.0 ;若R0=S1,則將PWM1設為Lo SERVO2: MOV A,R0 XRL A,S2 ;判斷R0是否等於S2 JNZ GOBACK ;若R0不等於S2則跳至GOBACK CLR P2.1 ;若R0=S2,則將PWM2設為Lo GOBACK: POP ACC ;將ACC暫存器之資料從堆疊區取回 RETI ;=============================== ; 主程式 ;=============================== START: MOV S1,#15 MOV S2,#15 MOV TMOD,#00000001B ;設定計時計數器0工作於計時模式1,如圖 所示. MOV TH0,#0FFH ;設定0.1ms中斷一次 MOV TL0,#64H SETB EA ;中斷致能(打開中斷總開關) SETB ET0 ;計時/計數器0的中斷致能 SETB TR0 ;計時/計數器0開始工作 LOOP: MOV S1,#15 MOV S2,#15 CALL DELAY MOV S1,#21 MOV S2,#9 CALL DELAY MOV S1,#15 MOV S2,#15 CALL DELAY MOV S1,#9 MOV S2,#21 CALL DELAY JMP LOOP ;========================= ;延時副程式(延時1秒) ;========================= DELAY: MOV R5,#15 ;重複10次 DL1: MOV R6,#250 ;延時0.1秒 DL2: MOV R7,#200 DL3: DJNZ R7,DL3 DJNZ R6,DL2 DJNZ R5,DL1 RET END 不知要如何加入無線模組的控制部分?? |
G大說得是接收端還是發射端接收端用HT-12D沒按鈕但有4各輸入腳位~發射端用HT-12E有四各按鈕 |
如何將SHY-J6122無線模組銜接8051伺服馬達控制版 就是用一般的I/O去接就好<--HT-12原來接按鈕接51的Portx就好。 |
便宜的東西有他好用的地方,比如75元的9g的Servo,拿來玩玩電動遙控飛機OK啦!拿來玩機器人就可能力有未逮。90~數千的servo都用過,都要看機構的條件來取捨。 這類需要解編碼IC的無線系統做做簡單的I/O控制還可以,但是將來想要玩到遠端控制和數據傳輸監控就會鎚心肝,手上有個數據無線絕對可以省很多時間,而且可以玩很多應用。用這類做鐵捲門控制一類的應用的設備,用到最後只會走一堆冤枉路。自己參考斟酌囉。 |
那組G大介紹的無線模組我下訂單了但是回歸到正題之前的東西買了總不能放著不用吧....所以還是拜託知道這方面整合系統的人能幫幫忙~或著提供意見還是一些資料小弟會很感激的~ |
我只是舉例, 不是針對你 不要想太多喔 周圍這樣的人太多了 我也會比價啊 何況這也不太算是價值觀的問題 |
別這樣說啦~畢竟我不是專業或職業的所以在最便宜的情況下取得適用的阿~G大說的我會考慮去買~畢竟這樣東西品質跟使用上就非要一分錢一分貨了...但是我只是比價一下伺服馬達有必要因為詢價而把個人的價值觀都往下拉吧>< |
其實SERVO 80元一顆他都嫌貴了 這種一千多的模組是聽不進去的 不過這樣也好, 每個人獲取樂趣的方式不同哩 就像, 有人斤斤計較SERVO控制器一定要100元以內 對我來說, 能解決問題的連一萬多的都買下去, 反正是客戶出錢, 我也是出一張嘴而已 就像, 有人作骨架一定要整台共一百元就作出來, 明明就很像狗啃的他也樂在其中 我作骨架就一定要用雷射鋁合金才看得入眼, 手工只是作來搞笑 但是學校的老師就會覺得那要開模才會有FU 業界老闆就會要求開模還要斤斤計較價格 一樣米養百樣人哩, 不過主要有分兩種啦, 要花錢跟不花錢的兩種 不過話說回來您用的那個還真是炫...整盒的耶, 看起來就很高級 讓我想起最近去中華電信機房看到的行動基地台也是很大一台, 超複雜的無線應用 |
不要再用落伍又難用的東西了。 如果你真的想用無線做比較多的控制,好歹去買個無線數據傳輸組吧!? 真的沒錢,最爛的好歹用這個: http://store.pchome.com.tw/cpushop/M01229687.htm 我自己是用: http://www.aerocomm.com/rf_data_modems/connexlink_radio_modem.htm 參考一下。 |
小黑屋|手機版|Archiver|機器人論壇 from 2005.07
GMT+8, 2024-11-24 12:20 , Processed in 0.304249 second(s), 11 queries , Apc On.
Powered by Discuz! X3.2
© 2001-2013 Comsenz Inc.