A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

MICROPROCESSADORES E MICROCONTROLADORES

Apresentações semelhantes


Apresentação em tema: "MICROPROCESSADORES E MICROCONTROLADORES"— Transcrição da apresentação:

1 MICROPROCESSADORES E MICROCONTROLADORES
Parte 2 Microcontrolador 8051 José Wilson Lima Nerys Página: s: e

2 Mostra valores menores que 50H e valores maiores que 85H
Leitura de Tabela no 8085 x 8051 Mostra valores menores que 50H e valores maiores que 85H Fluxograma para o 8085 Fluxograma para o 8051

3 Assembly do 8085 Endereço Mnemônico Dado 2000H LXI SP, 2070H 2050H 10H
Dado 2000H LXI SP, 2070H 2050H 10H 2030H MVI C,50H 2003H LXI H,2050H 2051H 50H 2032H DCR C 2006H MOV A,M 2052H 25H 2033H JNZ 2032H 2007H CPI 50H 2053H 60H 2036H RET 2009H JC 2014H 2054H 65H 200CH CPI 85H 2055H A0H 200EH JC 201CH 2056H 70H 2011H JZ 201CH 2057H 90H 2014H PUSH H 2058H 85H 2069H 2015H CALL MOSTRA 2059H 87H 206AH 2018H CALL ATRASO 205AH 45H 206BH 201BH POP H 205BH 39H 206CH 1BH 201CH INX H 205CH C5H 206DH 20H 201DH MOV A,L 205DH 11H 206EH 55H 201EH CPI 60H 205EH 33H 206FH 2020H JNZ 2006H 205FH D2H 2070H 2023H HLT

4 Assembly do 8051 Rótulo Mnemônico Dado 0000H LJMP INICIO JC V2 TABELA:
Dado 0000H LJMP INICIO JC V2 TABELA: 10H JZ V2 50H ORG 30H MOSTRA: MOV P1,R0 25H INICIO: MOV SP,#2FH LCALL ATRASO 60H MOV DPTR,#TABELA V2: INC R7 65H MOV R7,#00H SJMP V0 A0H V0: MOV A,R7 70H MOVC ATRASO: MOV R1,#200 90H CJNE A,#0FFH,V1 DJNZ R1,$ 85H SJMP FIM RET 87H V1: CLR CY 45H MOV R0,A 39H SUBB A,#50H C5H JC MOSTRA 11H MOV A,R0 33H SUBB A,#85H D2H FFH  Assembly do 8051

5

6

7 Memória RAM

8 Memória RAM

9 Memória RAM

10 Memória RAM

11 MOV 80H,A MOV R0,#80H Conteúdo de A é armazenado no registrador especial 80H, que corresponde à Porta P0 Conteúdo de A é armazenado na posição 80H da memória RAM

12 Registradores Especiais

13 Registradores Especiais

14 Algumas Instruções do 8051 Instrução Descrição MOV A,#Dado8
Carrega acumulador com o Dado de 8 bits MOV Rn,#Dado8 Carrega registrador Rn (n=0 a 7) com o Dado de 8 bits MOV A,B Copia no registrador A (acumulador) o conteúdo do registrador B MOV Rn,A Copia no registrador Rn (n = 0 a 7) o conteúdo do acumulador MOV A,direto Copia em A o conteúdo do registrador identificado pelo endereço “direto” MOV dir1,dir2 Copia no registrador identificado pelo endereço “dir1” o conteúdo do registrador identificado pelo endereço “dir2” Copia o conteúdo de A na posição apontada por R0 MOV DPTR,#dado16 O registrador duplo DPTR recebe um dado de 16 bits MOVC Carrega acumulador com o conteúdo da posição apontada por A+DPTR

15 Algumas Instruções do 8051 Instrução Descrição CJNE A,#dado,Ender
Compara conteúdo de A com o “dado”; se não forem iguais, desvia para o endereço “Ender” CJNE Rn,#dado,Ender Compara conteúdo do registrador Rn (n = 0 a 7) com o “dado”; se não forem iguais, desvia para o endereço “Ender” DJNZ Rn,desvio Decrementa o registrador Rn (n = 0 a 7); se o resultado não for zero, desvia para “desvio” SJMP ender Desvia para o endereço “ender”. SJMP = Short Jump (2 bytes de código) LJMP ender Desvia para o endereço “ender”. LJMP = Long Jump (3 bytes de código) JNZ ender Desvia para o endereço “ender”, se a flag Z = 0 JZ ender Desvia para “ender”, se a flag Z = 1 JNC ender Desvia para “ender”, se a flag CY = 0 JC ender Desvia para “ender”, se a flag CY = 1 Codificação: 80 XX, onde XX = número de bytes (em complemento de 2) a ser adicionado ao endereço da próxima instrução, para desviar para o endereço “ender”

16 Algumas Instruções do 8051 Instrução Descrição ADD A,Rn
Adiciona o conteúdo de Rn (n = 0 a 7) ao conteúdo do acumulador ADD A,#dado8 Adiciona o “dado8”, de 8 bits ao conteúdo do acumulador SUBB A,direto Subtrai o conteúdo do registrador identificado pelo endereço “direto”, do conteúdo do acumulador SUBB Subtrai o conteúdo da posição apontada pelo registrador R0 do conteúdo do acumulador RL A Rotaciona o conteúdo de A para a esquerda RR A Rotaciona o conteúdo de A para a direita DA A Faz o ajuste decimal do conteúdo de A INC Rn Incrementa em uma unidade o conteúdo do registrador Rn INC DPTR Incrementa em uma unidade o conteúdo do registrador duplo DPTR CPL A Complementa o conteúdo do acumulador

17 Algumas Instruções do 8051 Instrução Descrição MUL AB
Multiplica o conteúdo de A pelo conteúdo de B. O resultado está em B A. O resultado da multiplicação é um número de 16 bits, por isso precisa de dois registradores para o resultado. DIV AB Divide o conteúdo de A pelo conteúdo de B. A recebe o quociente e B o resto. ANL A,#dado Faz a operação AND, bit a bit, entre o acumulador e o dado de 8 bits ORL A,#dado Faz a operação OR, bit a bit, entre o acumulador e o dado de 8 bits SWAP A Faz a troca dos nibbles do acumulador, ou seja, o nibble mais significativo passa a ocupar os quatro primeiros bits do acumulador e o nibble menos significativo passa a ocupar os quatro últimos bits. Por exemplo, se originalmente, A = 35 H, após a instrução, A = 53 H.

18 Algumas Instruções do 8051 Operações com bits
Instrução Descrição JB bit,desvio Desvia para a posição “desvio”, caso o “bit” esteja setado (se bit=1). Exemplo: Se F0 = 1, então a instrução JB F0,V1 faz o processamento desviar para a posição “V1” JNB bit,desvio Desvia para “desvio”, caso o “bit” seja zero (se bit = 0). SETB bit Faz bit = 1 CLR bit Faz bit = 0 CPL bit Complementa o “bit”. Se bit = 1, então bit torna-se bit=0. MOV bit,C Copia no “bit” o conteúdo da Flag de Carry.

19 Codificação: Contagem crescente Rótulo Mnemônico
Comentário sobre o Efeito da Operação Tempo ORG 00H A próxima instrução estará no endereço 00h LJMP INICIO Pula para o endereço indicado com o rótulo ´inicio´ ORG 30H A próxima instrução estará no endereço 30h INICIO: MOV A,#00H Carrega acumulador com valor 00h V1: MOV P1,A Transfere para a porta P1 o conteúdo do acumulador 1 µs INC A Incrementa em 1 o conteúdo do acumulador. A  A + 1 SJMP V1 Pula para o endereço indicado pelo rótulo ´V1´ 2 µs END Instrução obrigatória no fim de todo programa 4 µs Endereço da próxima instrução Codificação: 1 ORG 00H LJMP INICIO 3 4 ORG 30H INICIO: MOV A,#00H 0032 F V1: MOV P1,A INC A FB SJMP V1 END Intervalo entre cada dois envios para a Porta P1: 4 µs Período: 256 x 4 µs = 1024 µs V1 corresponde ao endereço 0032H = FB (considerando somente o byte menos significativo)

20 Cristal oscilador: 12 MHz
Contagem crescente – Resultado visual (saída do Conversor Digital-Analógico): Onda Dente de Serra Rótulo Mnemônico Tempo ORG 00H LJMP INICIO ORG 30H INICIO: MOV A,#00H V1: MOV P1,A 1 µs INC A SJMP V1 2 µs END 4 µs Período medido com o Proteus: 1020 µs Cristal oscilador: 12 MHz Intervalo entre cada dois envios para a Porta P1: 4 µs Período calculado: 255 x 4 µs = 1020 µs

21 Contagem crescente e decrescente Comentário sobre o Efeito da Operação
Rótulo Mnemônico Comentário sobre o Efeito da Operação ORG 00H A próxima instrução estará no endereço 00h LJMP INICIO Pula para o endereço indicado com o rótulo ´inicio´ ORG 30H A próxima instrução estará no endereço 30h INICIO: MOV A,#00H Carrega acumulador com valor 00h V1: MOV P0,A Transfere para a porta P0 o conteúdo do acumulador INC A Incrementa o conteúdo do acumulador CJNE A,#0FFH,V1 Compara conteúdo do acumulador com “30h”. Caso não seja igual (Compare, Jump if Not Equal), desvia para “V1” V2: DJNZ ACC,V2 Decrementa conteúdo do acumulador e vai para “V2” se não for “zero” SJMP V1 Pula para “V1”. Não precisa usar “LJMP” porque a distância é curta. END Instrução obrigatória no fim de todo programa Quando A = FFH, vai para a próxima linha. Acaba o ciclo crescente e começa o decrescente

22 Contagem crescente e decrescente
Saída do Conversor Digital-Analógico: Onda Triangular Rótulo Mnemônico Tempo Período ORG 00H LJMP INICIO ORG 30H INICIO: MOV A,#00H V1: MOV P0,A 1 µs 255 x 4 µs = 1020 µs INC A CJNE A,#0FFH,V1 2 µs V2: 255 x 3 µs=765 µs DJNZ ACC,V2 SJMP V1 END O primeiro semi-período (crescente: 1020 µs, calculado e 1010 µs medido) é maior que o segundo (decrescente: 765 µs calculado e 781 µs medido) porque o número de instruções executadas é diferente para o primeiro e para o segundo semi-período.

