Truyền thụng UART cho 8051 bằng phần mềm

Một phần của tài liệu TRƯ NG BI H C K THU T CÔNG NGHI PKHOA I N TMÔN K THU T MÁY TÍNHBÀI GI NG PHÁT CHO SINH (Trang 163 - 165)

Để thực hiện thành cụng UART đầu tiờn chỳng ta cần phải biết giao thức truyền thụng UART.

Sơ đồ trờn cho thấy dạng súng của một frame truyền. Đầu tiờn là bit bắt đầu .. sau đú 8-bit dữ liệu và tại một bit dừng cuốị Cú một cụng thức bớ mật để tớnh toỏn thời gian trỡ hoón là cú baudrate chớnh xỏc giữa cỏc bit.

Dưới đõy là một phần mềm triển khai UART, trong đú cú thể được sử dụng ở chương trỡnh C cũng như ASM. Nú được viết cho phần mềm Keil. Nhưng với một vài thay đổi nhỏ bạn cú thể dựng nú trong chương trỡnh của bạn.

?SỦPUTC SEGMENT CODE

?SỦGETC SEGMENT CODE PUBLIC _putc

PUBLIC getc

txd_pin EQU P3.1 ;Transmit on this pin

rxd_pin EQU P3.0 ;Receive on this pin

;Formula to calculate the bit time delay constant

;This constant is calculated as: (((crystal/baud)/12) - 5) / 2 ;crystal is the frequency of crystal in Hz

;baud is required baudrate

;Please try to keep baudrate below 9600 ;to get best results :)

BITTIM EQU 45; (((11059200/9600)/12) - 5) / 2 ;---

;For C programs ;Protype definition:

; void putc(unsigned char); ;Usage:

; putc(data); ;Return:

; This function returns nothing ;

;For Assembly Programs: ;

;Usage:

; data to be send has to be moved to R7 ; for example: ; mov R7,#'ỏ ; lcall _putc ;--- RSEG ?SỦPUTC _putc: push ACC Push PSW mov a,r7

CLR txd_pin ;Drop line for start bit

MOV R0,#BITTIM ;Wait full bit-time

DJNZ R0,$ ;For START bit

MOV R1,#8 ;Send 8 bits

putc1:

RRC A ;Move next bit into carry

MOV txd_pin,C ;Write next bit

MOV R0,#BITTIM ;Wait full bit-time

DJNZ R0,$ ;For DATA bit

DJNZ R1,putc1 ;write 8 bits

SETB txd_pin ;Set line high

RRC A ;Restore ACC contents

MOV R0,#BITTIM ;Wait full bit-time

DJNZ R0,$ ;For STOP bit

POP PSW

pop ACC

RET

;--- ;To receive data Serially

;If you want to use this routine in your ;C program then define function prototype ; as:

; unsigned char getc(void); ;

; Usage:

; data = getc(); ; Return value:

; Returns data received ;If you are using it in assembly program ; Usage:

; lcall getc ; Return:

; data received is stored in R7 ;---

165

RSEG ?SỦGETC getc:

Push ACC

Push PSW

JB rxd_pin,$ ;Wait for start bit

MOV R0,#BITTIM/2 ;Wait 1/2 bit-time

DJNZ R0,$ ;To sample in miđle

JB rxd_pin,getc ;Insure valid

MOV R1,#8 ;Read 8 bits

getc1:

MOV R0,#BITTIM ;Wait full bit-time

DJNZ R0,$ ;For DATA bit

MOV C,rxd_pin ;Read bit

RRC A ;Shift it into ACC

DJNZ R1,getc1 ;read 8 bits

mov r7,a

POP PSW

pop ACC

RET ;go home

Một phần của tài liệu TRƯ NG BI H C K THU T CÔNG NGHI PKHOA I N TMÔN K THU T MÁY TÍNHBÀI GI NG PHÁT CHO SINH (Trang 163 - 165)

Tải bản đầy đủ (PDF)

(168 trang)