晶振為11.0592MHZ,串行通信的波特率為9600bps民,定時器T1的工作方式2,波特率=((2的SMOD次方)x F)/(32x12x(256-N),
F是晶振頻率,SMOD是特殊功能寄存器PCON的第7位,取1或0(波特率倍增,或不倍增)。
當SMOD取0,波特率=F/(32x12x(256-N)),
定時器初裝值N =256-F/(波特率x32x12)=256-1105920/(9600x32x12)=253 ,即0FDh 即0xFD,
匯編語言程序如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化程
MOV TMOD,#20H ;定時器T1工作方式2(8位自動重載計數初值)
MOV TH1,#0FDH ;置入初裝值
MOV TL1,#0FDH ;置入重裝值
MOV SCON, #70H ;; 設定串口工作方式1,8位UART,接收允許
ANL PCON, #00H ;; 波特率不倍增
SETB TR1 ;; 啟動定時器T1
MOV IE, #0 ;; 禁止任何中斷
CALL DLY125 ;; 延時125ms
SETB TR1 ;啟動T1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
T_X: ;;發送端的發送程序
MOV R3, #9 ;; 待發送字符個數
MOV DPTR, #TAB_TX ;; 數據表首址
TX_LP1: CLR A
MOVC A, @A+DPTR ;; A←數據表的1個字符
CLR TI ;; TI清零,允許發送
MOV SBUF,A ;; 發送1個字符
JNB TI, $ ;; 等待1個字符幀發送結束
DJNZ R3, TX_next
CALL DLY500 ;; 延時500ms
JMP T_X ;; 重復發送
TX_next: ;; 發送另一字符
INC DPTR ;; 數據表指針移動
SJMP TX_LP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
R_X: ;; 接收端的接收程序
CLR RI ;; RI清零,允許接收字符
MOV R3, #4 ;; 待接收字符個數
MOV DPTR, #DAT_tab ;; 數據表首址
RX_1chr: ;; 接收1個字符
JNB RI, $ ;; 等待1個字符幀接收完畢
RX_check: ;; 檢測收到的字符正確否
CLR A
MOVC A, @A+DPTR ;; A←數據表的1個字符
INC DPTR ;; 數據表指針移動
CLR RI ;; RI清零,允許接收字符
SJMP RX_1chr ;; 接收另一字符
RX_err: ;; 接收字符出錯處理
CALL DLY500 ;; 延時500ms
AJMP R_X ;; 重新接收
|