АСВТ 2 семестр ЛР №4

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:51, 12 мая 2016.


Работа с UART (i8051)

Пример 1

Исходные данные. Осуществить передачу данных между двумя микроконтроллерами i8051 с помощью Serial Port, используя клавиатуру KeyPad и выводя переданный/принятый символ на ССИ.

Реализация. Схема реализована с использованием KeyPad, терминала и семисегментного индикатора:

Рис. 1. Схема в Proteus

Листинг на Ассемблере.

Для master и slave разные прошивки.

Master:

;====================================================================
; DEFINITIONS
;====================================================================

org 300h ;Digitals array
DATA1: DB 31h ;1
DATA2: DB 32h ;2
DATA3: DB 33h ;3
DATA4: DB 34h ;4
DATA5: DB 35h ;5
DATA6: DB 36h ;6
DATA7: DB 37h ;7
DATA8: DB 38h ;8
DATA9: DB 39h ;9
DATA2A: DB 2Ah ;*
DATA0: DB 30h ;0
DATA23: DB 23h ;#

Основное тело программы:

Start:
		mov SCON, #0D0h
		mov TMOD, #20h
		mov TH1, #0FDh
		mov TL1, #00h
		mov TCON, #40h
		orl PCON, #10h
Loop:
		mov p1, #255
		mov GOAL, #00h
Check_line_A:
		CLR p1.3
		JNB p1.0, Disp
		inc GOAL
		JNB p1.1, Disp
		Inc GOAL
		JNB p1.2, Disp
		Inc GOAL
		SETB p1.3
Check_line_B:
		CLR p1.4
		JNB p1.0, Disp
		inc GOAL
		JNB p1.1, Disp
		Inc GOAL
		JNB p1.2, Disp
		Inc GOAL
		SETB p1.4
Check_line_C:
		CLR p1.5
		JNB p1.0, Disp
		inc GOAL
		JNB p1.1, Disp
		Inc GOAL
		JNB p1.2, Disp
		Inc GOAL
		SETB p1.5
Check_line_D:
		CLR p1.6
		JNB p1.0, Disp
		inc GOAL
		JNB p1.1, Disp
		Inc GOAL
		JNB p1.2, Disp
		SETB p1.6
		jmp loop
Disp:		
		JNB p1.0, $
		JNB p1.1, $
		JNB p1.2, $
		CLR TI
		mov a, GOAL
		mov DPTR, #300h
		movc A, @A+DPTR
		mov SBUF, A
		jnb TI, $
		jmp loop

Slave:

;====================================================================
; DEFINITIONS
;====================================================================

org 300h ;Digitals array
DATA0: DB 3fh ;0
DATA1: DB 00000110b ;1
DATA2: DB 01011011b ;2
DATA3: DB 01001111b ;3
DATA4: DB 01100110b ;4
DATA5: DB 01101101b ;5
DATA6: DB 01111101b ;6
DATA7: DB 00000111b ;7
DATA8: DB 01111111b ;8
DATA9: DB 01101111b ;9
DATA2A: DB 01110111b ;*
DATA23: DB 01111100b ;#

Основное тело программы:

Start:
      ; Init 
      mov SCON, #0D0h
      mov TMOD, #20h
      mov TH1, #0FDh
      mov TL1, #00h
      mov TCON, #40h
      orl PCON, #10h
      
Read:
      jnb RI,$
      mov A,SBUF
      acall Disp
      jmp Start
      
Disp:
      mov DPTR, #300h
      cjne A,#6Ah,ch1
      mov A,#10
      jmp Show
      ch1:
	 cjne A,#63h,ch2
	 mov A,#11
	 jmp Show
      ch2:
	 SUBB A,#70h
      
      Show:
	 movc A, @A+DPTR
	 cpl A
	 mov P0,A
      
      ret

ССИ отображает последний введеный с KeyPad символ. Для более глубокого понимания следует разобраться в принципе работы KeyPad, а так же режимах работы UART, скорости передачи данных и пр.[1] Содержания данного примера достаточно для реализации задания (Half/Full Duplex Mode, 9.6/19.2/38.4 baud rate etc).

Пример 2

