Você está na página 1de 11

Instrumentao Biomdica Microprocessada Estudo Dirigido - Laboratrio 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> #include <stdio.h> /****************/ /* main program */ /****************/ void main (void) { SCON = 0x50; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; TI = 1; printf ("Hello World\n"); while (1) { }; } /* SCON: mode 1, 8-bit UART, enable rcvr */ /* TMOD: timer 1, mode 2, 8-bit reload */ /* TH1: reload value for 2400 baud */ /* TR1: timer 1 run */ /* TI: set TI to send first char of UART */ /* the 'printf' function call /* loop infinito */ */ /* biblioteca que faz o programa reconhecer os Special Function Registers */ /* biblioteca de funcao de entrada e saida de dados */

Programa Exemplo No 2 - Ilustra a utilizao 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; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; TI = 1; y = tabela; printf ("Hello World\n"); /* SCON: mode 1, 8-bit UART, enable rcvr */ /* TMOD: timer 1, mode 2, 8-bit reload */ /* TH1: reload value for 2400 baud */ /* TR1: timer 1 run */ /* TI: set TI to send first char of UART */ /* inicializacao do ponteiro */ /* the 'printf' function call */

for (m=0;m< 5;m++) printf("%c\n",*y++); while (1); }

Programa Exemplo No 3 - Programa para acender leds conectados porta 1 e rotacion-los para direita ou esquerda conforme nivel de tenso no bit P3.5. /* LED.C */ /* declaracao de bibliotecas utilizadas pelo programa */ #include <reg51.h> /* declaracao de funcoes */ void delay (void); /* variveis 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 */ } void delay (void) { for (contador=0; contador < 3; contador++) { TH1 = 0xFF; TL1 = 0XFE; /* fim do programa principal */ /* special function register declarations */ /* for the intended 8051 derivative */

TR1 = 1; while (!TF1) {} TF1=0; TR1 = 0; } /* end of delay */ } /* end of for*/

Programa Exemplo No 4 - Ilustra o modo de tratar interrupes na linguagem C, empregando transmisso e recepo de dados. Conta o nmero de zeros recebidos em ASCII (0x30) e os valores no zeros recebidos. Obs: para visualizar os dados de sada, acione VIEW, HARDWARE e UART. Selecione apenas TRM e ASCII. Digite dados no buffer de entrada e coloque o dado x que encerra a transmisso */ /* INTER.C */ /* declaracao de bibliotecas utilizadas pelo programa */ #include <reg51.h> #include <stdio.h> /* variveis globais */ unsigned char rb; unsigned char tm = 0x31; /****************/ /* main program */ /****************/ void main (void) { SCON = 0x50; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; /* execution starts here after stack init */ /* SCON: mode 1, 8-bit UART, enable rcvr /* TMOD: timer 1, mode 2, 8-bit reload /* TH1: reload value for 2400 baud /* TR1: timer 1 run */ */ */ */ /* ilustra declarao de variveis e sua inicializao */ /* incializa tm com o ASCII = 1 */ /* special function register declarations */ /* for the intended 8051 derivative */

/* habilita interrupcao serial */ EA = 1; ES = 1; TI = 1; /* TI: set TI to send first char of UART */

SBUF = tm; while (SBUF != 'x'); /* enquanto no le detecta um x na porta serial, executa... */ /* lembrar que buffer de saida e de entrada so diferentes embora tenham mesmo endereco */ /* inibe interrupo pela porta serial /* necessrio para evitar travamento do AVSIM }/*end of main*/ */ */

ES

= 0;

while (1);

void serial(void) interrupt 4 using 3 { /* especifica interrupo serial (no 4) e banco de registradores (3) */ int count1 = 0; int count0 = 0; if (RI) { rb = SBUF; RI = 0; /* testa se dado recebido - buffer de recepo cheio */

switch (rb) { /* se valor zero, conta */ case 0x30: count0++; break; default: count1++; } if (TI) { TI=0; tm++; SBUF = tm; } }/* end of serial*/ }

/* testa se buffer de transmisso pronto para receber novo dado*/

