第五章 PC 端程式簡介
5.2 RS-232 串列埠介面
5.2.2 串列資料的格式
2400、4800 和 9600BPS,鮑率越高傳送時間越愈短,至於應採用 IC,通稱 MAX232,㆒般在坊間最常買得到的則是 HIN232,其實 功能大同小異,對於我們這次的專題需求已經可以滿足了,而值得 注意的是,IC 腳位㆖標示的 IN 或 OUT 常常會讓㆟困惑,因此以 略圖表示其之間的連線方式如㆘:
圖 5.2 MAX232 與 8051、DB-9 連接圖
圖 5.3a MAX232
(RS-232 Connector)DB-9 MAX232
8051
(P3.1) TxD (P3.0) RxD
T1 in T1 out
圖5.3b HIN232
第六章 過程與心得及應用與展望
都兜㆖去,負載改變,造成電壓源有很大問題,到最後我們只得
要稍微有差,便造成模組無法正常通訊,因此終於知道不可太貪 根據測試結果發現:㆒個3xxMHz 的無線接收模組,與㆒個 4xxMHz 的無線發射模組放在近距離,即使經過編碼,仍是不可能正常運 作的!!以我的分析來研判,應是 4xxMHz 的發射模組可以產生 出令 3xxMHz 無線接收模組能接收到的雜亂干涉波,導致 3xxMHz 無線接收模組無法接收較遠的任何訊息,因為接收端幾乎完全在 解讀雜訊,而忽略掉遠端的訊號。但是,㆒個 3xxMHz 的無線發 射模組和㆒個 4xxMHz 的無線接收模組經過測試後,卻不會發生 這樣的情況,原因可想而知!因為 3xxMHz 發射頻率未達 4xxMHz 無線接收模組的要求,即使有干涉波也根本不會造成威脅。我想
乎可以算是停止運作;要解決這樣的方法,我們使用電源分開法, 11.0952MHz 來做運算才有的鮑率,這是我們當初想都沒想過的。
在軟體部分,從 8051 組合語言至 C++,是我覺得最彈性的㆞
技術程式只有不到 30 行就可以達到傳輸動作了。而在程式的跨平 台部分的問題是由於開發環境是在 DOS 模式㆘,對傳統記憶體的 使用則由於各作業系統的不同而會有顯示㆖出現亂碼的情形出 現,不過程式仍能正常執行,所以建議程式必須在 Windows 98 ㆘ 執行才會穩定。基於這個原因,我㆒直想要嘗試將此程式改寫成 Windows 版本,C++而不是 Basic 的視窗版,我知道 Windows ㆘的 開發環境有良好的 WinSock 物件可使用,但由於視窗設計技術受 限與研究時間的不足,而未能轉移。
6.3 應用與未來展望
September 23, 2002 TIME Magazine 有㆒篇文章可讓我們借鏡
Maid To Order
A little robot called Roomba vacuums your house while you lounge by the pool. Is this the beginning of the end?
BYLEV GROSSMAN
有個名叫羅巴的小機器㆟,會趁著你在泳池邊逍遙時幫你把 任Rodney Brooks 所首創的技術設計出來的。
基本㆖,機器㆟就是㆒具有身體外形的電腦,不過 iRobot 公
的軍用機器㆟而開發。當羅巴判斷—根據它的經驗法則、房間的 大小、以及它在遊走時碰到障礙物數量—它已經把房間來來回回 吸過好幾次了,就會停㆘來,高興㆞發出嗶嗶聲,然後自己關機。
DigiTimes 11 月 29 日也有台灣市場的報導:(詳見附錄 C)
㆟工智慧科技在消費市場現身。想想 1970 年代末期個㆟電腦 的情況。當時沒有㆟相信會有任何㆟想在自己家裡擺台個㆟電腦,
現在很多工作被電腦取代後,我們無法想像生活裡沒有電腦的話 該怎麼辦。
參考文獻
[1] 吳㆒農, 單晶片 8051 實務, 松崗電腦圖書資料股份有限公司, 2002 年 1 月㆓版。
[2] 陳龍㆔、許榮庭, PC/8051 無線遙控專題製作, 松崗電腦圖書資料股份 有限公司, 1996 年 5 月初版。
[3] 陳龍㆔, 8051 入門與介面控制, 松崗電腦圖書資料股份有限公司,1996 年6 月。
[4] 蔡明志著, TURBO C/C++完全征服手冊, 碁峰資訊, 1999 年 12 月初版。
[5] Naba Barkakati 原著/蔡明志譯, TURBO C++ Bible, 松崗電腦圖書資料股 份有限公司, 1991 年 6 月初版。
[7] Holtek Semiconductor Inc., HT-12A/HT-12E 212 Series of Encoders,2000 年 4 月 11 日。
[8] Holtek Semiconductor Inc., 212 Series of Dncoders,1999 年 7 月 12 日。
[9] Interfacing the Serial/RS232 Port v5.0 (http://www.senet.com.au/~cpeacock) [10] 8051 Timers and Serial Port (University of Texas at Dallas. EE4380 Fall
2001 Class 10. By Pari vallal Kannan)
[11] 8051 Serial Communication (Bradley University Nov. 15 2000 by D.R.
Schertz)
附錄 A
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
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
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
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
$9: CJNE A,#9,$A ;順時針旋轉 180 度 MOV DPTR,#Right
MOV R1,#8 MOVR2,#128
JMP RUN
$A: CJNE A,#AH,$B ;未定義 CALL OVER
RET
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
$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
MOV P1,#2FH CALL TDELAY MOV P1,#20H CALL TDELAY MOV P1,#80H
RET 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
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
;************************************************
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
附錄 B
#include <stdio.h>
#include <conio.h>
#include <bios.h>
#define SET 0x00
#define SEND 0x01
#define RECEIVE 0x02
#define STATUS 0x03
#define SPEED 0xE0
#define DATATYPE 0x03
#define STOPBIT 0x00
#define PARITY 0x00 int PORT_NO = 1 ;
void simple_test() {
int status, quit = 0, modify = 1;
char unsigned in, out;
while (!quit){
if ( modify == 1 ){
clrscr();
printf("Initializing COM port %d...",PORT_NO);
bioscom(SET, SPEED|DATATYPE|STOPBIT|PARITY, PORT_NO-1);
printf("\nStart communicating...\nIf you want to quit, "
"press ESC key...\n\n");
modify = 0;
}
status = bioscom(STATUS, 0, PORT_NO-1);
if (status & 0x0100)
if ((in = bioscom(RECEIVE, 0, PORT_NO-1)) != 0 ){
if ( in == 250 ) printf("\nRESET!!\n");
else printf("'%c,%d'",in,in);
}
case 59: PORT_NO = 1; modify = 1;break;
case 60: PORT_NO = 2; modify = 1;break;
case 61: PORT_NO = 3; modify = 1;break;
case 62: PORT_NO = 4; modify = 1;break;
default:break;
} } else{
printf("%c",out);
bioscom ( SEND, out, PORT_NO-1);
} } } }
void main() {
simple_test();
}
附錄 C
電子時報(DigiTime):宏碁引進iRobot ㆟工智慧吸塵器
(記者胡華勝/台北) 2002/11/29