Исходные данные. Осуществить передачу данных между контроллерами, которая осуществляется следующим образом: вначале тумблерами устанавливается номер целевого контроллера, по нажатию на кнопку он отображается на ССИ. Затем устанавливается значение на передачу, после нажатия кнопки отображается на ССИ и отправляется. Будучи принятой на целевом контроллере, значение также отображается на ССИ.

Реализация. Схема реализована с использованием ключей, кнопок, ССИ:

Рис. 2. Схема в Proteus

Листинг на Ассемблере.

Для каждого контроллера своя версия прошивки. Контроллер CON1:

INPUT DATA P1;
OUTPUT DATA P0;
MESSAGE_BIT BIT 2AH.0;
TRANSMIT_FURTHER_BIT BIT 2AH.1;
SHOW_MESSAGE BIT 2AH.2;

ORG 0000H
	JMP INIT
	
ORG 0003H
	JMP BUTTON_HANDLER
		
ORG 0023H
	JMP UART_HANDLER;

ORG 00FFH
	INIT:
		MOV SCON, #01100100B
		SETB EA;
		SETB ES;
		SETB IT0;
		SETB EX0;
		SETB REN;
		CLR TI;
		CLR RI;
		CLR MESSAGE_BIT;
		MOV TH1,#0FDH;
		SETB TR1;
		JMP $
		
	BUTTON_HANDLER:
		JB MESSAGE_BIT, PUSH_MESSAGE
		PUSH_ADDRESS:
			MOV SBUF, INPUT
			SETB MESSAGE_BIT;
			RETI
		PUSH_MESSAGE:
			CLR MESSAGE_BIT;
			MOV SBUF, INPUT;
			RETI
		
	UART_HANDLER:
		JB TI, HANDLE_TRANSMIT
		HANDLE_RECIEVE:
			CLR RI;
			JB MESSAGE_BIT, PARSE_MESSAGE_RECIEVE
			PARSE_ADDRESS_RECIEVE:
				SETB MESSAGE_BIT;
				MOV R0, SBUF;
				CJNE R0, #1, ADDRESS_NOT_EQUAL
					SETB MESSAGE_BIT;
					SETB SHOW_MESSAGE;
					RETI;
				ADDRESS_NOT_EQUAL:
					MOV SBUF, R0;
					RETI;
			PARSE_MESSAGE_RECIEVE:
				CLR MESSAGE_BIT;
				JNB SHOW_MESSAGE, SEND_MESSAGE
					MOV A, SBUF;
					MOV OUTPUT, A;
					CLR SHOW_MESSAGE;
					RETI;
				SEND_MESSAGE:
					MOV R1, SBUF;
					MOV SBUF, R1;
					RETI;
		HANDLE_TRANSMIT:
			CLR TI;
			JB MESSAGE_BIT, RETURN
			;PARSE_ADDRESS_TRANSMIT:
				;CLR MESSAGE_BIT;
				;RETI;
			;PARSE_MESSAGE_TRANSMIT:
				;SETB MESSAGE_BIT;
			RETURN:
				RETI;
				
	END

Контроллер CON2:

INPUT DATA P1;
OUTPUT DATA P0;
MESSAGE_BIT BIT 2AH.0;
TRANSMIT_FURTHER_BIT BIT 2AH.1;
SHOW_MESSAGE BIT 2AH.2;

ORG 0000H
	JMP INIT
	
ORG 0003H
	JMP BUTTON_HANDLER
		
ORG 0023H
	JMP UART_HANDLER;