23 Contagem crescente e decrescente
Saída do Conversor Digital-Analógico: Onda Triangular Rótulo Mnemônico Tempo Período ORG 00H LJMP INICIO ORG 30H INICIO: MOV A,#00H V1: MOV P0,A 1 µs 255 x 4 µs = 1020 µs INC A CJNE A,#0FFH,V1 2 µs V2: 255 x 4µs = 1020 µs NOP DJNZ ACC,V2 SJMP V1 END Com a inclusão da instrução NOP, os dois semi-períodos ficaram com tempos calculados iguais e tempos medidos muito próximos (1020 µs e 1030 µs) Instrução NOP (No Operation) usada apenas para gerar um atraso de 1 µs.

24 Comentário sobre o Efeito da Operação
Onda quadrada no pino P1.0 Endereço Código Rótulo Mnemônico Comentário sobre o Efeito da Operação Tempo ORG 00H A próxima instrução estará no endereço 00h 0000H LJMP INICIO Pula para o endereço indicado com o rótulo ´inicio´ ORG 30H A próxima instrução estará no endereço 30h 0030H B2 90 INICIO: CPL P1.0 Complementa o bit 0 da Porta P1 1 µs 0032H 78 32 MOV R0,#50 Carrega registrador R0 com valor decimal 50 0034H D8 FE DJNZ R0,$ Decrementa o conteúdo de R0, até R0 = 0 100 µs 0036H 80 F8 SJMP INICIO Retorna para o início 2 µs 0038H END Instrução obrigatória no fim de todo programa 104 µs Tempo calculado para meio período Tempo medido para meio período com o Proteus: 105,10 µs Cristal oscilador: 12 MHz

25 Leitura de Tabela adaptada para ler 256 valores que, enviados para o Conversor DA, resulta em uma curva senoidal Rótulo Mnemônico CONTADOR EQU 07H ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV DPTR,#Tabela MOV CONTADOR,#00h Mnemônico Tempo  V1: MOV A,CONTADOR 1 µs MOVC 2 µs MOV P0,A INC CONTADOR SJMP V1 Tempo entre leituras: 7 µs Período senoide: 7 µs x 256 = 1792 µs Período medido: 1,80 ms ≡ 556 Hz Como a Tabela de seno tem 256 valores, não há necessidade fazer uma contagem desses valores, uma vez que o CONTADOR volta ao valor zero após atingir o valor máximo FFh. Assim, a leitura volta para o início da Tabela após CONTADOR = FFh.

26 Tabela: seno Parte 1 Parte 2 Parte 3 Parte 4 Parte 5 Parte 6 DB 127
205 250 243 186 104 130 208 251 241 183 101 133 210 252 240 180 98 136 213 239 177 95 139 215 253 237 174 91 143 217 235 171 88 146 219 234 168 86 149 221 254 232 166 83 152 223 230 163 80 155 225 228 159 77 158 227 226 156 74 161 229 224 153 71 164 231 222 150 68 167 233 220 147 66 170 218 144 63 173 236 216 141 60 176 238 214 138 58 179 211 135 55 181 209 132 52 184 242 207 129 50 187 204 125 47 190 245 249 202 122 45 193 246 248 199 119 43 195 247 196 116 40 198 194 113 38 200 191 110 36 203 244 188 107 34 Tabela: seno

27 Parte 7 Parte 8 Parte 9 Parte 10 Parte 11 Parte 12 DB 32 7 13 44 87 30 6 1 15 46 90 28 5 16 49 93 26 4 18 51 96 24 3 2 19 54 99 22 21 56 102 20 23 59 105 25 61 108 17 27 64 111 29 67 115 14 31 70 118 33 73 121 11 8 35 75 124 10 9 37 78 127 39 81 12 41 84

28 Gerador de Função com valores fixos de frequência para cada onda:
1 – Onda quadrada 2 – Onda dente de serra 3 – Onda triangular 4 – Onda senoidal CONTADOR EQU 07H QUAD EQU P2.0  Chave de escolha Onda quadrada SERRA EQU P2.1  Chave de escolha Dente de serra TRI EQU P2.2  Chave de escolha Triangular SENO EQU P2.3  Chave de escolha Senoide ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV DPTR,#Tabela MOV CONTADOR,#00h V1: MOV A,#00H JNB QUAD, QUADRADA  Se QUAD = 0  quadrada JNB SERRA, DENTE_SERRA JNB TRI, TRIANGULAR JNB SENO, SENOIDAL  Se SENO = 0  Senoidal SJMP V1 Primeira parte do programa:

29 Leitura de Tabela com Quantidade de Dados menor que 256
Usando tabela para acionamento de motor de passo

30 Acionamento de Motor de Passo com Passo Completo e Meio Passo
Rótulo Tabela Passo Completo Meio Passo  Tabela: DB 03H DB 01H DB 06H DB 0CH DB 02H DB 09H DB 04H DB 08H END Rótulo Mnemônico ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV DPTR,#Tabela V1:  MOV R7,#00h Rótulo Mnemônico  V2: MOV A,R7 MOVC MOV P1,A LCALL ATRASO INC R7 CJNE R7,#04H,V2 SJMP V1 Offset R7 1 2 3 4 5 6 7 8 A subrotina de atraso de tempo não foi incluída Essa tabela, com apenas 4 valores, pode ser usada para o acionamento de um motor de passo (PASSO COMPLETO). A tabela com 8 valores é para acionamento do motor de passo com MEIO PASSO. O motor deve estar conectado, através de um driver, ao nibble inferior da Porta P1.

31 Acionamento de Motor de Passo
Driver ULN 2803 Capacidade de corrente: 500 mA Tensão máxima no pino COM: 50 V

32 Usando Chaves externas para escolher a configuração do acionamento
Rótulo Mnemônico CH0 EQU P2.0 CH1 EQU P2.1 CH2 EQU P2.2 CH3 EQU P2.3 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH V1:  MOV R7,#00h Rótulo Mnemônico  V0: JB CH0,VCH1 MOV DPTR,#Tabela1 SJMP V2  VCH1: JB CH1,VCH2 MOV DPTR,#Tabela2 VCH2:  JB CH2,VCH3 MOV DPTR,#Tabela3 VCH3: JB CH3,V0 MOV DPTR,#Tabela4 V2: MOV A,R7 MOVC CJNE A,#0FFH,V4 SJMP V1 V4: MOV P1,A LCALL ATRASO INC R7 Usando Chaves externas para escolher a configuração do acionamento CH0  sentido horário com passo completo CH1  sentido anti-horário com passo completo CH2  sentido horário com meio passo CH3  sentido anti-horário com meio passo Tarefa: Escolher uma das chaves para Ligar/Desligar Escolher uma das chaves para definir o sentido horário ou anti-horário Escolher uma das chaves para definir se o acionamento é com meio passo ou passo completo Rótulo Mnemônico  ATRASO: MOV R0,#80  V3: MOV R1,#25 DJNZ R1,$ DJNZ R0,V3 RET Tabela1: DB 03H, 06H, 0CH, 09H, 0FFH Tabela2: DB 09H, 0CH, 06H, 03H, 0FFH Tabela3: DB 01H, 03H, 02H, 06H, 04H, 0CH, 08H, 09H, 0FFH Tabela4: DB 09H, 08H, 0CH, 04H, 06H, 02H, 03H, 01H, 0FFH

33 Mostra em P1 o Maior valor de uma Tabela
R0 recebe o maior valor, antes de mostrar em P1

34 Mostra em P1 o Maior valor de uma Tabela
Rótulo Mnemônico ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV DPTR,#Tabela MOV R0,#00h MOV R7,#00H Rótulo Mnemônico  V1: MOV A,R7 MOVC CJNE A,#0FFH,SEGUE MOV P1,R0 SJMP FIM SEGUE: CLR CY MOV B,A SUBB A,R0 JC V2 MOV R0,B V2: INC R7 SJMP V1 Rótulo Mnemônico  Tabela: DB 0A3H DB 16H DB 05H DB 09H DB 0A1H DB 35H DB 0C5H DB 72H DB 40H DB 0FFH  FIM: END Offset R7 1 2 3 4 5 6 7 8 9

35 Contagem decimal crescente de 0 a 59 e decrescente de 59 a 0
Rótulo Mnemônico ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV A,#00H V1:  MOV P1,A ADD A,#01H DA A CJNE A,#60H,V1 SJMP INICIO END Rótulo Mnemônico ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV A,#60H V1: ADD A,#99H DA A MOV P1,A CJNE A,#00H,V1 SJMP INICIO END Enquanto A < 60H, continua contagem crescente Enquanto A > 00H, continua contagem decrescente

36 Relógio HH:MM:SS

37 Relógio HH:MM:SS RÓTULO MNEMÔNICO SEG EQU 10H MIN EQU 11H HORA EQU 12H
ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH V1: MOV SEG,#00H MOV MIN,#00H MOV HORA,#00H V2: MOV P2,SEG MOV P1,MIN MOV P0,HORA LCALL ATRASO RÓTULO MNEMÔNICO MOV A,SEG ADD A,#01H DA A MOV SEG,A CJNE A,#60H,V2 MOV SEG,#00H MOV A,MIN MOV MIN,A MOV MIN,#00H MOV A,HORA RÓTULO MNEMÔNICO ADD A,#01H DA A MOV HORA,A CJNE A,#24H,V2 SJMP V1 ATRASO: MOV R0,#250 V3: MOV R1,#250 DJNZ R1,$ DJNZ R0,V3 RET END

38 Cronômetro: MM:SS

39 Cronômetro Decrescente: MM:SS
RÓTULO MNEMÔNICO MIN EQU 11H SEG EQU 12H BUZZER EQU P3.7 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH CLR BUZZER MOV MIN,#20H MOV SEG,#00H V1: MOV P2,MIN MOV P1,SEG LCALL ATRASO RÓTULO MNEMÔNICO MOV A,SEG ADD A,#99H DA A MOV SEG,A CJNE A,#99H,V1 MOV SEG,#59H MOV A,MIN MOV MIN,A MOV MIN,#00H MOV SEG,#00H RÓTULO MNEMÔNICO MOV P2,MIN MOV P1,SEG SETB BUZZER MOV R7,#10 V2: LCALL ATRASO DJNZ R7,V2 CLR BUZZER SJMP $ ATRASO: MOV R0,#250 V3: MOV R1,#250 DJNZ R1,$ DJNZ R0,V3 RET END

40 Interrupção Solicitada Endereço de desvio
Interrupções do 8051 Endereços de Desvio das Interrupções: Interrupção Solicitada Endereço de desvio Reset 0000h INT0\ 0003h Timer/counter 0 000Bh INT1\ 0013h Timer/counter 1 001Bh Canal Serial 0023h Registradores associados à interrupção: Registrador de Habilitação: IE (Interrupt Enable) = Registrador A8h Registrador de Prioridades: IP (Interrupt Priority) = Registrador B8h Registrador de Controle: TCON (Timer Control) = Registrador 88h