Programa Exemplo No 5 - Ilustra o emprego de funes e operadores matemticos do compilador para calcular a funo coseno de a 2 em passos de 0.1 rad. /* COS.C */ /* declarao de bibliotecas utilizadas pelo programa */ #include <reg51.h> #include <stdio.h> #include <math.h> /* declaracao de funcoes */ void tcos(float); /****************/ /* main program */ /****************/ void main (void) { float x=-0.1; SCON = 0x50; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; TI = 1; while (1) { if (x< 2 * 3.1414) x+=0.1; else x=0.0; tcos(x); } }/*end of main*/ /* escreve na porta serial o resultado do calculo */ /* special function register declarations */ /* for the intended 8051 derivative */ /* prototype declarations for I/O functions */

/* execution starts here after stack init */ /* SCON: mode 1, 8-bit UART, enable rcvr */ /* TMOD: timer 1, mode 2, 8-bit reload */ /* TH1: reload value for 2400 baud */ /* TR1: timer 1 run */ /* TI: set TI to send first char of UART */ /* calcula o passo de forma periodica */

void tcos(float u) { 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 extenso HEX ir no menu de opes, selecionar /* bibliotecas do C */

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <reg51.h> #include <absacc.h> /* declarao de funes */ void NWRITE (char *,short); void INITDP (void); /* funo que envia caracteres para display */ /* funo que inicializa o display */

/* definio de labels utilizados nos programas */ #define RSTD 0x38 /* associa RSTD ao byte de reset do display */ #define EIND 0xFF00 /* endereo utilizado na inicializao do display */ #define EESD 0xFF40 /* endereo utilizado na escrita de dados no display */ void main (void) { char cadeia[]="testando$"; INITDP(); NWRITE (cadeia,EESD); while(1); }

/* array contendo mensagem */ /* chama rotina de inicializacao dos display */ /* envia caracteres a serem mostrados ou comandos para o display */ /* 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; for (x=0; x<512; x++); XBYTE[EIND]=RSTD; for (x=0; x<512; x++); XBYTE[EIND]=RSTD; for (x=0; x<512; x++); NWRITE(init,EIND); } /* escreve byte de reset */ /* introduz atraso */ /* escreve byte de reset */ /* introduz atraso */ /* escreve byte de reset */ /* introduz atraso */ /* envia demais bytes de inicializacao */

/*funcao para escrever conjunto de caracteres ou comandos no display */ /* como parametros so passados ponteiro para a string de caracteres e para ONDE enviar os dados; incializao e dados sao escritos em locais diferentes */ void NWRITE(char *dados, short ONDE) { 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 */ }

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 executvel. a) Programa principal em C (programa ppal.c) /*includes (acrescentar as bibliotecas necessrias) */ /* prototipo de funcao externa */ extern void nome_da_funcao (void); void main(void) { (cdigo da funcao em C) } b) Funo secundria 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 parmetro A) PROGRAMA PRINCIPAL PPAL.C


/* includes */ #include <reg51.h> #include <stdio.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */ /* biblioteca de funcao de entrada e saida de dados */

/* prototipo de funcao externa */ extern char incrementa(char);

10

/* funcao principal */ void main(void) { char teste=0; char *y,tabela[]={'a','b','c',d,e}; /* outra possibilidade de inicializacao da tabela */ SCON = 0x50; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; TI = 1; y = tabela; /* SCON: mode 1, 8-bit UART, enable rcvr */ /* TMOD: timer 1, mode 2, 8-bit reload */ /* TH1: reload value for 2400 baud */ /* TR1: timer 1 run */ /* TI: set TI to send first char of UART */ /* inicializacao do ponteiro */

for (;teste< 5;) {

teste =incrementa(teste); printf("%c\n",*y++); }

while (1); } /* end of main */

B) PROGRAMA SECUNDRIO 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 */

/* prottipo de funcao externa */ extern void main(void); /* codigo da funcao */ char incrementa(char varch) { #pragma asm MOV A, R7 ;o parmetro contido em varch passado em R7 para a funo INC A MOV R7,A ;dado retorna desta funo para a principal em R7 #pragma endasm }

11

Você também pode gostar