Baixe o app para aproveitar ainda mais
Prévia do material em texto
Códigos em Assembly 8051 Nome: Rodrigo Damasceno Nascimento Exercício1) Dado um conjunto de 100 dados tipo byte armazenados de forma consecutiva na memória de programas a partir do endereço 1000H, mover ditos dados à memória de dados, armazenando eles a partir do endereço 10H de forma ascendente e respeitando o seu ordenamento. ORG 00h ;INICIA NO ENDEREÇO 00H MOV DPTR,#1000H ;COLOCA O ENDEREÇO DE INICIO DOS DADOS NA MEMÓRIA DE PROGRAMA NO ;REGISTRADOR DPTR MOV R0,#10H ;COLOCA O ENDEREÇO DE INICIO NA MEMÓRIA DE DADOS MOV R3,#0 ;INICIALIZA UM CONTADOR PARA CONTAR OS 100 DADOS LAÇO: MOV A,R3 ;MOVE O VALOR DE R3 PARA O ACUMULADOR MOVC A,@A+DPTR ;COLOCA EM A O DADO CORRENSPONDETE DA TABELA EM MEMÓRIA DE PROGRAMA MOV @R0,A ;COLOCA O DADO ANTERIOR NA LOCALIZAÇÃO DA MEMÓRIA DE DADOS INC R0 ;APONTA A SEGUINTE LOCALIZAÇÃO DA MEMÓRIA DE DADOS INC R3 ;CONTA O NÚMERO DE DADOS JÁ COLOCADOS NA MEMÓRIA DE DADOS CJNE R3,#100D,LAÇO ;SE O VALOR DO R3 FOR 100 ELE TERMINA, SENÃO CONTINUA O LAÇO END Exercício 2) Fazer um segmento de programa que a partir de um número em hexadecimal entre 0 e 99, armazenado na localização de memória de dados cujo endereço é 10H, obtenha o número equivalente em BCD (Código Binário Decimal) empacotado, armazenando ele na localização de memória de dados correspondente ao endereço 11H ORG 00H ;INICIA O ENDEREÇO EM 00H MOV A,10H ;ARMAZENAR O VALOR CONTIDO EM 10H EM A MOV B,#10D ;ARMAZENAR O VALOR 10D EM B DIV AB ;DIVIDI O VALOR DE A POR B, EM A FICA O BCD DAS DEZENAS E EM B FICA O BCD DAS UNIDADES MOV 11H,B ;ARMAZENA O CÓDIGO BCD DAS UNIDADES NO ENDEREÇO 11H MOV B,#16D ;ARMAZENA O VALOR 16D NO REGISTRADOR B MUL AB ;MULTIPLICA E O CONTEUDO DO ACUMULADOR É DESLOCADO EM 4 POSIÇÕES A ESQUERDA ADD A,11H ;SOMA OS CONTEÚDOS MOV 11H,A ;VOLTA O VALOR PARA O ACUMULADOR END ;FIM DO PROGRAMA Exercício 3) Fornecidos dois números de 8 bits, armazenados nas localizações de memória de dados 10H e 11H, fazer um fragmento de programa que armazene na localização 12H de dita memória o valor 00H se ambos números são iguais, o 01H se o número armazenado em 10H é maior que o armazenado na 11H e o 02H no casso contrário. MOV A,10H ;CARREGA O CONTEUDO EM 10H NO ACUMULADOR CJNE A,11H,CASO1 ;SE O VALOR DO ACUMULADOR FOR 11H ELE VAI PARA A PROXIMA INSTRUÇÃO, SENÃO FOR ELE IRA PRO CASO 1 MOV 12H,#00h ;ADICIONA NO ENDEREÇO 12H O VALOR 00H(IGUAL) SJMP SAIR ;SAIR DO PROGRAMA CASO1: JC MENOR ;SE 10H FOR MENOR ELE DESVIA PARA A FUNÇÃO MENOR MOV 12H,#01H ;ADICIONA O VALOR 01H NO ENDEREÇO 12H (MAIOR) SJMP SAIR ;SAIR DO PROGRAMA MENOR: MOV 12H,#02H ;ADICIONA O VALOR 02H NO ENDEREÇO 12H (MENOR) SAIR: NOP Exercício 4) Desenhar um fragmento de programa que provoca uma demora de 120 microssegundos. É conhecido que a instrução ´djnz´ tem um tempo de execução de 2 microssegundos. DEMORA120: MOV R0,#60 ;QUANTIDADE DE VEZES A EXECUTAR A INSTRUÇÃO LAÇO: DJNZ R0,LAÇO ;DECREMENTA GASTANDO UM TOTAL DE 2 MICROSSEGUNDOS POR CICLO DE MÁQUINA RET Exercício 5) Dada uma tabela conformada por 16 números inteiros sem sinal de 8 bits armazenados na memória de dados a partir da localização 00H, conformar duas tabelas, uma contendo os números pares de dita tabela e a outra os números impares. A primeira armazenada a partir da localização 20H da memória de dados de forma que os endereços se incrementem e a segunda a partir da localização 40H de forma que os endereços se decrementem. ORG 00H MOV R2,#20h ;INCIO DO ARMAZENAMENTO DOS PARES MOV R3,#40h ;INICIO DO ARMAZENAMENTO DOS IMPARES MOV R1,#00h ;LOCALIZAÇÃO DO ARMAZENAMENTONA MEMÓRIA DE DADOS MOV R4,#16D ;CONTADOR LAÇO: MOV A,@R1 ;MOVIMENTA O VALOR DO ENDEREÇO DE R1 EM A MOV B,#02d ;MOVE O VALO 02 DECIMAL DIV AB ;DIVIDE O ACUMULADOR PELO REGISTRADOR B MOV A,B ;ARMAZENA O VALOR DE B EM A JNZ IMPAR ;DESVIA PARA O ENDEREÇO SE O VALOR DO ACC FOR DIFERENTE DE ZERO PAR: MOV A,R2 ;MOVIMENTA O VALOR DE R2 EM A MOV R0,A ;MOVIMENTA O VALOR DE A EM R0 MOV A,@R1 ;MOVIMENTA O VALOR DO ENDEREÇO DE R1 PARA A MOV @R0,A ;MOVIMENTA O VALOR DO ACUMULADOR PARA O ENDEREÇO R0 INC R2 ;INCREMENTA O VALOR DE R2 SJMP SAIR ;DESVIA PARA A FUNÇÃO SAIR IMPAR: MOV A,R3 ;MOVIMENTO O VALOR DE R3 EM A MOV R0,A ;MOVIMENTA O VALOR DO A PARA R0 MOV A,@R1 ;MOVIMENTA O VALOR DO ENDEREÇO DE R1 PARA A MOV @R0,A ;MOVIMENTA O VALOR DO A PARA O ENDEREÇO R0 DEC R3 ;DECREMENTA O VALOR DE R3 SJMP SAIR ;DESVIA PARA A FUNÇÃO SAIR SAIR: DJNZ R4,LAÇO ;DECREMENTA R4 E SE FOR DIFERENTE DE ZERO ELE RETORNA PRO LAÇO NOP Exercício 6) Desenhar um algoritmo e seu diagrama de blocos, assim como o fragmento de programa em forma de sub-rotina que cada vez que seja chamada provoque uma demora de 51.2 milissegundos, antes de regressar ao programa principal. DEMORA51_2MS: MOV R4,#102 ;QUANTIDADE DE VEZES PARA EXECUTAR A INSTRUÇAO MOV R3,#250 ;QUANTIDADE DE VEZES PARA EXECUTAR A INSTRUÇÃO LAÇO: DJNZ R3,LAÇO ;DECREMENTA R3 UTILIZANDO 2 CICLOS DE MAQUINA DJNZ R4,LAÇO ;DECREMENTA R4 UTILIZANDO 2 CICLOS DE MAQUINA Exercício 7) Desenhar um algoritmo e seu diagrama de blocos, assim como o fragmento de programa em forma de sub-rotina para. Preencher a zona de memória de dados compreendida entre as localizações 20H e 2fH com o número 00H. MOV R0,#20H ;INICIO DO ARMAZENAMENTO DE DADOS EM 20H LAÇO: MOV A,#00H ;MOVE O VALOR 00H PARA O ACUMULADOR MOV @R0,A ;MOVE O VALOR DO ACUMULADOR PARA O ENDEREÇO 20H INC R0 ;INCREMENTA R0 CJNE R0,#30H,LAÇO ;SE R0 FOR IGUAL A 30H ELE TERMINA, SENÃO FOR CONTINUA END Exercício 8) Você forma parte da equipe de trabalho que está programando o firmware de um sistema de captura de dados por GPS utilizando o microcontrolador 8051. Foi assignada a tarefa de escrever um segmento de código que se encarregue de fazer uma nova cópia dos últimos 20 dados de posição que se tem registrado. Esses dados se encontram localizados a partir do endereço 30h da memória de dados interna (IDATA) e cada um ocupa 1 byte de espaço. A nova copia destes dados deve criar- se a partir do endereço 50h. Desenhar um algoritmo e seu diagrama de blocos, assim como o fragmento de programa para resolver a tarefa anterior. MOV R0,#30H ;MOVE O VALOR 30H PARA R0 MOV R1,#50H ;MOVE O VALOR 50H PARA R1 MOV R2,#20D ;MOVE O VALOR 20D PARA R2 LAÇO: MOV A,@R0 ;MOVIMENTA O VALOR DO ENDEREÇO PARA O ACUMULADOR MOV @R1,A ;MOVIMENTA O VALOR DO ACUMULADOR PARA O ENDEREÇO R1 INC R0 ;INCREMENTA R0 INC R1 ;INCREMENTA R1 DJNZ R2,LAÇO ;DECREMENTA O REGISTRADOR R2 E DESVIA PARA O LAÇO SE FOR DIFERENTE DE 0NOP Exercício 9) Projete o hardware e elabore um programa que apague e acenda um LED cada 2 segundos a partir de que se feche um interruptor. O funcionamento deve- se manter até que se abra o interruptor. ORG 0H ;Origem do programa no endereço 0h JMP INICIO ;Pula para a função INICIO ORG 30H ;Começar no endereço 30h para não da problema DEMORA: MOV R2,#50 ;Move o valor 50 para o registrador 2 CICLO2: MOV R3,#100 ;Move o valor 100 para o registrador 3 CICLO1: MOV R4,#200 ;Move o valor 200 para o registrador 4 CICLO: DJNZ R4,CICLO ;Decrementa o R4 e volta para a função CICLO DJNZ R3,CICLO1 ;Decrementa o R3 e volta para o CICLO1 DJNZ R2,CICLO2 ;Decrementa o R2 e volta para o CICLO 2 RET ORG 100H INICIO: JB P1.0,$ ;Ele segura a P1.0 enquanto o bit não estiver setado CLR P2 ;Escreve no PORT2 o 0 CALL DEMORA ;Ele chama a sub-rotina DEMORA, depois que for relaizada ele pula a instrução SETB P2 ;Escreve no PORT2 o 1 CALL DEMORA ;Ele chama a sub-rotina DEMORA, depois que for relaizada ele pula a instrução JMP INICIO ;Retorna para o inicio END ;Fim do programa Exercício 10) Projete o hardware e elabore um programa que mostre numa lâmpada de 7 segmentos o código hexadecimal correspondente ao número binário que se gera com o abre e fecha de 4 interruptores. ORG 00H ;ORIGEM DE ENDEREÇAMENTO EM 00H AJMP INICIO ;PULAR PARA O INICIO ; TABELA PARA ARMAZENA A CONVERSAO PARA O 7 SEGMENTOS DE ANODO COMUM TABELA: DB 01000000b ; ZERO DB 01111001b ; UM DB 00100100b ; DOIS DB 00110000b ; TRÊS DB 00011001b ; QUATRO DB 00010010b ; CINCO DB 00000010b ; SEIS DB 01111000b ; SETE DB 00000000b ; OITO DB 00011000b ; NOVE DB 00001000b ; A DB 00000011b ; B DB 01000110b ; C DB 00100001b ; D DB 00000110b ; E DB 00001110b ; F INICIO: MOV DPTR,#TABELA ; MOVIMENTA A TABELA COMO UM VETOR DE 16 BITS PARA A DPTR LOOP: MOV P1,#0FFH ; ATUALIZA P1 PARA LEITURA MOV A,P1 ; MOVIMENTA P1 PARA A CPL A ; INVERTE OS VALORES DE A ANL A,#00001111b ; Grava no acumulador o resultado da operação lógica AND entre o acumulador e conteúdo do endereço 0FH MOVC A,@A+DPTR ; MOVIMENTA O VALOR COMPARADO COM VALOR DE A COM A TABELA MOV P2,A ; MOVIMENTA A PARA P2 JMP LOOP ; VOLTA PARA O LOOP END Exercício 11) Faça um programa que apague o led em P1.0 quando a chave P1.4 for acionada, P1.1 quando a chave P1.5 for acionada, P1.2 quando a chave P1.6 for acionada e P1.3 quando a chave P1.7 for acionada. ;OBS: NESSE EXEMPLO AS LÂMPADAS UTILIZADAS SÃO DE CÁTODO COMUM ORG 00H ;INICIA NO ENDEREÇO 00H LOOP: JNB P1.4,LED1 ;SE O PINO 1.4 ESTIVER COM O VALOR 1 ELE IRA PARA FUNÇÃO LED1 SETB P1.0 ;GRAVA 1 NO PINO 1.0 AJMP LOOP1 ;DESVIO CURTO PARA O LOOP1 LED1: CLR P1.0 ;GRAVA 0 NO PINO 1.0 LOOP1: JNB P1.5,LED2 ;SE O PINO 1.5 ESTIVER COM O VALOR 1 ELE IRA PARA A FUNÇÃO LED 2 SETB P1.1 ;GRAVA 1 NO PINO 1.1 AJMP LOOP2 ;DESVIO CURTO PARA O LOOP2 LED2: CLR P1.1 ;GRAVA 0 NO PINO 1.1 LOOP2: JNB P1.6,LED3 ;SE O PINO 1.6 ESTIVER COM O VALOR 1 ELE IRA PARA A FUNÇÃO LED 3 SETB P1.2 ;GRAVA 1 NO PINO 1.2 AJMP LOOP3 ;DESVIO CURTO PARA O LOOP3 LED3: CLR P1.2 ;GRAVA 0 NO PINO 1.2 LOOP3: JNB P1.7,LED4 ;SE O PINO 1.7 ESTIVER COM O VALOR 1 ELE IRA PARA A FUNÇÃO LED4 SETB P1.3 ;GRAVA 1 NO PINO 1.3 LJMP LOOP ;DESVIO LONGO PARA O LOOP LED4: CLR P1.3 ;GRAVA 0 NO PINO 1.3 END ;FIM DO PROGRAMA Exercício 12) Faça o programa que mostre nos leds dos quatro bits mais significativos um número binário de 0 até 15, onde inicia-se em zero e seja incrementado em uma a cada ativação de chave em P1.7. ORG 00H LJMP INICIO ORG 30H INICIO: MOV P1,#0F0H ;ADICIONA O VALOR ALTO EM P1 MOV R0,#00H ;ADICIONA O VALOR 00H PARA R0 LOOP: JNB P1.7,$ ;ENQUANTO ESTIVER FM NIVEL LOGICO 0 O MESMO FICA TRAVADO NA FUNÇÃO JB P1.7,$ ;ENQUANTO ESTIVER EM NIVEL LOGICO 1 O MESMO FICA TRAVADO NA FUNÇÃO INC R0 ;INCREMENTA R0 CJNE R0,#00H,CONTINUA_CONT ;COMPARA O CONTEUDO DO R0 COM 00H, E DESVIA PARA O ENDEREÇO CONTINUA_CONTAGEM SE FOR DIFERENTE MOV R0,#00H ;RETORNA PARA O INICIO CONTINUA_CONT: MOV P1,R0 ;MOVE O VALOR DE R0 PARA O PORT1 LJMP LOOP ;DESVIO PARA O INICIO END Exercício 13) Vamos comparar o valor do acumulador com o valor 45h. Se o valor do acumulador for superior deve ligar o pino P1.0, se for inferior deve ligar o pino P1.1. Se forem iguais deve ligar o pino P1.2. mov A,#45H ;MOVE O VALOR 5H PARA O ACUMULADOR cjne A,#45H,caso1 ;COMPARA O VALOR DO ACUMULADOR COM 45H, SE FOR DIFERENTE ELE PULA mov P1,#11111011B ;MOVE O VALOR EM BINARIO PARA PORT1 sjmp sair ;VAI PARA FUNÇÃO SAIR caso1: jc menor ;SE A FOR MENOR QUE #45 ELE DESVIA PARA A FUNÇÃO MENOS mov P1,#11111110B ;MOVE O VALOR EM BINARIO PARA O PORT 1 sjmp sair ;VAI PARA A FUNÇÃO SAIR menor: mov P1, #11111101B ;MOVE O VALOR EM BINARIO PARA O PORT1 sair: END Exercício 14) Refaça o exercício 12 utilizando uma lâmpada de 7 segmentos. ORG 00H LJMP INICIO ORG 30H ; TABELA PARA ARMAZENA A CONVERSAO PARA O 7 SEGMENTOS DE ANODO COMUM TABELA: DB 01000000b ; ZERO DB 01111001b ; UM DB 00100100b ; DOIS DB 00110000b ; TRÊS DB 00011001b ; QUATRO DB 00010010b ; CINCO DB 00000010b ; SEIS DB 01111000b ; SETE DB 00000000b ; OITO DB 00011000b ; NOVE DB 00001000b ; A DB 00000011b ; B DB 01000110b ; C DB 00100001b ; D DB 00000110b ; E DB 00001110b ; F INICIO: MOV DPTR, #TABELA ;ADICIONA O VALOR ALTO EM P1 MOV R0,#00H ;ADICIONA O VALOR 00H PARA R0 LOOP: MOV P1,#0FFH ;HABILITA A PORTA PARA LEITUR JNB P1.7,$ ;ENQUANTO ESTIVER FM NIVEL LOGICO 0 O MESMO FICA TRAVADO NA FUNÇÃO JB P1.7,$ ;ENQUANTO ESTIVER EM NIVEL LOGICO 1 O MESMO FICATRAVADO NA FUNÇÃO INC R0 ;INCREMENTA R0 CJNE R0,#00H,CONTINUA_CONT ;COMPARA O CONTEUDO DO R0 COM 00H, E DESVIA PARA O ENDEREÇO CONTINUA_CONTAGEM SE FOR DIFERENTE MOV R0,#00H ;RETORNA PARA O INICIO CONTINUA_CONT: MOV A,R0 ;MOVE O VALOR DE R0 PARA O ACC ANL A,#00001111b ;GRAVA NO ACUMULADOR O RESULTADO DA OPERAÇÃO AND ENTRE O ACC E 0FH MOVC A,@A+DPTR ;MOVIMENTA O VALOR COMPARADO COM O VALOR DA TABELA MOV P2,A ;MOVIMENTA O VALOR DO ACUMULADOR EM P2 LJMP LOOP ;DESVIO PARA O INICIO END Exercício 15) Projete o hardware e elabore um programa mude o estado do display de 7 segmentos cada 1 segundos, em ordem crescente, de 0 a F. ORG 00H ;ORIGEM DE ENDEREÇAMENTO EM 00H JMP INICIO ;PULAR PARA O INICIO ; TABELA PARA ARMAZENA A CONVERSAO PARA O 7 SEGMENTOS DE ANODO COMUM TABELA: DB 01000000b ; ZERO DB 01111001b ; UM DB 00100100b ; DOIS DB 00110000b ; TRÊS DB 00011001b ; QUATRO DB 00010010b ; CINCO DB 00000010b ; SEIS DB 01111000b ; SETE DB 00000000b ; OITO DB 00011000b ; NOVE DB 00001000b ; A DB 00000011b ; B DB 01000110b ; C DB 00100001b ; D DB 00000110b ; E DB 00001110b ; F ORG 40H ;Começar no endereço 40h para não da problema DEMORA: MOV R2,#50 ;Move o valor 50 para o registrador 2 CICLO2: MOV R3,#50 ;Move o valor 50 para o registrador 3 CICLO1: MOV R4,#200 ;Move o valor 100 para o registrador 4 CICLO: DJNZ R4,CICLO ;Decrementa o R4 e volta para a função CICLO DJNZ R3,CICLO1 ;Decrementa o R3 e volta para o CICLO1 DJNZ R2,CICLO2 ;Decrementa o R2 e volta para o CICLO 2 RET ORG 100H ;COMEÇA NO ENDEREÇO 100H PARA NÃO DAR PROBLEMA INICIO: MOV DPTR,#TABELA ;MOVIMENTA A TABELA COMO UM VETOR DE 16 BITS PARA A DPTR MOV R0,#00H LOOP: MOV A,R0 ;MOVIMENTA R0 PARA A ANL A,#00001111b ; Grava no acumulador o resultado da operação lógica AND entre o acumulador e conteúdo do endereço 0FH MOVC A,@A+DPTR ; MOVIMENTA O VALOR COMPARADO COM VALOR DE A COM A TABELA MOV P2,A ; MOVIMENTA A PARA P2 CALL DEMORA ;ELE CHAMA A SUBROTINA INC R0 ; INCREMENTA O VALOR DE R0 JMP LOOP ; VOLTA PARA O LOOP END Exercício 16) Um programa que leia a porta P1. Se o valor lido for par, incrementa R2; em caso contrário, incrementa R1. Os dados pares são colocados na porta P2 e os dados ímpares na porta P3; todos os dados são armazenados sequencialmente a partir da posição de memória 20H ORG 2000H MOV R0,#20H ;INICIO DO ARMAZENAMENTO MOV R1,#0H ;CONTADOR DOS IMPARES MOV R2,#0H ;CONTADOR DOS PARES INICIO: MOV A,P1 ;MOVE O VALOR DO PORT1 PARA O ACUMULADOR MOV @R0,A ;GRAVA DADO ANL A,#01H ;VER SE PAR OU IMPAR JNZ IMPAR ;DESVIA PARA O IMPAR SE O ACUMULADOR FOR DIFERENTE DE ZERO PAR: INC R2 ;INCREMENTA R2 MOV A,@R0 ;MOVE O VALOR DO ENDEREÇO PARA O ACUMULADOR MOV P2,A ;MOVE O VALOR DO ACUMULADOR PARA P2 INC R0 ;INCREMENTA R0 JMP INICIO ;RETORNA PARA O INICIO IMPAR: INC R1 ;INCREMENTA R1 MOV A,@R0 ;MOVE O VALOR DO ENDEREÇO PARA O ACUMULADOR INC R0 ;INCREMENTA R0 MOV P3,A ; MOSTRA DADO JMP INICIO ;RETORNA PARA O INICIO END
Compartilhar