41 Registrador de Habilitação: IE (Interrupt Enable) = Registrador A8h
Bit 7 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 EA x ES ET1 EX1 ET0 EX0 EA  Enable All. Com EA = 1, todas as interrupções podem ser habilitadas individualmente. Com EA = 0, ficam todas mascaradas. ES  Enable Serial. Com ES = 1, a interrupção pelo canal serial fica habilitada. Com ES = 0 os pedidos de interrupção da serial são ignorados. ET1  Enable Timer 1. Com ET1 = 1, as interrupções pedidas pelo Timer 1 são atendidas. Com ET1 = 0 elas são ignoradas. EX1  Enable External Interrupt 1. Com EX1 = 1, as interrupções pedidas através do pino P3.3 são atendidas. Com EX1 = 0 elas são ignoradas. ET0  Enable Timer 0. Com ET0 = 1, as interrupções pedidas pelo Timer 0 são atendidas. Com ET0 = 0 elas são ignoradas. EX0  Enable External Interrupt 0. Com EX0 = 1, as interrupções pedidas através pino P3.2 são atendidas. Com EX0 = 0 elas são ignoradas.

42 Registrador de Controle: TCON (Timer Control) = Registrador 88h TCON =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IE1  Interrupt 1 Edge Flag - É setado pelo hardware quando uma interrupção externa através de INT1\ é detectada. É zerada quando da execução da instrução RETI (retorno da subrotina de atendimento). IT1  (Interrupt 1 Type) - Quando IT1 = 1 a interrupção externa 1 será reconhecida pela transição de 1 para 0 no pino P3.3. Quando IT1 = 0, a interrupção é reconhecida quando o sinal no pino P3.3 está em nível baixo (0 = interrupção por nível). IE0  (Interrupt 0 Edge Flag) - É setado pelo hardware quando uma interrupção externa através de INT0\ é detectada. É zerada quando da execução da instrução RETI. IT0  (Interrupt 0 Type) - Quando IT0 = 1 a interrupção externa 0 será reconhecida pela transição de 1 para 0 no pino INTO\. Quando IT0 = 0, a interrupção é reconhecida quando o sinal no pino INTO\ está em nível baixo (0).

43 Registrador de Prioridade: IP (Interrupt Priority) = Registrador B8h
X PS PT1 PX1 PT0 PX0 PS  Priority of Serial Port Interrupt  Sendo PS = 1, a interrupção serial tem prioridade alta. PT1  Priority of Timer Interrupt 1 Sendo PT1 = 1, a interrupção do temporizador 1 tem prioridade alta. PX1  Priority of External Interrupt 1  Sendo PX1 = 1, a interrupção externa 1 tem prioridade alta. PT0  Priority of Timer Interrupt 0 Sendo PT0 = 1, a interrupção do temporizador 0 tem prioridade alta. PX0  Priority of External Interrupt 0  Sendo PX0 = 1, a interrupção externa 0

44 Interrupção Prioridade Externa 0 Maior Temporizador 0 Externa 1
Uma interrupção ter prioridade alta (Prioridade 1) significa que ela será atendida sempre que solicitada, mesmo quando o programa está executando uma outra interrupção. No caso de todos os canais de interrupção terem prioridade 0 ou 1, a escala de prioridade é como segue: Interrupção Prioridade Externa 0 Maior Temporizador 0 Externa 1 Temporizador 1 Serial Menor

45 Usando Interrupções (antes de estudar interrupções)
Para escolher o valor inicial do cronômetro e para iniciar a contagem RÓTULO MNEMÔNICO COMENTÁRIO ORG 00H LJMP INICIO ORG 03H Endereço da Interrupção externa 0 (EX0) MOV A,MIN A recebe o valor atual dos Minutos ADD A,#01H Acrescenta 01H ao conteúdo de A DA A Faz o ajuste decimal do conteúdo de A MOV MIN,A Transfere para MIN o conteúdo atualizado dos minutos RETI Retorna da Interrupção externa 0 ORG 13H Endereço da Interrupção externa 0 (EX1) SETB F0 Faz F0 = 1 para dar início à contagem Retorna da interrupção externa 1

46 Usando Interrupções (antes de estudar interrupções)
Para escolher o valor inicial do cronômetro e para iniciar a contagem RÓTULO MNEMÔNICO COMENTÁRIO ORG 30H INÍCIO: MOV SP,#2FH MOV IE,#85H Habilita as interrupções externas 0 e 1 MOV TCON,#05H As interrupções externas 0 e 1 são por transição CLR F0 Limpa a flag F0, que é usada para iniciar a contagem MOV SEG,#00H Faz o registrador SEG = 0 CLR BUZZER Limpa a saída que aciona o alarme V1: MOV P1,SEG Mostra valor atual de MINuto e SEGundo MOV P2,MIN JNB F0,V1 Aguarda enquanto F0 = 0

47 Rotação de Leds à esquerda (CH0 = 0) e à direita (CH1 = 0)
Rótulo Mnemônico CH0 EQU P3.2 CH1 EQU P3.3 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV A,#01H V1: JB CH0,VCH1 Rótulo Mnemônico MOV P1,A RL A LCALL ATRASO SJMP V1 VCH1: JB CH1,V1 RR A Rótulo Mnemônico  ATRASO: MOV R0,#100  V2: MOV R1,#200 DJNZ R1,$ DJNZ R0,V2 RET END

48 Leds piscando (CH0 = 0) e alternando (CH1 = 0)
Rótulo Mnemônico CH0 EQU P3.2 CH1 EQU P3.3 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV R6,#00H MOV R7,#55H V1: JB CH0,VCH1 Rótulo Mnemônico MOV P1,R6 MOV A,R6 LCALL ATRASO CPL A MOV R6,A SJMP V1 VCH1: JB CH1,V1 MOV P1,R7 MOV A,R7 MOV R7,A Rótulo Mnemônico  ATRASO: MOV R0,#100  V2: MOV R1,#200 DJNZ R1,$ DJNZ R0,V2 RET END

49 Multiplicação e Divisão de Números de 8 bits
Rótulo Mnemônico ORG 00H LJMP INICIO INICIO: MOV SP,#2FH MOV A,#200 MOV B,#40 MUL AB JB P3.2,$ MOV P2,A MOV P1,B END Rótulo Mnemônico ORG 00H LJMP INICIO INICIO: MOV SP,#2FH MOV A,#200 MOV B,#40 DIV AB JB P3.2,$ MOV P2,A MOV P1,B END

50 Adição e Subtração de Números de 16 bits

51 ; ADIÇÃO DE NÚMEROS DE 16 BITS Z = X + Y
XH EQU 10H ; Número X de 16 bits XL EQU 11H YH EQU 12H ; Número Y de 16 bits YL EQU 13H ZH EQU 14H ; Resultado da adição de 16 bits ZL EQU 15H ZOV BIT 00H ; Flag de carry do resultado de 16 bits ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV XH,#40H MOV XL,#00H MOV YH,#35H MOV YL,#50H MOV A,XL ADD A,YL ; Adição do byte inferior, sem carry MOV ZL,A MOV A,XH ADDC A,YH ; Adição do byte superior, com carry MOV ZH,A MOV ZOV,C END

52 ; SUBTRAÇÃO DE NÚMEROS DE 16 BITS Z = X - Y
XH EQU 10H ; Número X de 16 bits XL EQU 11H YH EQU 12H ; Número Y de 16 bits YL EQU 13H ZH EQU 14H ; Resultado da adição de 16 bits ZL EQU 15H ZOV BIT 00H ; Flag de carry do resultado de 16 bits ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV XH,#40H MOV XL,#00H MOV YH,#35H MOV YL,#50H MOV A,XL CLR CY SUBB A,YL MOV ZL,A MOV A,XH SUBB A,YH MOV ZH,A MOV ZOV,C END

53 Laço infinito aguardando interrupção
Programa que envia uma contagem crescente para a porta P1 a cada solicitação da interrupção INT0 (através do pino P3.2). Contagem encerra quando A retorna para 00 RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP CONTAGEM ORG 30H INICIO: MOV SP, #2FH MOV IE, #81H MOV TCON, #01H MOV A, #00H SJMP $ RÓTULO MNEMÔNICO CONTAGEM: MOV P1,A INC A LCALL ATRASO CJNE A,#00H,CONTAGEM RETI ATRASO: MOV R0,#10 V1: MOV R1,#100 DJNZ R1, $ DJNZ R0, V1 RET END Exemplos Laço infinito aguardando interrupção Habilita interrupção externa 0 por transição

54 Programa que envia uma contagem crescente para a porta P1 a cada solicitação da interrupção INT0 e uma decrescente a cada solicitação da INT1. RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP ATENDE0 ORG 13H LJMP ATENDE1 ORG 30H INICIO: MOV SP, #2FH MOV IE, #85H MOV TCON, #05H SJMP $ RÓTULO MNEMÔNICO ATENDE0: PUSH ACC MOV A,#00H V1: MOV P1,A INC A LCALL ATRASO CJNE A,#00H,V1 POP ACC RETI RÓTULO MNEMÔNICO ATENDE1: PUSH ACC MOV A,#0FFH V2: MOV P1,A LCALL ATRASO DEC A CJNE A,#0FFH,V2 POP ACC RETI ATRASO: MOV R0,#10 V3: MOV R1,#100 DJNZ R1, $ DJNZ R0, V3 RET END Exemplos Habilita Interrupções INT0 e INT1 por transição Laço infinito aguardando interrupção

55 Exemplos Programa que envia uma contagem decimal crescente para a porta P1 a cada solicitação da interrupção INT0 e uma decimal decrescente a cada solicitação da INT1. RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP ATENDE0 ORG 13H LJMP ATENDE1 ORG 30H INICIO: MOV SP, #2FH MOV IE, #85H MOV TCON, #05H MOV A,#00H SJMP $ RÓTULO MNEMÔNICO ATENDE0: PUSH ACC V1: MOV P1,A ADD A,#01H DA A LCALL ATRASO CJNE A,#00H,V1 POP ACC RETI RÓTULO MNEMÔNICO ATENDE1: PUSH ACC V2: ADD A,#99H DA A MOV P1,A LCALL ATRASO CJNE A,#00H,V2 POP ACC RETI ATRASO: MOV R0,#250 V3: MOV R1,#250 DJNZ R1, $ DJNZ R0, V3 RET END Adiciona 1 e faz ajuste decimal Subtrai 1 e faz ajuste decimal Habilita Interrupções INT0 e INT1 por transição Laço infinito aguardando interrupção