ORG 00FFH
	INIT:
		MOV SCON, #01100100B
		SETB EA;
		SETB ES;
		SETB IT0;
		SETB EX0;
		SETB REN;
		CLR TI;
		CLR RI;
		CLR MESSAGE_BIT;
		MOV TH1,#0FDH;
		SETB TR1;
		JMP $
		
	BUTTON_HANDLER:
		JB MESSAGE_BIT, PUSH_MESSAGE
		PUSH_ADDRESS:
			MOV SBUF, INPUT
			SETB MESSAGE_BIT;
			RETI
		PUSH_MESSAGE:
			CLR MESSAGE_BIT;
			MOV SBUF, INPUT;
			RETI
		
	UART_HANDLER:
		JB TI, HANDLE_TRANSMIT
		HANDLE_RECIEVE:
			CLR RI;
			JB MESSAGE_BIT, PARSE_MESSAGE_RECIEVE
			PARSE_ADDRESS_RECIEVE:
				MOV R0, SBUF;
				CJNE R0, #2, ADDRESS_NOT_EQUAL
					SETB MESSAGE_BIT;
					SETB SHOW_MESSAGE;
					RETI;
				ADDRESS_NOT_EQUAL:
					MOV SBUF, R0;
					RETI;
			PARSE_MESSAGE_RECIEVE:
				CLR MESSAGE_BIT;
				JNB SHOW_MESSAGE, SEND_MESSAGE
					MOV A, SBUF;
					MOV OUTPUT, A;
					CLR SHOW_MESSAGE;
					RETI;
				SEND_MESSAGE:
					MOV R1, SBUF;
					MOV SBUF, R1;
					RETI;
		HANDLE_TRANSMIT:
			CLR TI;
			JB MESSAGE_BIT, RETURN
			;PARSE_ADDRESS_TRANSMIT:
				;CLR MESSAGE_BIT;
				;RETI;
			;PARSE_MESSAGE_TRANSMIT:
				;SETB MESSAGE_BIT;
			RETURN:
				RETI;
				
	END

Контроллер CON3:

INPUT DATA P1;
OUTPUT DATA P0;
MESSAGE_BIT BIT 2AH.0;
TRANSMIT_FURTHER_BIT BIT 2AH.1;
SHOW_MESSAGE BIT 2AH.2;

ORG 0000H
	JMP INIT
	
ORG 0003H
	JMP BUTTON_HANDLER
		
ORG 0023H
	JMP UART_HANDLER;

ORG 00FFH
	INIT:
		MOV SCON, #01100100B
		SETB EA;
		SETB ES;
		SETB IT0;
		SETB EX0;
		SETB REN;
		CLR TI;
		CLR RI;
		CLR MESSAGE_BIT;
		MOV TH1,#0FDH;
		SETB TR1;
		JMP $
		
	BUTTON_HANDLER:
		JB MESSAGE_BIT, PUSH_MESSAGE
		PUSH_ADDRESS:
			MOV SBUF, INPUT
			SETB MESSAGE_BIT;
			RETI
		PUSH_MESSAGE:
			CLR MESSAGE_BIT;
			MOV SBUF, INPUT;
			RETI
		
	UART_HANDLER:
		JB TI, HANDLE_TRANSMIT
		HANDLE_RECIEVE:
			CLR RI;
			JB MESSAGE_BIT, PARSE_MESSAGE_RECIEVE
			PARSE_ADDRESS_RECIEVE:
				SETB MESSAGE_BIT;
				MOV R0, SBUF;
				CJNE R0, #3, ADDRESS_NOT_EQUAL
					SETB MESSAGE_BIT;
					SETB SHOW_MESSAGE;
					RETI;
				ADDRESS_NOT_EQUAL:
					MOV SBUF, R0;
					RETI;
			PARSE_MESSAGE_RECIEVE:
				CLR MESSAGE_BIT;
				JNB SHOW_MESSAGE, SEND_MESSAGE
					MOV A, SBUF;
					MOV OUTPUT, A;
					CLR SHOW_MESSAGE;
					RETI;
				SEND_MESSAGE:
					MOV R1, SBUF;
					MOV SBUF, R1;
					RETI;
		HANDLE_TRANSMIT:
			CLR TI;
			JB MESSAGE_BIT, RETURN
			;PARSE_ADDRESS_TRANSMIT:
				;CLR MESSAGE_BIT;
				;RETI;
			;PARSE_MESSAGE_TRANSMIT:
				;SETB MESSAGE_BIT;
			RETURN:
				RETI;
				
	END

Специфичность данного примера заключается в том, что передача номера контроллера и сообщения осуществляются по внешнему прерыванию (по нажатию кнопки), а затем по прерыванию последовательного порта (Serial Port) сообщение отображается на ССИ целевого контроллера.

Примечания