Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Exercício ‐1• Fazer um programa em Assembly do 8051 que informe a
temperatura de um forno. O programa deve enviar inicialmente um ‘String’ em ASCII armazenado na área de memória de programa a partir do endereço "TAB", para um monitor de vídeo serial RS232C (600 bps, sem paridade, 8 bits de dados, 1 stop bit), até encontrar o código ASCII do caractere "$" que não deve ser transferido. Após a mensagem ser mostrada, o programa deve enviar o valor da temperatura que está armazenado em hexadecimal no registrador R0 e parar. O cristal do micro é de 11.0592 Mhz.
• TAB: DB ‘TEMPERATURA DO FORNO =’, ‘$’
( )( )RateBaud
OsciladordoFreqüênciaKTH×
×−=
3842561 K = 1 SMOD = 0
208)600384
100592,111(2566
1 =×
××−=TH
Timer 1 Timer 0
GATE C / T M1 M0 GATE C / T M1 M0
MOV TMOD,#20h ;TMOD = 00100000 Timer 1 no ;Modo 2, controle por software
TMOD
MOV SCON,#40h ;SCON = 01000000 modo 1 do;Canal Serial
SCON
208 = D0 h
Programa Completo
Exercício ‐2• Dado o programa em Assembly do 8051 abaixo responder a cada um dos itens:• ORG 0• SJMP PROG•• ORG 000BH• MOV TH1,#7FH• MOV TL1,#00• MOV TH0,#7FH• CLR TR0• SETB TR1• RETI••• ORG 001BH• MOV TH0,#7FH• MOV TL0,#00• MOV TH1,#7FH• CLR TR1• SETB TR0• RETI••• PROG: SETB EA• SETB ET0• SETB ET1• MOV TMOD,#11H• MOV TH0,#7FH• MOV TL0,#00• MOV TH1,#7FH• SETB TR0• LOOP: MOV P1,TH0• MOV P2,TH1• SJMP LOOP• END
• a) Se a freqüência do oscilador for de 12Mhz, qual o tempo aproximado em milissegundos que o Timer T0 contará até solicitar uma interrupção pela primeira vez?
• b) Como os contadores mostrados nas portas P1 e P2 do microcontrolador serão vistos externamente considerando‐se o tempo de interrupção de cada temporizador ?
• PROG: SETB EA• SETB ET0• SETB ET1• MOV TMOD,#11H• MOV TH0,#7FH• MOV TL0,#00• MOV TH1,#7FH• SETB TR0• LOOP: MOV P1,TH0• MOV P2,TH1• SJMP LOOP
TMOD
0 0 0 1 0 0 0 1
Controle por Software ‐‐‐‐ Temporizador ‐‐‐‐ Timer no Modo 1 (16 Bits)
O Contador/Timer 0 contará de 7F00 até FFFF quando dará um overflow e saltará para o endreço 000Bh
FFFF – 7F00 = 80FF h 33023 ciclos
Como a freqüência do cristal é de 12 MHz
freqüência do Contador/Temporizador = f cristal/12 = 1 MHz
1 ciclo = 1/1MHz = 1 us
a) O tempo será de aproximadamente 33 ms
33023 ciclos x 1 us = 33,023 ms
b) Serão vistos externamente 2 contadores de 8 Bits alternados de 7F a FF
A cada 33 ms um contador pára em 7F e o outro conta de 7F a FF
Exercício‐3A figura abaixo é parte do controle de uma máquina que possui um Motor e um Encoder Óptico diretamente acoplado ao seu eixo. Cada vez que a luz do emissor de luz passa por um dos furos do disco do Encoder, um pulso é gerado no Fotorreceptor ligado no pino T0.
Desenvolver um programa em Assembly que entre com a quantidade de pulsos através do Teclado conectado na Porta P1, ligue o Motor (P3.5 = 1) e quando a quantidade de pulsos gerada pelo Encoder for igual ao valor inserido pelo Teclado, enviar uma mensagem ao Display de LCD (16 x 2) com a informação “FERRAMENTA POSICIONADA” , parar o Motor (P3.5=0) e aguardar novos dados de posicionamento pelo Teclado.
Atenção:•Para o Teclado: Utilizar apenas dois dígitos, ou seja, de 00 a 99 para os dados.Matriz P1.0 a P1.3 são as linhas (Entradas) e P1.4 a P1.6 são as Colunas (Saídas). Nãohá a necessidade de eliminar ruído de chave.•Para o LCD: E = P3.0, R/W = P3.1, RS = P3.2•Fornecer o programa contendo na ordem correta:a) A sub‐rotina de atendimento do Teclado.b) A sub‐rotina de escrita no LCD.c) A sub‐rotina de atendimento do Motor/Encoder.d) O programa Principal com as configurações necessárias.
Solução:
ORG 0
PROG: MOV TMOD,#00000101 ;Contador 0,Modo1MOV TH0,#00MOV TL0,#00SETB TR0 ; Dispara ContadorACALL CONFLCD ; Configuração do LCD
AGAIN: ACALL LETECLASWAP AMOV R0,AACALL LETECLAORL A,R0MOV R0,AACALL MOTORACALL WRITELCDSJMP AGAIN
Programa Principal.0 0 0 0 0 1 0 1
TMOD
;***************************LETECLA: MOV P1,#0FFH
MOV A,#0FFHLOOP1: CLR P1.4
JNB P1.0,ZEROJNB P1.1,TRESJNB P1.2,SEISMOV P1,#0FFH
LOOP2: CLR P1.5JNB P1.0,UMJNB P1.1,QUATROJNB P1.2,SETEJNB P1.3,NOVEMOV P1,#0FFH
LOOP3: CLR P1.6JNB P1.0,DOISJNB P1.1,CINCOJNB P1.2,OITOMOV P1,#0FFHCJNE A,#0FFH,LEUSJMP LETECLA
LEU: RET
;*******************************ZERO: MOV A,#00
SJMP LOOP1UM: MOV A,#01
SJMP LOOP2DOIS: MOV A,#02
SJMP LOOP3TRES: MOV A,#03
SJMP LOOP1QUATRO: MOV A,#04
SJMP LOOP2CINCO: MOV A,#05
SJMP LOOP3SEIS: MOV A,#06
SJMP LOOP1SETE: MOV A,#07
SJMP LOOP2OITO MOV A,#08
SJMP LOOP3NOVE: MOV A,#09
SJMP LOOP2
Sub‐rotina de atendimento do Teclado.
;*************************************MOTOR: SETB P3.5 ; Liga MotorCONT: MOV R1,TL0 ; Lê encoder
ACALL CONBCD ; Converte BCDCJNE A,R0,CONTCLR P3.5RET
;*************************************CONBCD: CLR ACONT2: DJNZ R1,CONT1
RETCONT1: ADD A,#01
DA ASJMP CONT2
A sub‐rotina de atendimento do Motor/Encoder.
Sub‐rotinas do LCD
;***************************CONFLCD:
ENAB EQU P3.0RW EQU P3.1RS EQU P3.2DATA EQU P2ACALL INIT_LCDACALL CLEAR_LCDRET
Sub‐rotinas do LCD
;******************************WRITELCD:
MOV DPTR,#TAB1CLR A
T1: MOVC A,@A+DPTRCJNE A,#’$’,CONTINSJMP LINHA2
CONTIN: ACALL WRITE_TEXTINC DPTRSJMP T1
LINHA2: MOV A,#40HACALL POS_LCDMOV DPTR,#TAB2CLR A
T3: MOVC A,@A+DPTRCJNE A,#’$’,T2RET
T2: ACALL WRITE_TEXTINC DPTRSJMP T3
TAB1: DB ‘FERRAMENTA$’TAB2: DB ‘POSICIONADA$’
Exercício‐4Um Microcontrolador 89S52 faz a aquisição de dados de diversos sensores e se comunica via RS232c com um monitor de vídeo a uma taxa de 9600,N,8,1, conforme mostra a figura.
O cristal é de 11,0592 MHz.
Os sensores estão ligados nas entradas do conversor AD da seguinte maneira:IN0 Sensor de TemperaturaIN1 Sensor de PressãoIN2 Sensor de VelocidadeIN3 Sensor de UmidadeIN4 Sensor de DistânciaIN5 Sensor de RuídoIN6 Sensor de Vibração MecânicaIN7 Sensor de luz
Desenvolver um programa em Assembly que leia cada um dos Sensores em ordem crescente (IN0 a IN7) e transmita via serial RS232c para o monitor continuamente, escrevendo em uma coluna o nome da variável e seu valor em hexadecimal.Exemplo:Temperatura = 30Pressao = 2FVelocidade = 5DUmidade = 80Distância = 4CRuido = FFVibracao = 00Luz = AF
EOC P3.5
START/ALE P3.6
OE P3.7
CLK P3.4 (Gerarum clock deaproximadamente500 KHz)
A0, A1, A2 P0.0,P0.1, P0.2
Dados do AD – P1
Utilizar para o conversor AD ADC0808:
Solução:;*******************Sub‐rotina que posiciona o cursor no início de cada linhaPOS: MOV A,#0DH
ACALL ENVIAMOV A,#0AHACALL ENVIARET
;********************ENVIA: MOV SBUF,A
JNB TI,$CLR TIRET
;**************************STRING: CLR ALOOP: MOVC A,@A+DPTR
CJNE A,#’$’,CONTRET
CONT: ACALL ENVIAINC DPTRSJMP LOOP
TEMP: DB ‘TEMPERATURA=$’PRESS: DB ‘PRESSAO=$’UMID: DB ‘UMIDADE=$’VELOC: DB ‘VELOCIDADE=$’DIST: DB ‘DISTANCIA=$’RUID: DB ‘RUIDO=$’VIBRA: DB ‘VIBRACAO=$’LUZ: DB ‘LUZ=$’
;**********************************Sub‐rotina que lê o Conversor ADLEAD: CLR P3.6
SETB P3.6 ;Pulso START CLR P3.6CLR P3.7 ; OE=0JNB P3.5,$ ; EOCSETB P3.7 ; OE=1MOV A,P1 ; Lê DadosCLR P3.7 ; OE=0RET
;******************************Sub‐rotina que envia o valor de um sensorVAL_SENS:
MOV R1,ASWAP AANL A,#0FHACALL CONV2ACALL ENVIAMOV A,R1ANL A,#0FHACALL CONV2ACALL ENVIARET
DADOS: ACALL STRINGACALL LEADACALL VAL_SENSACALL POS RET
ORG 0SJMP PROGORG 000BH ;Timer 0 = 500KHzSJMP CLOCK
PROG: MOV TMOD,#21HMOV TH1,#253MOV TL1,#253MOV SCON,#40HSETB TR1SETB TR0
LOOP2: MOV R0,#00 ; IN0MOV P0,R0MOV DPTR,#TEMPACALL DADOSINC R0 ; IN1MOV P0,R0MOV DPTR,#PRESSACALL DADOSINC R0 ;IN2MOV P0,R0MOV DPTR,#VELOCACALL DADOSINC R0 ;IN3MOV P0,R0MOV DPTR,#UMIDACALL DADOS
INC R0 ;IN4MOV P0,R0MOV DPTR,#DISTACALL DADOSINC R0 ;IN5MOV P0,R0MOV DPTR,#RUIDACALL DADOSINC R0 ;IN6MOV P0,R0MOV DPTR,#VIBRACALL DADOSINC R0 ;IN7MOV P0,R0MOV DPTR,#LUZACALL DADOSSJMP LOOP2
253)9600384
100592,111(2566
1 =×
××−=TH
CLOCK:CLR EACPL P3.4MOV TH0,#0FFHMOV TL0,#0FFHSETB EARETI
Timer 1 Timer 0
GATE C / T M1 M0 GATE C / T M1 M0
TMOD
0 0 1 0 0 0 0 1
Cada ciclo = 12/11,0592 MHz = 1,085 us500 KHz t = 1/500 Khz = 2 us.Se a cada interrupção for complementado o bit P3.4, o período será de aproximadamente 2 us.Logo, basta carregar o T0 com FFFF e assim, a interrupção ocorrerá a cada 1 us aproximadamente.Na prática, a frequência do clock será inferior a 500 KHz devido ao número de instruções necessárias dentro da sub-rotina de atendimento CLOCK
Exercício‐5A figura abaixo é o circuito microprocessado de uma bomba de combustível.
Operação da bomba:1) O motor que bombeia o combustível é acionado pelo pino P3.7 = 12) Cada litro que for bombeado equivale a um pulso na entrada T03) Para ligar a bomba, o frentista aciona o gatilho que está ligado na Interrupção INT1, sensível a nível baixo (Baixa prioridade).4) Um sensor instalado no bico do alimentador de combustível está conectado na interrupção INT0, sensível à descida de borda, que detecta quando o tanque está cheio (Alta Prioridade).5) O display de 7 segmentos, catodo comum e multiplexado, mostra nos dois dígitos menos significativos, acionados por P2.0 e P2.1, a quantidade de combustível transferida, e nos dois dígitos mais significativos (P2.6 e P2.7) o valor em Reais (considerar 1 litro de combustível = 1 Real).6) Um terminal RS232 (9600, N, 8, 1) instalado no interior do posto de combustível é utilizado para a cobrança.7) A Porta P0 do microprocessador serve para a comunicação de dados com a bomba de combustível.
Item_1:Considerando-se o display de 7 segmentos acionado pela Porta P1, escrever um Programa em Assembly que mostre nos Displays, a quantidade de combustível e o preço (em BCD) durante o tempo de enchimento do tanque. Observar que o motor da bomba é ligado(P3.7=1) quando o gatilho for acionado e desligado (P3.7=0) ou pelo sensor no bico do alimentador (INT0) ou pelo gatilho (INT1=1). Ao ser ligado o motor da bomba, os displays devem ser zerados e ao ser desligado os valores devem permanecer acesos no Display.
Solução do Item_1:ORG 0SJMP PROGORG 0003SJMP DESLIGORG 000BHSJMP CONT_LITORG 0013HSJMP LIG_BOMB
;Programação das InterrupçõesPROG: SETB EA
SETB EX0 ;Externa 0SETB EX1 ;Externa 1SETB PX0 ;Alta Prioridade, Int0CLR PX1 ;Baixa Prioridade, Int1SETB IT0 ;Descida de Borda, Int0CLR IT1 ;Nível Baixo, Int1SETB ET0 ;Timer 0MOV TMOD,#25HMOV SCON,#40HSETB TR0SETB TR1MOV TH1,#253 ;9600,N,8,1MOV TL1,#253MOV TH0,#0FFHMOV TL0,#0FFH
Timer 1 Timer 0
GATE C / T M1 M0 GATE C / T M1 M0
0 0 1 0 0 1 0 1
Timer 0 no Modo 1 (Serial)eTimer 1 no Modo 2 (Contador)
MOV R2,#00ACALL APAGAACALL ZERA_DISP
LOOP: JNB P3.3,NORCLR P3.7
NOR: ACALL DADOSACALL DMUXSJMP LOOP
;*****************************************;Sub-rotina do Contador de ;Litros de combustível em BCD (R2)CONT_LIT: CLR ET0
MOV TH0,#0FFHMOV TL0,#0FFHMOV A,R2ADD A,#1DA AMOV R2,ASETB ET0RETI
;************************************************LIG_BOMB: SETB P3.7
JNB P3.3,DESLIGRETI
DESLIG: CLR P3.7RETI
Litros = Preço (R2)
ZERA_DISP: MOV R1,#30HCONT1: MOV A,#7EH ;Código 7 segmentos do dígito 0
MOV @R0,AINC R1CJNE R0,#38H,CONT1ACALL DMUXRET
DADOS: MOV A,R2ANL A,#0FHACALL DISPLAYMOV 30H,AMOV 36H,AMOV A,R2SWAP AANL A,#0FHACALL DISPLAYMOV 31H,AMOV 37H,ARET
DISPLAY: MOV DPTR,#TABMOVC A,@A+DPTRRET
TAB: DB 7EH, 30H, 6DH, 79H, 33H, 5BH, 5FH, 70H, 7FH, 7BH
Item_2:O preço a pagar e a quantidade de combustível bombeado devem ser transmitidos em ASCII para o terminal RS232 instalado no interior do posto no final de cada operação, ou seja, quando o motor da bomba for desligado. O Microprocessador desabilita as interrupções e aguarda um código de “transação OK” enviado pela linha serial (3Ch) do terminal, retransmitindo-o para a bomba de combustível através da Porta P0 e liberando a bomba para uma nova operação. A liberação da bomba deve ser realizada através da reabilitação das interrupções.O cristal do microprocessador é de 11.0592 MHz.Escrever este programa na forma de uma Sub-rotina e indicar em qual ponto no programa do item 1 ela deverá ser chamada.
;***********************************************; Sub-rotina de atendimento do terminal
ATENDE: CLR EAACALL TRANS_ASCACALL TRANS_ASCSETB REN
VOLTA: JNB RI,$MOV A,SBUFCLR RICJNE A,#3CH,VOLTAMOV P0,ASETB EARET
Solução do Item_2:
;********************ENVIA: MOV SBUF,A
JNB TI,$CLR TIRET
;*************************Sub‐rotina que envia o valor de R2TRANS_ASC:
MOV A,R2SWAP AANL A,#0FHACALL CONV2ACALL ENVIAMOV A,R2ANL A,#0FHACALL CONV2ACALL ENVIARET
DESLIG: CLR P3.7ACALL ATENDERETI
Local de inserção da subrotina ATENDE
MOV R2,#00ACALL APAGAACALL ZERA_DISP
LOOP: JNB P3.3,NORCLR P3.7ACALL ATENDE
NOR: ACALL DADOSACALL DMUXSJMP LOOP