56 Programa que envia uma contagem crescente para a porta P1 a cada solicitação da interrupção INT0 e uma decrescente a cada solicitação da INT1 (Prioridade alta). RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP ATENDE0 ORG 13H LJMP ATENDE1 ORG 30H INICIO: MOV SP, #2FH MOV IE, #85H MOV TCON, #05H MOV IP,#04H SJMP $ RÓTULO MNEMÔNICO ATENDE0: PUSH ACC MOV A,#00H V1: MOV P1,A INC A LCALL ATRASO CJNE A,#00H,V1 POP ACC RETI RÓTULO MNEMÔNICO ATENDE1: PUSH ACC MOV A,#0FFH V2: MOV P1,A LCALL ATRASO DEC A CJNE A,#0FFH,V2 POP ACC RETI ATRASO: MOV R0,#10 V3: MOV R1,#100 DJNZ R1, $ DJNZ R0, V3 RET END Exemplos Habilita Interrupções INT0 e INT1 por transição. INT1 tem prioridade alta Laço infinito aguardando interrupção

57 Exemplos Programa rotaciona Leds conectados à porta P1.
INT0 rotaciona à esquerda; INT1 rotaciona à direita. RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP ATENDE0 ORG 13H LJMP ATENDE1 ORG 30H INICIO: MOV SP, #2FH MOV IE, #85H MOV TCON, #05H SJMP $ RÓTULO MNEMÔNICO ATENDE0: PUSH ACC MOV A,#01H V1: MOV P1,A RL A LCALL ATRASO CJNE A,#01H,V1 POP ACC RETI RÓTULO MNEMÔNICO ATENDE1: PUSH ACC MOV A,#80H V2: MOV P1,A LCALL ATRASO RR A CJNE A,#80H,V2 POP ACC RETI ATRASO: MOV R0,#250 V3: MOV R1,#250 DJNZ R1, $ DJNZ R0, V3 RET END Exemplos Habilita Interrupções INT0 e INT1 por transição Laço infinito aguardando interrupção

58 Programa rotaciona Leds conectados à porta P1.
INT0 rotaciona à esquerda; INT1 rotaciona à direita (com prioridade alta). RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP ATENDE0 ORG 13H LJMP ATENDE1 ORG 30H INICIO: MOV SP, #2FH MOV IE, #85H MOV TCON, #05H MOV IP,#04H SJMP $ RÓTULO MNEMÔNICO ATENDE0: PUSH ACC MOV A,#01H V1: MOV P1,A RL A LCALL ATRASO CJNE A,#01H,V1 POP ACC RETI RÓTULO MNEMÔNICO ATENDE1: PUSH ACC MOV A,#80H V2: MOV P1,A LCALL ATRASO RR A CJNE A,#80H,V2 POP ACC RETI ATRASO: MOV R0,#250 V3: MOV R1,#250 DJNZ R1, $ DJNZ R0, V3 RET END Exemplos Habilita Interrupções INT0 e INT1 por transição. INT1 tem prioridade alta Laço infinito aguardando interrupção

59 INT0 rotaciona para a esquerda; INT1 rotaciona para a direita.
Exemplos Programa rotaciona Motor de Passo conectado ao nibble inferior da porta P1. INT0 rotaciona para a esquerda; INT1 rotaciona para a direita. RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 03H LJMP ATENDE0 ORG 13H LJMP ATENDE1 ORG 30H INICIO: MOV SP, #2FH MOV IE, #85H MOV TCON, #05H MOV A,#11H SJMP $ RÓTULO MNEMÔNICO ATENDE0: PUSH ACC MOV R7,#18 V1: MOV P1,A RL A LCALL ATRASO DJNZ R7,V1 POP ACC RETI RÓTULO MNEMÔNICO ATENDE1: PUSH ACC MOR R7,#36 V2: MOV P1,A RR A LCALL ATRASO DJNZ R7,V2 POP ACC RETI ATRASO: MOV R0,#250 V3: MOV R1,#250 DJNZ R1, $ DJNZ R0, V3 RET END São 18 passos de 5º Total: 90º Habilita Interrupções INT0 e INT1 por transição Laço infinito aguardando interrupção

60 INT0 mostra em P1 maior valor de uma Tabela. INT1 mostra o menor valor
Rótulo Mnemônico ORG 00H LJMP INICIO ORG 03H LJMP MAIOR ORG 13H LJMP MENOR Rótulo Mnemônico ORG 30H INICIO: MOV SP,#2FH MOV IE,#85H MOV TCON,#05H MOV DPTR,#TABELA V1: MOV R7,#00H MOV R0,#00H MOV R1,#0FFH SJMP V1

61 INT0 mostra em P1 maior valor de uma Tabela. INT1 mostra o menor valor
Rótulo Mnemônico MAIOR: MOV A,R7 MOVC CJNE A,#0FFH,V2 MOV P1,R0 RETI V2: CLR CY MOV B,A SUBB A,R0 JC V3 MOV R0,B V3: INC R7 SJMP MAIOR Rótulo Mnemônico MENOR: MOV A,R7 MOVC CJNE A,#0FFH,V4 MOV P1,R1 RETI V4: CLR CY MOV B,A SUBB A,R1 JNC V5 MOV R1,B V5: INC R7 SJMP MENOR Rótulo Dado TABELA: DB 05H DB 35H DB 12H DB 98H DB 0A1H DB 0B5H DB 5AH DB 09H DB 72H DB 40H DB 0FFH END

62 Breve Introdução aos Conversores AD e DA
Como os dados de um microprocessador estão na forma digital e os dados do mundo exterior estão na forma analógica (contínua), é necessário fazer a conversão entre esses dados. Assim, tem-se o Conversor Analógico-Digital (ADC), que faz a conversão de sinal analógico para sinal digital e o Conversor Digital-Analógico (DAC), que faz a conversão de sinal digital para sinal analógico. ADC DAC Micro- controlador Sinal Analógico Sinal Digital Velocidade Temperatura Tensão Corrente Pressão

63 Conversor DA Básico de 4 bits

64 Conversor DA Básico De 4 bits D3 D2 D1 D0 Corrente saída
(Vref = 5 V e R = 5 kΩ) Fração do máximo 1 0.125 1/15 0.250 2/15 0.375 3/15 0.500 4/15 0.625 5/15 0.750 6/15 0.875 7/15 1.000 8/15 1.125 9/15 1.250 10/15 1.375 11/15 1.500 12/15 1.625 13/15 1.750 14/15 1.875 15/15 Conversor DA Básico De 4 bits

65 Conversor DA Básico de 4 bits
máx 1 LSB

66 Resolução de um DA Cada degrau (menor incremento possível) corresponde a 1 LSB (bit menos significativo) (b) Número de degraus de um conversor: 2n – 1, onde n é o número de bits. Para n = 4  15 degraus. Resolução: É a relação entre o menor incremento possível, 1 LSB e a saída máxima. Resolução = , onde n é número de bits. No caso de n = 4  Resolução = 1/15 Resolução Percentual = Resolução  100% No caso de 4 bits  Resolução Percentual = 6.67%

67 Resolução Percentual (%)
Resolução do DA versus Número de bits Número de bits Resolução Resolução Percentual (%) 4 1/15 6,67 8 1/255 0,392 10 1/1023 0,09775 12 1/4095 0,02442 16 1/65535 0,000381

68 Conversor DA com resistores em escada

69 Conversor DAC 0808

70 Conversor ADC Básico

71 Conversor ADC com Aproximação Sucessiva

72 Conversor ADC 0804 Saída Sinais de Controle CS\  habilita o CI RD\  habilita a saída dos dados RW\  trigger

73 Diagrama de Temporização do Conversor ADC0804
Tempo de conversão aproximado: 100 µs

74 Programa para leitura do Conversor AD
Rótulo Instrução CS EQU P3.4 RS EQU P3.5 RW EQU P3.6 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH V1: LCALL LE_AD MOV P1,A SJMP V1 Rótulo Instrução LE_AD: CLR CS LCALL ATRASO SETB RW CLR RW SETB RW ; Começa a conversão SETB CS JB P3.3,$ ; Aguarda fim de conversão CLR RS ; Liberada dados na saída MOV A,P ; Transfere resultado para A SETB RS RET Rótulo Instrução ATRASO: MOV R0,#50 DJNZ R0,$ RET END Loop infinito: Aguarda sinal de fim de conversão. Pino INTR do AD conectado ao pino P3.3 do 8051 Loop infinito: Chama subrotina de Leitura do AD e mostra resultado em A

75 Temporização no problema anterior
WR\ INTR RS\ CS\ Leitura habilitada (libera dados na saída) Fim da conversão Início da conversão

76 Programa 2: Conversor AD usando interrupção
Rótulo Instrução ORG 00H LJMP INICIO ORG 03H MOV A,P2 RETI ORG 30H INICIO: MOV SP,#2FH MOV IE,#81H MOV TCON,#01H V1: MOV P1,A SJMP V1 END O conversor AD está operando de forma independente e ininterrupta. O sinal de final de conversão é usado para dar início à próxima conversão. A cada fim de conversão do conversor AD, um sinal de pedido de interrupção é enviado ao 8051, através do pino P3.2 (interrupção zero). Assim, o processamento desvia para o endereço 03H, onde o resultado da conversão (disponibilizado na porta P2) é transferido para A Interrupção externa zero é habilitada por transição. Loop infinito: O conteúdo de A é copiado na porta P1 (Leds). A atualização de A ocorre a cada final de conversão, através da interrupção externa zero. 76

77 Uso do Teclado com Interrupção (Decodificador de teclado: 74C922)
Sinal alto (saída) quando a conversão acaba A saída (AD3, AD2, AD1, AD0) do decodificador 74C922 é conectado ao nibble inferior da Porta P2 Pedido de interrupção para o 8051 (na transição de alto para baixo) Sinal baixo (entrada) para liberar o resultado na saída A B C D

78 Uso do Teclado com Interrupção (Decodificador de teclado: 74C922)
Rótulo Instrução ORG 00H LJMP INICIO ORG 13H MOV A,P2 ANL A,#0FH RETI ORG 30H INICIO: MOV SP,#2FH MOV IE,#84H MOV TCON,#04H V1: MOV P1,A SJMP V1 END Endereço da interrupção externa 1 O conteúdo da porta P2 é copiado no acumulador. A instrução ANL A,#0FH (AND) elimina o nibble superior da leitura de P2. interrupção externa 1 por transição Loop infinito: Mostra o conteúdo de A, que é atualizado, através da interrupção externa 1, a cada vez que o teclado é pressionado

