Upload
leticia-queiroz
View
20
Download
1
Embed Size (px)
Citation preview
Instrumentação Biomédica MicroprocessadaEstudo Dirigido - Laboratório
Exemplos de Programas em C para o 8051
Programa Exemplo No 1 - Ilustra programa para a escrita de dados na porta serial
/* HELLO.C */
/* declaracao de bibliotecas utilizadas pelo programa */ #include <reg51.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */#include <stdio.h> /* biblioteca de funcao de entrada e saida de dados */
/****************//* main program *//****************/
void main (void) { SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 0xf3; /* TH1: reload value for 2400 baud */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */
printf ("Hello World\n"); /* the 'printf' function call */
while (1) { }; /* loop infinito */}
1
Programa Exemplo No 2 - Ilustra a utilização de ponteiros
/* HELLO2.C */
#include <reg51.h> #include <stdio.h>
/****************//* main program *//****************/
void main (void) { short m;char *y,tabela[]="Hello"; /*char tabela[]={'a','b','c',’d’,’e’}; outra possibilidade de inicializacao da tabela */
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 0xf3; /* TH1: reload value for 2400 baud */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ y = tabela; /* inicializacao do ponteiro */
printf ("Hello World\n"); /* the 'printf' function call */ for (m=0;m< 5;m++) printf("%c\n",*y++);
while (1);
}
2
Programa Exemplo No 3 - Programa para acender leds conectados à porta 1 e rotacioná-los para direita ou esquerda conforme nivel de tensão no bit P3.5.
/* LED.C */
/* declaracao de bibliotecas utilizadas pelo programa */
#include <reg51.h> /* special function register declarations */ /* for the intended 8051 derivative */
/* declaracao de funcoes */
void delay (void);
/* variáveis globais */
sbit ch1 = P3 ^ 5;unsigned char contador;unsigned char saida;
/****************//* main program *//****************/void main (void) { TMOD = 0x10; TCON = 0; P1 = 0; saida = 1;
while (1) { P1 = saida; delay(); if(ch1 == 1) { saida=saida<<1; if (saida==0) saida=1; }
else
{ saida = saida >> 1; if (saida == 0) saida = 128; } } /* end of while */
} /* fim do programa principal */
void delay (void) {
for (contador=0; contador < 3; contador++) {
3
TH1 = 0xFF; TL1 = 0XFE; TR1 = 1;
while (!TF1) {}
TF1=0; } /* end of for*/ TR1 = 0; } /* end of delay */
4
Programa Exemplo No 4 - Ilustra o modo de tratar interrupções na linguagem C, empregando transmissão e recepção de dados. Conta o número de zeros recebidos em ASCII (0x30) e os valores não zeros recebidos. Obs: para visualizar os dados de saída, acione VIEW, HARDWARE e UART. Selecione apenas TRM e ASCII. Digite dados no buffer de entrada e coloque o dado ‘x’ que encerra a transmissão */
/*
INTER.C */
/* declaracao de bibliotecas utilizadas pelo programa */ #include <reg51.h> /* special function register declarations */ /* for the intended 8051 derivative */
#include <stdio.h>
/* variáveis globais */
unsigned char rb; /* ilustra declaração de variáveis e sua inicialização */unsigned char tm = 0x31; /* incializa tm com o ASCII = 1 */
/****************//* main program *//****************/
void main (void) { /* execution starts here after stack init */ SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 0xf3; /* TH1: reload value for 2400 baud */ TR1 = 1; /* TR1: timer 1 run */
/* habilita interrupcao serial */
EA = 1; ES = 1;
TI = 1; /* TI: set TI to send first char of UART */
SBUF = tm;
while (SBUF != 'x'); /* enquanto não le detecta um ‘x’ na porta serial, executa... *//* lembrar que buffer de saida e de entrada são diferentes embora tenham mesmo endereco */
ES = 0; /* inibe interrupção pela porta serial */
while (1); /* necessário para evitar travamento do AVSIM */
5
}/*end of main*/
void serial(void) interrupt 4 using 3 { /* especifica interrupção serial (no 4) e banco de registradores (3) */ int count1 = 0; int count0 = 0;
if (RI) { /* testa se dado recebido - buffer de recepção cheio */ rb = SBUF; RI = 0; switch (rb) { /* se valor zero, conta */ case 0x30: count0++; break;
default: count1++; } }
if (TI) { /* testa se buffer de transmissão pronto para receber novo dado*/
TI=0; tm++; SBUF = tm;
}
}/* end of serial*/
6
Programa Exemplo No 5 - Ilustra o emprego de funções e operadores matemáticos do compilador para calcular a função coseno de a 2 em passos de 0.1 rad.
/*
COS.C */
/* declaração de bibliotecas utilizadas pelo programa */
#include <reg51.h> /* special function register declarations */ /* for the intended 8051 derivative */
#include <stdio.h> /* prototype declarations for I/O functions */#include <math.h>
/* declaracao de funcoes */
void tcos(float);
/****************//* main program *//****************/void main (void) { /* execution starts here after stack init */float x=-0.1;
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 0xf3; /* TH1: reload value for 2400 baud */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */
while (1) { /* calcula o passo de forma periodica */
if (x< 2 * 3.1414) x+=0.1; else x=0.0;
tcos(x); } }/*end of main*/
void tcos(float u) /* escreve na porta serial o resultado do calculo */{float v;
v = cos(u);
printf("cos(%f) = %f\n",u,v);}
Programa Exemplo No 6 - Rotinas para a escrita de mensagem no display do kit do 8051. Para gerar arquivo com a extensão HEX ir no menu de opções, selecionar
7
/* bibliotecas do C */
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <reg51.h>#include <absacc.h>
/* declaração de funções */
void NWRITE (char *,short); /* função que envia caracteres para display */void INITDP (void); /* função que inicializa o display */
/* definição de labels utilizados nos programas */
#define RSTD 0x38 /* associa RSTD ao byte de reset do display */#define EIND 0xFF00 /* endereço utilizado na inicialização do display */#define EESD 0xFF40 /* endereço utilizado na escrita de dados no display */
void main (void){char cadeia[]="testando$"; /* array contendo mensagem */INITDP(); /* chama rotina de inicializacao dos display */NWRITE (cadeia,EESD); /* envia caracteres a serem mostrados ou comandos para o display */while(1); /* necessario para congelar o 8051 */}
/*funcao para inicializar o display*/void INITDP(void){char init[]={0x06,0x0c,0x01,'$'}; /* vetor com caracteres de inicializacao do display */short x;
XBYTE[EIND]=RSTD; /* escreve byte de reset */for (x=0; x<512; x++); /* introduz atraso */XBYTE[EIND]=RSTD; /* escreve byte de reset */for (x=0; x<512; x++); /* introduz atraso */XBYTE[EIND]=RSTD; /* escreve byte de reset */for (x=0; x<512; x++); /* introduz atraso */
NWRITE(init,EIND); /* envia demais bytes de inicializacao */}
/*funcao para escrever conjunto de caracteres ou comandos no display */
/* como parametros são passados ponteiro para a string de caracterese para ONDE enviar os dados; incialização e dados sao escritos em locais diferentes */
void NWRITE(char *dados, short ONDE){
8
char i=0;short x;
while (*(dados+i) != '$') {for(x=0;x<180;x++); /* introduz atraso para garantir escrita */ XBYTE[ONDE] = *(dados+i); /* escreve dado no display */
i++; /* desloca byte apontado pelo ponteiro */ }}
9
Programa Exemplo No 7 - Moldura para Interface de C e Assembly para o 8051. Crie os 2 programas abaixo em arquivos separados. Compile o programa SND.C (Translate). Um arquivo denominado SND.ASM é criado. Abra um projeto e adicione (Add File) os arquivos SND.ASM e PPAL.C. Utilize Build All para gerar o programa executável.
a) Programa principal em C (programa ppal.c)
/*includes (acrescentar as bibliotecas necessárias) */
/* prototipo de funcao externa */
extern void nome_da_funcao(void);
void main(void){
(código da funcao em C)}b) Função secundária em Assembly (programa snd.c)
/* includes */
#pragma src(nome_do_programa(snd).asm) /* #include reg51.h util para compilador de linha */
/* prototipo de funcao externa */
extern void main(void);
/* codigo da funcao */
void nome_da_funcao(void){#pragma asm...(codigo em Assembly)..
#pragma endasm}
Exemplo de linkagem com passagem de parâmetro
A) PROGRAMA PRINCIPAL PPAL.C
/* includes */
#include <reg51.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */#include <stdio.h> /* biblioteca de funcao de entrada e saida de dados */
/* prototipo de funcao externa */
10
extern char incrementa(char);
/* funcao principal */
void main(void){char teste=0;char *y,tabela[]={'a','b','c',’d’,’e’}; /* outra possibilidade de inicializacao da tabela */
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 0xf3; /* TH1: reload value for 2400 baud */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ y = tabela; /* inicializacao do ponteiro */
for (;teste< 5;) {
teste =incrementa(teste); printf("%c\n",*y++); }
while (1);
} /* end of main */
B) PROGRAMA SECUNDÁRIO SND.C
#pragma src(snd.asm) /* nome exemplo. Pode-se adotar qualquer nome */
/* includes */
#include <reg51.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */
/* protótipo de funcao externa */
extern void main(void);
/* codigo da funcao */
char incrementa(char varch) {#pragma asmMOV A, R7 ;o parâmetro contido em varch é passado em R7 para a funçãoINC AMOV R7,A ;dado retorna desta função para a principal em R7 #pragma endasm}
11