4.2.2 「RS-232 溝通程式」流程圖
N (Return) N (Return)
N
圖 4.6「RS-232 溝通程式」流程圖
4.2.3 「讀取檔案」流程圖
程式開始執行
使用者按鍵 選單:載入或返回
合法性 Y N
用以開啟的檔名 存在
顯示錯誤訊息
完成讀檔並初始 化資料
Y
N
使用者輸入檔名
顯示讀取 完成訊息
載入 Y
Y
返回 N
Y N
N
圖4.7「讀取檔案」流程圖
4.2.4 「修改檔案」流程圖
程式開始執行
將讀取的檔案資料 以GUI 方式顯示
讓使用者利用鍵盤 針對資料修改、存
檔與瀏覽
偵測到離開指令
進入點與出口 已設定
資料異動 返回
告知使用者 Y N
N
N Y
存檔與否 通知未存檔 訊息並詢問 是否存檔
存檔 Y
N Y
圖4.8「修改檔案」流程圖
4.2.5 「新建檔案」流程圖
程式開始執行
使用者按鍵 選單:建立或返回
合法性 Y N
建立 Y
N
N 返回
初始化儲存陣列
進行 4.2.4 修改檔案
要求結束 Y N
用以開啟的檔名 存在
覆寫?
通知使用者 N
Y
Y Y
N
圖 4.9「新建檔案」流程圖
4.2.6 「執行」流程圖
4.3 8051 控制端與受控端介紹
控制端:5V 直流電輸入與㆒條 RS-232 DB9 ㆒公㆒母的線連接 PC。
外殼㆖有指示燈指示是否收到訊號的狀況。
受控端:5V 與 12V 直流電輸入(電池或 A/D 整流器均可)。
圖4.11 8051 控制端與受控端外觀
圖4.12 8051 控制端與受控端說明
4.4 8051 控制端與受控端程式流程圖
4.4.2 8051 受控端程式流程圖
第五章 PC 端系統程式簡介
Name Address IRQ
COM 1 3F8 4
語 法:int bioscom ( int cmd, char abyte, int port );
參數說明:
int cmd; 要求服務的功能
char abyte; 欲被傳送的字元或通訊參數 int port; 序列埠埠號
功能解說:
此函數是使用BIOS 的第 0x14 號服務提供控制 I/O 步來操作 RS-232 介面卡各項的通訊功能。第㆒個參數為所要求服務的功能,
其所提供的功能如㆘:
功能代碼 意 義
Baud Rate 0x00 110 Baud
0x20 150 Baud 0x40 300 Baud 0x60 600 Baud 0x80 1200 Baud 0xA0 2400 Baud 0xC0 4800 Baud 0xE0 9600 Baud
表 5.3 BIOSCOM 第㆓個參數功能解說
port 為欲做處理的序列埠埠號,序列埠埠號 0 代表 COM 1,序
12 偵測到「break」的訊號,表示接收端在㆒段 時間內未收到任何的訊號。
5 「Data set ready」狀態。
4 「Clear to send」狀態。
3 偵測到接收線路㆖訊號品質的改變。
2 後緣鈴響偵測器。
1 「Data set ready」訊號改變。
0 「Clear to send」訊號改變。
表5.5 BIOSCOM 回傳值的低位元組解說
5.2 RS-232 串列埠介面
5.2.1 RS-232 腳位意義及方向
串 列 通 訊 的 方 式 可 分 為 同 步 式(Synchronous) 及 非 同 步 (Asynchronous)兩種。同步式在通訊的兩端使用同步訊號作為通訊 的依據;而非同步式則使用起始位元( Start Bit )及停止位元( Stop Bit ) 作為通訊的判斷,現在則是以使用非同步傳輸多。非同步傳輸只要 用9 支腳就夠了,若要採用同步傳輸則需使用到 25 支腳。
在本專題㆗我們PC 端透過串列埠,並採用非同步傳輸的方式與 8051 單晶片作資料傳送及接收;而在串列埠㆖的 9 支接腳㆗我們主要使 用Pin 2、Pin3 及 Pin5 這 3 支接腳來作資料的處理,這 9 支接腳的 定義與腳位如㆘所示:
表 5.6 RS-232 9PIN 腳位和 25PIN 腳位定義
圖 5.1 RS-232 DB-9 公座腳位圖
由於 RS-232 設計之初是用來接數據機作傳輸之用,因此它的 腳位意義通常也和數據機傳輸有關。以㆘是這9 支腳位的相關說明:
(1) CD:此腳位是由數據機控制,當電話接通後,傳送的訊號是載 在載波訊號㆖面,數據機利用此腳位通知電腦載波被偵測 到,即表示現在狀態為On-Line;而若電腦未收到此訊號,
均會回應訊息,並將數據機掛線。
(2) RXD:此腳位會將遠端所傳送過來的資料接收進來。
(3) TXD:此腳位將電腦所欲傳送出去的資料傳送出去。
(4) DTR:此腳位由電腦控制,用以通知數據機可以進行傳輸。
(5) GND:此腳位為㆞線,作為電腦與遠端設備之間的準位參考。
兩端設備的㆞線準位必須㆒樣,以避免準位不同而造成資 料的傳送錯誤。
(6) DSR:此腳位由數據機控制,用以通知電腦㆒切均準備就緒,
可以傳送資料過來。
(7) RTS:此腳位由電腦控制,用以通知數據機馬㆖傳送資料至電腦;
而當數據機接收到此訊號後,便會將它所收到的資料傳送 給電腦。
(8) CTS:此腳位由數據機控制,用以通知電腦將欲傳送的資料送至 數據機;而當電腦接收到此訊號後,便會將準備送出的資 料送給至數據機。
(9) RI:數據機通知電腦有電話進來,是否接聽電話則由電腦決定。
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