79 Uso do Teclado com Interrupção (Decodificador de teclado: 74C922)
Nesse programa o Teclado é usado para “entrar” com um número de dois dígitos. Rótulo Instrução ORG 00H LJMP INICIO ORG 13H LJMP LE_TECLADO ORG 30H INICIO: MOV SP,#2FH MOV IE,#84H MOV TCON,#04H CLR F0 V1: MOV P1,A SJMP V1 Rótulo Instrução LE_TECLADO: JB F0,NIBBLE2 MOV A,P2 ANL A,#0FH SWAP A MOV B,A SETB F0 RETI NIBBLE2: ORL A,B CLR F0 END Leitura do dígito superior do número de dois dígitos. O dado lido de P2 passa por uma operação AND para eliminar o nibble superior (lixo). A instrução SWAP A transfere o dado lido (nibble inferior) para o nibble superior. O resultado é guardado em B. A flag F0 é setada para direcionar a próxima interrupção para NIBBLE2. Leitura do dígito inferior do número de dois dígitos. O dado lido de P2 passa por uma operação AND para eliminar o nibble superior (lixo). A instrução OR entre junta conteúdo de A (dígito inferior) com o conteúdo de B (dígito superior). A flag F0 é zerada para direcionar a próxima interrupção para a primeira parte dessa subrotina. Loop infinito: Mostra o conteúdo de A, que é atualizado, através da interrupção externa 1, a cada vez que o teclado é pressionado

80 O microcontrolador AT89S8252 possui 3 temporizadores.
O 8051 tem 2 temporizadores/contadores de 16 bits que podem operar de 4 modos distintos: Modo 0  Contador/Temporizador de 13 bits com divisor de frequência de até 32 vezes. Pode contar até 8192 (32  255). Modo 1  Contador/Temporizador de 16 bits. Pode contar até Modo 2  2 contadores/temporizadores de 8 bits com recarga automática. Modo 3  2 contadores/temporizadores independentes de 8 bits. O microcontrolador AT89S8252 possui 3 temporizadores.

81 Os registradores que comandam o Contador-Temporizador são:
Temporizadores Os registradores que comandam o Contador-Temporizador são: Registrador do Temporizador: TMOD (Timer Mode) = Registrador 89h TMOD = G1 C/T1 M11 M10 G0 C/T0 M01 M00 Modo 0 1 Modo 1 Modo 2 Modo 3 Modo 0 1 Modo 1 Modo 2 Modo 3 Registrador de Controle: TCON (Timer Control) = Registrador 88h TCON = TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Temporizador 1 Temporizador zero

82 Registrador do Temporizador: TMOD (Timer Mode) = Registrador 89h
Temporizadores Registrador do Temporizador: TMOD (Timer Mode) = Registrador 89h TMOD = G1 C/T1 M11 M10 G0 C/T0 M01 M00 G Gate Sendo 0, o disparo do temporizador/contador é interno, através de TR. Sendo 1, o disparo pode ser através de TR ou através do pino externo P3.2 (INT0\) ou P3.3 (INT1\). C/T\  Sendo 0, a operação é como temporizador, onde a freqüência de operação é 1/12 da frequência do cristal oscilador. Sendo 1, a frequência é determinada por um componente externo, através do pino P3.4 (T0) ou P3.5 (T1).

83 Registrador de Controle: TCON (Timer Control) = Registrador 88h
Temporizadores Registrador de Controle: TCON (Timer Control) = Registrador 88h TCON = TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TR Quando G = 0, fazendo-se TR = 1, o temporizador inicia a contagem a partir do valor armazenado em TH e TL. TR = 0 para o temporizador. TF  A cada fim de contagem TF é setado (TF = 1) pelo hardware. Se a interrupção do temporizador estiver habilitada, ocorre o desvio para o endereço correspondente, 0Bh para o temporizador 0 e 1Bh para o temporizador 1.

84 Temporizadores Lógica para habilitar contagem

85 Temporizadores O bit C/T\ do registrador TMOD define se o funcionamento é como contador (C/T\ = 1), ou como temporizador (C/T\ = 0). Como temporizador, o clock é interno, vindo do oscilador. A frequência é 1/12 da frequência do cristal oscilador. Como contador, o clock é externo, vindo através de T0 (P3.4). O pino Gate\ define se o sinal de disparo do contador/temporizador vem através de software (bit TR0), ou de um sinal externo, através do pino INT0\ (P3.2). Se Gate\ = 0, o comando SETB TR0 dispara o contador/temporizador e CLR TR0 interrompe.

86 Exemplos com temporizadores e contadores
Cristal de 12 MHz ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#01H MOV TH0,#HIGH(55535) MOV TL0,#LOW(55535) SETB TR0 SJMP $ END Nesse exemplo o temporizador zero foi configurado para o modo 1 (TMOD = ) e a primeira contagem começa do valor Toda contagem vai até , e, então, o valor de TH0-TL0 torna-se zero e a contagem continua. A contagem não para, enquanto TR0 permanecer em nível lógico alto (TR0 = 1). Assim, a primeira contagem, nesse exemplo, conta pulsos. A partir da segunda contagem, no entanto, TH0-TL0 contam, continuamente, de 0 a TH0 = D8H TL0 = EFH

87 Exemplos com temporizadores e contadores
Cristal de 12 MHz ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#01H V1: MOV TH0,#HIGH(15535) MOV TL0,#LOW(15535) SETB TR0 CPL P1.0 JNB TF0,$ CLR TF0 SJMP V1 END Nesse exemplo o temporizador zero foi configurado para o modo 1 (TMOD = ). Ao contrário do exemplo anterior, todas as contagens começam do valor porque, a cada final de contagem (quando TF0 = 1), o processamento retorna para V1, onde os valores de TH0 e TL0 são recarregados. Assim, a contagem é de pulsos. Sendo o cristal de 12 MHz, o contador conta 50 ms. O exemplo também apresenta uma forma de verificar o tempo de contagem do temporizador, gerando uma onda quadrada no pino P1.0. Loop de espera do fim da contagem A Flag TF0 (fim de contagem) deve ser zerada antes de recarregar TH0 e TL0

88 Exemplos com temporizadores e contadores
Cristal de MHz Esse exemplo é idêntico ao anterior, com a diferença de usar um cristal oscilador de MHz. Dessa forma, cada período do temporizador corresponde a 1,085 µs, ao invés de 1 µs. Assim, para gerar uma contagem de 50 ms, são necessários pulsos, ou seja, a contagem deve começar de TH0-TL0 = 4BFFH, que corresponde ao número decimal No programa poderia ter sido usado: MOV TH0, #HIGH(19455) MOV TL0,#LOW(19455) ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#01H V1: MOV TH0,#4BH MOV TL0,#0FFH SETB TR0 CPL P1.0 JNB TF0,$ CLR TF0 SJMP V1 END

89 Exemplos com temporizadores e contadores
Cristal de MHz ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#09H SETB TR0 V1: MOV TH0,#HIGH(19455) MOV TL0,#LOW(19455) CPL P1.0 JNB TF0,$ CLR TF0 SJMP V1 END Nesse exemplo, o temporizador zero, no modo 1, gera uma onda quadrada com período de 100 ms (contagem de a 65535, com cristal de MHz). No entanto, o disparo do temporizador é EXTERNO, através do pino P3.2 (uma chave tipo push-button deve ser conectada entre o pino P3.2 e o Terra). Com P3.2 = 0, o temporizador fica parado; com P3.2 = 1, o temporizador prossegue a contagem. TMOD = 09H =  Pino G\ = 1 (disparo externo) e M1-M0 = 01 (temporizador zero no modo 1) A Flag TR0 é setada para habilitar esse disparo externo.

90 Exemplos com temporizadores e contadores
Cristal de MHz ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#05H SETB TR0 V1: MOV P2,TH0 MOV P1,TL0 SJMP V1 END Nesse exemplo tem-se um CONTADOR no modo 1 (16 bits). O Sinal de clock é aplicado ao pino P3.4. Duas situações podem ser criadas, no Proteus: Conectar uma chave entre os pinos P3.4 e o Terra. A cada pulso dessa chave, a contagem em TH0-TL0 é incrementada em 1. Conectar um gerador de função, com pulso quadrado, ao pino P3.4. A contagem em TH0-TL0 seguirá esse clock., TMOD = 05H =  Pino C/T\ = 1 (contador) e M1-M0 = 01 (contador zero no modo 1) O valor de TH0 é mostrado na porta P2 O valor de TL0 é mostrado na prota P1 A Flag TR0 é setada para o início da contagem

91 Exemplos com temporizadores e contadores
Cristal de MHz ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#04H SETB TR0 V1: MOV P2,TH0 MOV P1,TL0 SJMP V1 END Nesse exemplo tem-se um CONTADOR no modo 0 (13 bits). O Sinal de clock é aplicado ao pino P3.4. As mesmas situações do exemplo anterior podem ser utilizadas. A diferença é que os valores mostrados em P2 e P1 são diferentes: P1 (valor de TL0) mostra uma contagem de 00h até 1Fh, continuamente. Ao final de cada contagem, o valor mostrado em P2 (valor de TH0) é incrementado em 1 TMOD = 04H =  Pino C/T\ = 1 (contador) e M1-M0 = 00 (contador zero no modo 0) O valor de TH0 é mostrado na porta P2 O valor de TL0 é mostrado na prota P1 A Flag TR0 é setada para o início da contagem

92 Exemplos com temporizadores e contadores
Cristal de MHz ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#06H SETB TR0 MOV TH0,#40H V1: MOV P2,TH0 MOV P1,TL0 SJMP V1 END Nesse exemplo tem-se um CONTADOR no modo 2 (8 bits com recarga automática). No modo 2 (recarga automática), cada nova contagem começa do valor de TH0. Assim, no programa mostrado, cada nova contagem começa de TH0 = 40H. O sinal de clock deve ser conectado ao pino P3.4. TMOD = 06H =  Pino C/T\ = 1 (contador) e M1-M0 = 10 (contador zero no modo 0) Valor da recarga O valor de TH0 é mostrado na porta P2 O valor de TL0 é mostrado na prota P1

93 Exemplos com temporizadores e contadores
Cristal de MHz ORG 00H LJMP INICIO ORG 03H MOV A,TH0 ADD A,#5 MOV TH0,A RETI ORG 30H INICIO: MOV SP,#2FH MOV IE,#81H MOV TCON,#01H MOV TMOD,#06H SETB TR0 MOV TH0,#40H V1: MOV P2,TH0 MOV P1,TL0 SJMP V1 END Nesse exemplo tem-se um CONTADOR no modo 2 (8 bits com recarga automática). É idêntico ao exemplo anterior, com uma exceção: A interrupção externa zero (por transição) é usada para incrementar em 5 o valor da recarga, TH0. Assim, cada nova contagem começa do valor anterior de TH0 + 5. Subrotina de atendimento da interrupção externa zero IE = 81h =  Interrupção externa zero habilitada TCON = 01H =  Interrupção externa zero por transição

