串列埠簡介和設定
串列埠一般簡稱RS232或UART介面,通常用於單晶片的資料傳輸之用。RS232規格至少是和8051一樣古老,因為技術上簡單,容易使用,即使時至今日,在單晶片的領域仍很重要。
簡單的UART總共只須3個訊號,RXD負責讀取資料,TXD傳送資料,再加上地線(GND),因為UART資料傳送適用不同的傳輸速度,所以須要設定傳輸速度,資料的傳送端和接收端必須用同樣的傳輸速度,資料才得以正確的傳送,因此單晶片的串列埠必須經過設定,才能夠使用。
目前的工作平台11F04單晶片使用12M的石英振盪晶片,作者習慣的傳輸速度為38400N81,參考技術資料後,以組合語言寫出來的串列埠設定函式如下:
;*************************************************/
; UART initial for 38400 N81 XTAL=12M
;*************************************************/
_BRT = 0x9C
_AUXR = 0x8E
.GLOBL _Init_UART
_Init_UART:
MOV SCON,#0X50
MOV _BRT,#0xF6 ;Reload_Count_Low
MOV _AUXR,#0x17 ;for 38400 N81
RET
這一類硬體的設定動作,主要是參考STC的技術資料,還有資料中的例題,寫一個串列埠設計程式很簡單,關鍵在於,要能確定這個設定程式是正確的?
串列埠的資料輸出
每個工程師都有自己喜歡的除錯手法,曾經有人作過統計,工程師平均花一分的時間寫程式,大概要花五分的時間除錯。此處作者先在電腦上執行一終端機程式(TERA COM),將終端機設在38400N81,用示波器去量電腦串列埠的輸出訊號,然後再單晶片端寫一個串列埠的輸出函式:
;*************************************************/
; put a character to UART port
; which is used putchar(unsigned char x);
;*************************************************/
.GLOBL _putchar
_putchar:
CLR TI
MOV SBUF,DPL
_putch1:
JNB TI,_putch1
RET
接下來修改main.c的主程式,當main程式每改變一次LED狀態時,就送出一個A的文字到PC終端機上。主程式是如此修改的。
#include "at89x52.h"
__sfr __at (0x91) P1M1;
__sfr __at (0x92) P1M0;
__sfr __at (0x90) LED;
__code extern void Init_UART(void);
__code extern putchar(unsigned char i);
//*********************************************************
// delay program
//*********************************************************
void DelaySub(unsigned int delayno)
{
while (delayno!=0) delayno--;
}
//*********************************************************
// main program
//*********************************************************
void main (void)
{
Init_UART();
P1M1=0; P1M0=0xFF; /* P1 set as Output */
while (1) {
LED=1; DelaySub(0xFFFF); LED=0; DelaySub(0XFFFF); putchar('A');
}
}
這個程式執行之後,會在終端機螢幕顯示一連串的A字。當然,作者當初寫這個小程式,也是經過了幾次修改,尤其是硬體設定,只要設定的參數不對,結果就不會正確。
寫程式和從事一些專業的傳統工作,例如木工師傅,其實並沒有多大的不同,尚未熟悉剛入門時,總是笨手笨腳,等上了軌道,寫出來的程式水準就會慢慢提高。