94 Exemplos com temporizadores e contadores COM INTERRUPÇAO
Cristal de MHz Exemplos com temporizadores e contadores COM INTERRUPÇAO ORG 00H LJMP INICIO ORG 0BH MOV TH0,#HIGH(19455) MOV TL0,#LOW(19455) CPL P1.0 RETI ORG 30H INICIO: MOV SP,#2FH MOV IE,#82H MOV TMOD,#01H SETB TR0 SJMP $ END Nesse exemplo tem-se um TEMPORIZADOR no modo 1 (16 bits), com interrupção ao final de cada contagem. A cada final de contagem (de a 65535) o processamento desvia para o endereço 0BH. Nesse endereço, recarrega-se TH0 e TL0 e complementa-se o pino P1.0 (gera onda quadrada). Com uma contagem de e um cristal de MHz, tem 50 ms para cada meio período (onda quadrada com 100 ms de período) Subrotina de atendimento da interrupção do temporizador zero. IE =  Interrupção do temporizador zero habilitada. Loop infinito esperando interrupção

95 Exemplos com temporizadores e contadores COM INTERRUPÇAO
Cristal de MHz Exemplos com temporizadores e contadores COM INTERRUPÇAO ORG 00H LJMP INICIO ORG 0BH MOV TH0,#HIGH(19455) MOV TL0,#LOW(19455) DJNZ R0,V1 CPL P1.0 MOV R0,#10 V1: NOP RETI ORG 30H INICIO: MOV SP,#2FH MOV IE,#82H MOV TMOD,#01H SETB TR0 SJMP $ END Nesse exemplo tem-se um TEMPORIZADOR no modo 1 (16 bits), com interrupção ao final de cada contagem. A cada final de contagem (de a 65535) o processamento desvia para o endereço 0BH. Nesse endereço, recarrega-se TH0 e TL0. No entanto, o pino P1.0 somente é complementado a 10 passagens pela subrotina (R0 = 10). Com uma contagem de e um cristal de MHz, tem 50 ms para cada meio período, mas o pino P1. 0 é complementado a cada 10 x 50 ms = 0,5 s (resulta em onda quadrada com 1,0 s de período) Subrotina de atendimento da interrupção do temporizador zero. P1.0 somente é complementado a cada 10 atendimentos dessa subrotina. IE =  Interrupção do temporizador zero habilitada. R0 = 10  contador para contar 10 vezes 50 ms Loop infinito esperando interrupção

96 Exemplos com temporizadores e contadores COM INTERRUPÇAO
Cristal de MHz Exemplos com temporizadores e contadores COM INTERRUPÇAO Nesse exemplo tem-se o TEMPORIZADOR zero no modo 0 (13 bits) e o TEMPORIZADOR 1 no modo 1 (16 bits) Ambos começam a contagem de 0 e ambos utilizam suas interrupções. Ao final de cada contagem de 13 bits (0 a 8.191) o processamento desvia para o endereço 0Bh, onde o pino P1.0 é complementado (gerando uma onda quadrada no pino P1.0). Ao final de cada contagem de 16 bits (0 a ) o processamento desvia para o endereço 1Bh, onde o pino P1.1 é complementado (gerando uma onda quadrada no pino P1.1). ORG 00H LJMP INICIO ORG 0BH CPL P1.0 RETI ORG 1BH CPL P1.1 ORG 30H INICIO: MOV SP,#2FH MOV IE,#8AH MOV TMOD,#10H SETB TR0 SETB TR1 SJMP $ END IE =  Interrupções dos temporizadores zero e 1 habilitadas. TMOD = 10h =  Temporizador zero no modo 0 (13 bits); Temporizador 1 modo 1 (16 bits)

97 Exemplos com temporizadores e contadores COM INTERRUPÇAO
Período da onda quadrada no modo zero: 17,77 ms Período da onda quadrada no modo 1: 141,92 ms 1 período no modo 16 bits corresponde a 8 períodos do modo 13 bits.

98 Programa com uma subrotina de atraso de tempo com temporizador
RÓTULO MNEMÔNICO ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP, #2FH MOV TMOD,#01H V1: CPL P1.0 LCALL ATRASO SJMP V1 RÓTULO MNEMÔNICO ATRASO: MOV R0,#20 V2: MOV TH0,#3CH MOV TL0,#0AFH SETB TR0 ESPERA: JNB TF0, ESPERA CLR TF0 DJNZ R0, V2 CLR TR0 RET END São 20 contagens de 50 ms (tempo total: 1 s) Contador conta de até ( pulsos) Dispara o temporizador Espera o final de cada contagem do temporizador Limpa a flag que indica fim de contagem Decrementa R0; se não der zero, volta para nova contagem de 50 ms Para o temporizador Onda quadrada em P1.0 Cristal oscilador: 12 MHz

99 Relógio HH:MM:SS

100 Subrotina de atraso de 1 s
SEG EQU 10H MIN EQU 11H HORA EQU 12H ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#01H CLR P3.7 V1: MOV SEG,#00H MOV MIN,#00H MOV HORA,#00H V2: MOV P1,SEG MOV P2,MIN MOV P0,HORA LCALL ATRASO MOV A,SEG ADD A,#01H DA A MOV SEG,A CJNE A,#60H,V2 MOV SEG,#00H MOV A,MIN MOV MIN,A MOV MIN,#00H MOV A,HORA MOV HORA,A CJNE A,#24H,V2 SJMP V1 ATRASO: SETB TR0 V3: MOV TH0,#HIGH(15535) MOV TL0,#LOW(15535) JNB TF0,$ CLR TF0 DJNZ R0,V3 MOV R0,#20 CLR TR0 RET END Subrotina de atraso de 1 s Relógio HH:MM:SS Cristal de 12 MHz

101 HH MM SS

102 Cronômetro: MM:SS

103 Cristal de 12 MHz 1 s SEG EQU 10H MIN EQU 11H BUZZER EQU P3.7 ORG 00H
LJMP INICIO ORG 03H MOV A,MIN ADD A,#01H DA A MOV MIN,A RETI ORG 13H SETB F0 ;======Configurações iniciais ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#01H MOV IE,#85H MOV TCON,#05H MOV R0,#20 CLR F0 CLR BUZZER MOV SEG,#00H V4: MOV P2,MIN MOV P1,SEG JNB F0,V4 ; V1: MOV P2,MIN MOV P1,SEG LCALL ATRASO MOV A,SEG ADD A,#99H DA A MOV SEG,A CJNE A,#99H,V1 MOV SEG,#59H MOV A,MIN MOV MIN,A MOV MIN,#00H MOV SEG,#00H MOV P2,MIN MOV P1,SEG SETB BUZZER MOV R7,#3 V2: LCALL ATRASO DJNZ R7,V2 CLR BUZZER CLR F0 SJMP INICIO ATRASO: SETB TR0 V3: MOV TH0,#3CH MOV TL0,#0AFH JNB TF0,$ CLR TF0 DJNZ R0,V3 MOV R0,#20 CLR TR0 RET END Cristal de 12 MHz 1 s

104 MM SS

105 Acionamento temporizado de Motor de Corrente Contínua:
Motor gira no sentido horário por 10 s e para por 5 s Motor gira no sentido anti-horário por 10 s e para. IN1 EQU P2.3 IN2 EQU P2.2 LIGA EQU P3.2 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#01H MOV R0,#20 V0: JB LIGA,$ SETB IN1 CLR IN2 MOV R7,#10 V1: LCALL ATRASO DJNZ R7,V1 CLR IN1 CLR IN2 MOV R7,#5 V2: LCALL ATRASO DJNZ R7,V2 SETB IN2 MOV R7,#10 V4: LCALL ATRASO DJNZ R7,V4 SJMP V0 ATRASO: SETB TR0 V3: MOV TH0,#3CH MOV TL0,#0AFH JNB TF0,$ CLR TF0 DJNZ R0,V3 MOV R0,#20 CLR TR0 RET END Cristal de 12 MHz

106 Cristal de 11.0592 MHz Acionamento temporizado de Motor de Passo:
Motor gira no sentido horário por 10 s e para por 5 s Motor gira no sentido anti-horário por 10 s e para. REVERSO:MOV P1,A LCALL ATRASO RR A CJNE A,#80H,VF1 MOV A,#08H VF1: JNB F0,REVERSO SJMP LIGA ;== Atraso para o motor de passo ATRASO: MOV R6,#150 V1: MOV R5,#250 DJNZ R5,$ DJNZ R6,V1 RET ; TEMPO_R7s: DJNZ R0,SAI MOV R0,#20 DJNZ R7,SAI SETB F0 SAI: MOV TH0,#4Bh MOV TL0,#0FFH RETI END ORG 00H LJMP INICIO ORG 0BH LJMP TEMPO_R7s ;===== Configurações ===== ORG 30H INICIO: MOV SP,#2FH MOV IE,#82H MOV TMOD,#01H MOV TH0,#4BH MOV TL0,#0FFH MOV R0,#20 LIGA: JB P3.2,$ CLR TR0 CLR F0 MOV R7,#10 SETB TR0 MOV A,#01H DIRETO: MOV P1,A LCALL ATRASO RL A CJNE A,#10H,VF0 MOV A,#01H VF0: JNB F0,DIRETO CLR TR0 CLR F0 MOV R7,#5 SETB TR0 JNB F0,$ MOV R7,#10 SETB TR0 MOV A,#08H Cristal de MHz

107 Temporizador no modo 2 – recarga automática (Temp_9_6A)
Modo 2 com interrupção – complementa TH Modo 2 com interrupção – complementa TH e P1.0 PWM fixo para acionamento de motor CC Incrementa TH e complementa P1.0 Aciona motor CC com velocidade variável Aciona motor CC com velocidade variável e mudança de sentido de rotação

108 síncrona e assíncrona. Comunicação Serial
A comunicação serial consiste em enviar ou receber pacotes de informação bit a bit. No caso do 8051 o canal de comunicação serial é do tipo ”full duplex”, o que significa que ele pode, ao mesmo tempo, receber e transmitir dados. Uma grande questão da transmissão serial é “como informar o receptor do início e do final do pacote de informação”, ou seja, qual o primeiro bit da informação e qual é o último. Assim, existem dois tipos de comunicação: síncrona e assíncrona.

109 Na comunicação serial síncrona, são utilizados dois canais:
um para transmitir/receber os dados e outro para transmitir/receber o sinal de sincronismo. No caso do 8051 a transmissão e também a recepção síncrona de dados são feitas através do pino RxD (pino P3.0). O pino TxD (pino P3.1) é usado para o sinal de sincronismo.

110 Na comunicação assíncrona não há a sinal de sincronismo e, portanto, alguns cuidados especiais devem ser tomados: As taxas de recepção e de transmissão devem ser iguais. Um bit de início e outro de fim de transmissão devem ser enviados, além dos dados. O bit de início de transmissão é zero, isto porque o canal normalmente fica em repouso no nível lógico alto. Assim, a primeira passagem para zero, após a habilitação da transmissão, é interpretada como o sinal de início. O sinal de parada é de nível lógico alto, após ser recebida a quantidade de bits previstos. Além do bit de início (Start bit) e do bit de fim (Stop bit), também pode existir um terceiro bit extra, que é o bit de paridade, usado para verificar a consistência dos dados.

111 Formato da Comunicação Serial Assíncrona

112 Registrador SCON – Configuração da Comunicação Serial

113 Serial – Modo 0 (síncrono – registrador de deslocamento)
Taxa de comunicação (baud rate): igual à frequência de clock dividida por 12. Recepção: Fica habilitada fazendo REN = 1 e RI = 0. Ao final da recepção o bit RI é setado por hardware, e deve ser ressetado por software (CLR RI) antes da recepção seguinte. O conteúdo recebido é transferido para o registrador SBUF. Transmissão: É iniciada automaticamente quando o conteúdo de um registrador é transferido para o registrador SBUF. Ao final da transmissão o bit TI é setado por hardware, e deve ser ressetado por software (CLR TI) antes da transmissão seguinte. Obs.: Há um registrador SBUF para transmissão e outro para recepção

114 Sinais de RxD e TxD durante uma transmissão síncrona
Rótulo Instruções MOV SCON,#00H MOV A,#00H V1: MOV SBUF,A JNB TI,$ CLR TI INC A SJMP V1 END Instrução que dá início à transmissão Aguarda a transmissão de todos os bits. Quando o processo acaba, o micro faz TI = 1. Sinais de RxD e TxD durante uma transmissão síncrona

115 Serial – Modo 1 (assíncrono de 8 bits)
Taxa de comunicação (baud rate): O pacote de comunicação inclui 8 bits de dados, 1 bit de start e um bit de stop. Recepção: Fica habilitada fazendo REN = 1 e RI = 0. Tem início quando há uma transição de nível alto para baixo no pino P3.0 (RxD) Ao final da recepção o bit RI é setado por hardware, e deve ser ressetado por software (CLR RI) antes da recepção seguinte. O conteúdo recebido é transferido para o registrador SBUF. Transmissão: É iniciada automaticamente quando o conteúdo de um registrador é transferido para o registrador SBUF. Ao final da transmissão o bit TI é setado por hardware, e deve ser ressetado por software (CLR TI) antes da transmissão seguinte. Bit 7 do registrador especial PCON Recarga do Temporizador 1 no modo 2

116 Sinal de TxD (P3.1) durante uma transmissão assíncrona no modo 1
Rótulo Instruções MOV SCON,#40H MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH SETB TR1 MOV A,#00H V1: MOV SBUF,A JNB TI,$ CLR TI INC A SJMP V1 END Configura serial modo 1 (assíncrono modo 1) Timer 1 no modo 2. Baud rate de 9600 bps, para cristal de 11,0592 MHz. Sinal de TxD (P3.1) durante uma transmissão assíncrona no modo 1 Instrução que dá início à transmissão Aguarda a transmissão de todos os bits. Quando o processo acaba, o micro faz TI = 1.

117 Transmissão Serial no Modo 1
ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV SCON,#40H MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH SETB TR1 MOV DPTR,#MSG1 V1: MOV R7,#00 V2: MOV A,R7 MOVC CJNE A,#0FFH,ENVIA SJMP V1 ENVIA: MOV SBUF,A JNB TI,$ CLR TI INC R7 SJMP V2 MSG1: DB 'HELLO WORLD!!!', 0DH, 0FFH MSG2: DB 'MICRO 2017 ', 0Dh, 0FFH end Transmissão Serial no Modo 1 Baud-rate de 9600 bps, no modo 1 Cristal oscilador: 11,0592 MHz Código ASCII para mudança de linha

118 As mensagens MSG e MSG1 são equivalentes
; Transmissão de mensagem via serial. Cristal: MHz. Taxa de transmissão: 4800 bps ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH ; Posição inicial da Pilha: 2FH MOV SCON,#40H ; Serial no modo 1: assíncrona de 8 bits MOV TMOD,#20H ; Timer 1 no modo 2 (recarga automática) MOV TH1,#0FAH ; Valor da recarga: FAH  baud rate: 4800 bps SETB TR1 ; Dispara Timer 1 MOV DPTR,#MSG ; DPTR assume o valor do endereço inicial da tabela MSG V2: MOV R7,#00H ; Offset para leitura da MSG assume valor inicial 00H V3: MOV A,R7 ; Acumulador recebe o valor atual do Offset MOVC ; Acumulador recebe o conteúdo da posição A+DPTR da MSG CJNE A,#0FFH,V1 ; Verifica se A = FFH (fim da MSG). Se não for, desvia para V1 SJMP V2 ; Retorna para V2 após cada fim de MSG V1: MOV SBUF,A ; Transfere de A para SBUF o valor ser transmitido via serial JNB TI,$ ; Aguarda final da transmissão do conteúdo de SBUF CLR TI ; Limpa a flag TI, de transmissão serial INC R7 ; Incrementa o valor do Offset SJMP V3 ; Retorna para V3, para ler o próximo caractere de MSG MSG: DB ' MICRO 2017 ', 0DH, 0FFH MSG1: DB 4DH, 49H, 43H, 52H, 4FH, 20H, 32H, 30H, 31H, 37H, 0DH, 0FFH END As mensagens MSG e MSG1 são equivalentes

119 Recepção Serial no Modo 1
LAMP EQU P2.7 ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV SCON,#40H MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH SETB TR1 CLR RI SETB REN MOV A,#01H V0: JNB RI,$ MOV R0,SBUF CJNE R0,#'D',V1 SJMP LED_DIREITA V1: CJNE R0,#'E',V3 SJMP LED_ESQUERDA V3: CJNE R0,#'L',V4 CPL LAMP SJMP V0 Recepção Serial no Modo 1 V4: CJNE R0,#'M',V0 MOTOR: CLR P2.3 CPL P2.2 SJMP V0 LED_DIREITA: V5: MOV P1,A RR A LCALL ATRASO JNB RI,V5 LED_ESQUERDA: MOV R3,#64 V6: MOV P1,A RL A DJNZ R3,V6 ATRASO: MOV R1,#100 V2: MOV R2,#200 DJNZ R2,$ DJNZ R1,V2 RET END Se R0 = 4DH (ASCII de M), aciona o motor CC (liga/desliga) Aguarda receber dados via serial e transfere os dados para R0 Se R0 = 43H (ASCII de D), rotaciona Leds para a direita. Enquanto RI = 0, continua rotacionando para a direita Se R0 = 44H (ASCII de E), rotaciona Leds para a esquerda. São 64 passos para a esquerda, que corresponde a 8 giros completos para a esquerda. Se R0 = 4CH (ASCII de L), aciona a lâmpada (apaga/liga)

120 Recepção Serial no Modo 1 Com interrupção
LAMP EQU P2.7 ORG 00H LJMP INICIO ORG 23H MOV R0,SBUF CLR RI RETI ORG 30H INICIO: MOV SP,#2FH MOV IE,#90H MOV SCON,#40H MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH SETB TR1 SETB REN MOV A,#01H V0: CJNE R0,#'D',V1 SJMP LED_DIREITA V1: CJNE R0,#'E',V3 SJMP LED_ESQUERDA V3: CJNE R0,#'L',V4 SETB LAMP SJMP V0 V4: CJNE R0,#'F',V5 CLR LAMP Recepção Serial no Modo 1 Com interrupção V5: CJNE R0,#'M',V6 MOTOR: CLR P2.3 SETB P2.2 SJMP V0 V6: CJNE R0,#'N',V0 CLR P2.3 CLR P2.2 LED_DIREITA: MOV P1,A RR A LCALL ATRASO LED_ESQUERDA: RL A ATRASO: MOV R1,#100 V2: MOV R2,#200 DJNZ R2,$ DJNZ R1,V2 RET END Se R0 = 4DH (ASCII de M), aciona o motor CC (liga/desliga) R0 recebe os dados recebidos via serial, através de interrupção Se R0 = 43H (ASCII de D), rotaciona Leds para a direita. Continua rotação, até R0 receber outro caractere. Se R0 = 44H (ASCII de E), rotaciona Leds para a esquerda. Enquanto R0 = 44H, continua rotacionando para a esquerda Se R0 = 4CH (ASCII de L), liga a lâmpada. Se R0 = 45H (ASCII de F), desliga a lâmpada.

121 Serial – Modo 2 (assíncrono de 9 bits)
Taxa de comunicação (baud rate): O pacote de comunicação inclui 8 bits de dados, 1 bit extra (RB8 ou TB8), 1 bit de start e um bit de stop. O bit extra pode ser a paridade. Recepção: Fica habilitada fazendo REN = 1 e RI = 0. Tem início quando há uma transição de nível alto para baixo no pino P3.0 (RxD) Ao final da recepção o bit RI é setado por hardware, e deve ser ressetado por software (CLR RI) antes da recepção seguinte. O nono bit chega através do bit RB8. Transmissão: É iniciada automaticamente quando o conteúdo de um registrador é transferido para o registrador SBUF. Ao final da transmissão o bit TI é setado por hardware, e deve ser ressetado por software (CLR TI) antes da transmissão seguinte. O nono bit é transmitido através de TB8. Bit 7 do registrador especial PCON

122 Serial – Modo 3 (assíncrono de 9 bits)
Taxa de comunicação (baud rate): O pacote de comunicação inclui 8 bits de dados, 1 bit extra, 1 bit de start e um bit de stop. Recepção: Fica habilitada fazendo REN = 1 e RI = 0. Tem início quando há uma transição de nível alto para baixo no pino P3.0 (RxD) Ao final da recepção o bit RI é setado por hardware, e deve ser ressetado por software (CLR RI) antes da recepção seguinte. O conteúdo recebido é transferido para o registrador SBUF. Transmissão: É iniciada automaticamente quando o conteúdo de um registrador é transferido para o registrador SBUF. Ao final da transmissão o bit TI é setado por hardware, e deve ser ressetado por software (CLR TI) antes da transmissão seguinte. Bit 7 do registrador especial PCON Recarga do Temporizador 1 no modo 2

123

124

125 Mensagens: Computador  Micro  LCD
RS EQU P3.5 RW EQU P3.6 EN EQU P3.7 DADOS EQU P0 ORG 00H LJMP INICIO ORG 23H CLR RI MOV A,SBUF MOV P1,A LCALL TEXTO_WR RETI ORG 30H INICIO: MOV SP,#2FH MOV SCON,#40H MOV IE,#90H MOV TMOD,#20H MOV TL1,#0FDH MOV TH1,#0FDH MOV R7,#0FFH SETB TR1 SETB REN LCALL INICIA SJMP $ Mensagens: Computador  Micro  LCD INICIA: MOV A,#38H LCALL INSTR_WR MOV A,#38H MOV A,#0EH MOV A,#06H MOV A,#01H RET INSTR_WR: SETB EN CLR RW CLR RS MOV DADOS,A CLR EN LCALL ATRASO_LCD TEXTO_WR:SETB EN CLR RW SETB RS MOV DADOS,A CLR EN LCALL ATRASO_LCD RET ATRASO_LCD: MOV R4,#10 V6: MOV R5,#80 DJNZ R5,$ DJNZ R4,V6 END Subrotina de inicialização do LCD Subrotina para escrever dados no LCD A recebe valor via serial e envia para P1 e para o LCD Subrotina para escrever instrução no LCD Serial_LCD_22_6.asm

126 Motor de Passo via serial
Rótulo Mnemônico V2: CJNE R0,#44H,V1 LJMP DIREITA V1: CJNE R0,#45H,V2 LJMP ESQUERDA DIREITA: MOV P1,A RR A LCALL ATRASO SJMP V2 ESQUERDA: RL A ATRASO: MOV R7,#200 V3: MOV R6,#250 DJNZ R6,$ DJNZ R7,V3 RET END Rótulo Mnemônico ORG 00H LJMP INICIO ORG 23H CLR RI MOV R0,SBUF RETI ORG 30H INICIO: MOV SP,#2FH MOV SCON,#40H MOV IE,#90H MOV TMOD,#20H MOV TL1,#0FDH MOV TH1,#0FDH MOV R0,#00H MOV A,#11H SETB TR1 SETB REN Serial_Passo_22_6.asm

127 CHAVE. EQU P3. 3. ; CHAVE (P3. 3) – MOTOR LIGA (P3
CHAVE EQU P3.3 ; CHAVE (P3.3) – MOTOR LIGA (P3.3 = 0) OU DESLIGA (P3.3 = 1) STATUS EQU 22H ; registrador que guarda o estado das chaves M EQU P2.2 ; IN0 do driver para acionamento do motor CC M EQU P2.3 ; IN1 do driver para acionamento do motor CC ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH ; Pilha no endereço inicial 2Fh MOV TMOD,#20H ; Temporizador 1 no modo 2 (recarga automática) para o gerar o baud rate MOV SCON,#40H ; SCON = – Serial no modo 1 MOV TH1,#0FAH ; Recarga para baud rate de 4800 bps MOV TL1,#0FAH ; Valor inicial de contagem, desde a primeira contagem SETB TR1 ; Dispara temporizador 1 MOV R7,#00H ; Contador (offset) para leitura das mensagens a serem enviadas via serial MOV STATUS,#00H ; Zera o registrador de STATUS para eliminar a possibilidade de “lixo” CLR M0 CLR M1 ; Motor CC parado V1: MOV A,P3 ; Leitura da porta P3 (onde está a chave que liga e desliga o motor) ANL A,# B ; Faz uma operação AND entre A e 08H, para isolar o pino P3.3 XRL A,STATUS ; Verifica se houve alteração no STATUS JZ V1 ; Se A XOR STATUS for zero, não houve mudança, então volta para V1 (A=0 e Z=1) ; Se houve mudança na posição da CHAVE, atualiza a situação e o STATUS JNB CHAVE,LIGA_M ; Se CHAVE = 0, liga o motor MOV DPTR,#M_OFF ; DPTR aponta para o início da mensagem de motor desligado LCALL SERIAL ; Chama subrotina para mostrar a mensagem de motor desligado CLR M1 ; Motor desligado SETB STATUS.3 ; Atualiza registrador de STATUS com valor 1 na posição STATUS.3 SJMP V1 Serial_estado_22_6.asm Transfere conteúdo de P3 para A, isola o pino P3.3 e verifica se houve mudança de estado

128 Continuação do programa Serial_estado_22_6.asm
LIGA_M: MOV DPTR,#M_ON ; DPTR aponta para o início da mensagem de motor ligado LCALL SERIAL ; Chama subrotina para mostrar a mensagem de motor ligado SETB M0 CLR M1 ; Motor ligado CLR STATUS.3 ; Atualiza registrador de STATUS com valor 0 na posição STATUS.3 SJMP V1 SERIAL: MOV A,R7 ; Transfere para A o valor do offset MOVC ; A recebe o conteúdo da tabela CJNE A,#0FFH,ENVIA ; Verifica se já chegou ao final da tabela MOV R7,#00H ; Se a tabela já acabou, faz R7 = 0 RET ; Retorna da subrotina SERIAL ENVIA: MOV SBUF,A ; Envia conteúdo da tabela/mensagem para o computador JNB TI,$ ; Aguarda terminar a transmissão CLR TI ; limpa flag de transmissão INC R7 ; incrementa R7 (offset para leitura da tabela / mensagem) SJMP SERIAL ; retorna para SERIAL M_ON: DB 'MOTOR DE CORRENTE CONTINUA LIGADO', 0DH, 0DH, 0FFH M_OFF: DB 'MOTOR DE CORRENTE CONTINUA DESLIGADO', 0DH, 0DH, 0FFH END

129 Rotação de Leds via serial
Rótulo Mnemônico V2: CJNE R0,#44H,V1 MOV B,#44H SJMP DIREITA V1: CJNE R0,#45H,V4 MOV B,#45H SJMP ESQUERDA V4: CJNE R0,#50H,V5 SJMP V2 V5: MOV R0,B DIREITA: MOV P1,A RR A LCALL ATRASO ESQUERDA: RL A END Rótulo Mnemônico ORG 00H LJMP INICIO ORG 23H CLR RI MOV R0,SBUF RETI ORG 30H INICIO: MOV SP,#2FH MOV SCON,#40H MOV IE,#90H MOV TMOD,#20H MOV TL1,#0FDH MOV TH1,#0FDH MOV R0,#00H MOV A,#01H SETB TR1 SETB REN Serial_Leds_28_6.asm 129

130 Acionamentos diversos com informação de status para o computador

131 STATUS indica o estado atual dos dispositivos.
CH_STEP EQU P2.0 CH_MCC EQU P2.1 CH_LAMP EQU P2.2 M EQU P0.0 M EQU P0.1 LAMP EQU P0.7 STATUS EQU 22H ORG 00H LJMP INICIO ORG 30H INICIO: MOV SP,#2FH MOV TMOD,#20H MOV SCON,#40H MOV TH1,#0FAH MOV TL1,#0FAH SETB TR1 MOV R7,#00H MOV P1,#00H MOV STATUS,#00H CLR M0 CLR M1 CLR LAMP V1: MOV A,P2 ANL A,# B XRL A,STATUS JZ V1 ;== Acionamento da Lâmpada =========== V5: JNB CH_LAMP,LIGA_Lamp MOV DPTR,#Lamp_OFF LCALL SERIAL CLR LAMP SETB STATUS.2 SJMP V2 LIGA_Lamp: MOV DPTR,#Lamp_ON LCALL SERIAL SETB LAMP CLR STATUS.2 ; ;== Acionamento do Motor CC ============ V2: JNB CH_MCC,LIGA_M MOV DPTR,#M_OFF LCALL SERIAL CLR M0 CLR M1 SETB STATUS.1 SJMP V3 LIGA_M: MOV DPTR,#M_ON LCALL SERIAL SETB M0 CLR STATUS.1 STATUS indica o estado atual dos dispositivos. STATUS.0 = 0  motor de passo ligado STATUS.1 = 0  motor CC ligado STATUS.2 = 0  lâmpada ligada Compara o estado atual das chaves (leitura de P2) com o conteúdo de STATUS (XRL A,STATUS). Enquanto eles forem iguais (Z=1), aguarda no loop. Quando houver mudança da posição de qualquer das chaves, sai desse loop e atualiza tudo. Envia a atualização via serial

132 ;== Acionamento do Motor de Passo =======
V3: JNB CH_STEP,LIGA_P MOV DPTR,#PASSO_OFF LCALL SERIAL MOV P1,#00H SETB STATUS.0 SJMP V1 LIGA_P:MOV DPTR,#PASSO_ON CLR STATUS.0 MOV R6,#11H V6: MOV P1,R6 LCALL ATRASO MOV A,P2 ANL A,# B XRL A,STATUS JNZ V5 MOV A,R6 RL A MOV R6,A SJMP V6 ;== Envia Mensagem via Serial ======= SERIAL: MOV A,R7 MOVC CJNE A,#0FFH,ENVIA MOV R7,#00H RET ENVIA: MOV SBUF,A JNB TI,$ CLR TI INC R7 SJMP SERIAL ATRASO: MOV R0,#100 V4: MOV R1,#150 DJNZ R1,$ DJNZ R0,V4 Lamp_ON: DB 'Lampada Ligada', 0DH, 0FFH Lamp_OFF: DB 'Lampada Desligada', 0DH, 0FFH M_ON: DB 'Motor de Corrente Continua Ligado', 0DH, 0FFH M_OFF: DB 'Motor de Corrente Continua Desligado', 0DH, 0FFH PASSO_ON: DB 'Motor de Passo Ligado', 0DH, 0DH, 0FFH PASSO_OFF: DB 'Motor de Passo Desligado', 0DH, 0DH, 0FFH END Para manter o motor de passo ligado, é necessário rotacionar os bits da porta P1. Assim, é necessário manter-se nesse loop de V6, verificando se há mudança em alguma chave.

133 Bibliografia [1] Salvador P. Gimenez, “Microcontroladores 8051: Teoria do hardware e do software/Aplicações em controle digital/Laboratório e simulação”, Pearson Education do Brasil, São Paulo, 2002. ISBN: [2] Vidal Pereira da Silva Jr., “Aplicações Práticas do Microcontrolador 8051”, Editora Érica, São Paulo, 1994. ISBN: [3] Sencer Yeralan, Ashutosh Ahluwalia, “Programming and Interfacing the 8051 Microcontroller”, Addison-Wesley Publishing Company, 1995. ISBN:


Carregar ppt "MICROPROCESSADORES E MICROCONTROLADORES"

Apresentações semelhantes


Anúncios Google