Ir para conteúdo
Fórum Script Brasil
  • 0

Problema no programa em C para 8051


Edu666

Pergunta

Pessoal, montei o programa em C com meus poucos conhecimentos e um pouco de pesquisa. Preciso controlar a temperatura e o nível de um reservatório de água, para a disciplina de microcontroladores. Entradas do sistema: duas chaves de nível e a leitura da temperatura (LM35 ligado ao AD0804). Saídas: resistência para aquecimento e válvula para entrada de água.

Preciso mostrar no Pc através do Hyper Terminal a temperatura atual e modificar o set point de temperatura. O programa compila sem erros, mas quando executo, não mostra na tela a temperatura, e se desconecto os terminais na porta P0, enche a tela de [[[[, o comando para alterar o set point também não funciona!

Agradeço se puderem me ajudar, abaixo o código:

#include <at89x52.h>
#include <paulmon2.h>
#include <stdlib.h>
#include <stdio.h>


// Saidas e Entradas

#define baixo         P1_0
#define alto         P1_2    
#define valv        P1_4
#define resist         P1_6    

#define enter    0x0D        // "enter" em ASCII


//    Declaração das variaveis globais

int ch1;        // (0-100ºC)
int setpoint;        // set point de temperatura
char teclado;        // variável recebida pelo teclado

// seleciona AD
volatile xdata at 0x0001 unsigned int inicia_ad1;

//Lê o AD
volatile xdata at 0x0002 unsigned char ad1;


//    Declaração das funções

void delay100u(void);                // Delay de 100 uS.
void delayms(unsigned char);            // Delay multiplo de 1ms.
void delays(unsigned char);            // Delay multiplo de 1s.
void le_ad(void);                // Lê o AD selecionado.
char cin(void);                    // Receba caractere pela serial.
void testa_cin(void);                // Verifica se o caractere recebido é útil.
int numero(void);                // Lê setpoint e converte para inteiro.
void testa_cin (void);                // testa caracteres




//#############################################################################################################################################################

//    Funçao Principal

void main(void)

{    
    setpoint=0;
    pm2_pstr("digite S para setpoint:");        // habilita no hiper terminal o set point
    pm2_newline();                    // vai para nova linha
    


    for(;;)
    {    
        le_ad();              // lê AD
        pm2_pstr(ch1);          // indica no hiper terminal a temperatura 

        if (setpoint > ch1)        // controla temperatura
        {
            resist = 1;
        }
        else
        {
            resist = 0;
        }
        
        if (baixo == 1 && alto == 1)        // tanque cheio
        {
            valv = 0;
        }
        if (baixo == 0 && alto == 0)        // tanque nivel baixo
        {
            valv = 1;
        }
        P1_4 = baixo;    // para testar entrada, tirar do programa depois
    }
}


//#############################################################################################################################################################

//    Sub-rotinas


//--------------------------------------------------------------------------------------------------------------------------------------------------------------

void delay100u(void)
{
    _asm
        mov r2,#8
    0200$:
        mov r1,#55
    0300$:
        djnz r1,0300$
        djnz r2,0200$
     _endasm;
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------

void delayms(unsigned char numero_ms)
{
    numero_ms;
    
    _asm
        
        mov r0,dpl
    0100$:
        mov r2,#8
    0200$:
        mov r1,#55
    0300$:
        djnz r1,0300$
        djnz r2,0200$
        djnz r0,0100$
        
     _endasm;
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------

void delays(unsigned char numero_s)
{
    numero_s;
    do 
    {
        int i = 4;
        do 
        {
            delayms(250);
        } while(--i);
    } while(--numero_s);
}


//--------------------------------------------------------------------------------------------------------------------------------------------------------------

void le_ad(void)    // Lê o AD 
{
        
                inicia_ad1 = 1;        // inicia conversão do AD
                delay100u();        // espera conversão
                ch1 = ad1 / 2;        // lê o AD1 e ajusta escala
                if (ch1 > 99)        // limita em 100ºC
                    ch1 = 100;        
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------

int numero (void)
{
    char S[3];
    int i;
    int k = 0;
    int j = 0;
    char X;

    do
    {
        X = pm2_cin();
        if (X >= '0' && X <= '9')    // somente salva no vetor se for número
        {
            S[j] = X;
            pm2_cout(S[j]);        // retorna caractere lido pela serial
            j++;
        }
        k++;
    } while (X != enter && j < 3);        // fica no laço até ler 3 caracteres numéricos ou até pressionar "enter"
    
    switch (j)                // desloca digitos conforme a quantidade digitada
    {
        case 3:
            break;
        case 2:
            S[2] = S[1];
            S[1] = S[0];
            S[0] = '0';
            break;
        case 1:
            S[2] = S[0];
            S[1] = '0';
            S[0] = '0';
            break;
        default:
            S[2] = '0';
            S[1] = '0';
            S[0] = '0';
            break;
    }

    i = atoi(S);            // converte string para int
    
    if (i < 0)
        i = 0;
    if (i > 100)
        i = 100;

    pm2_newline();                    // vai para nova linha
    pm2_pstr("digite o setpoint");            // indica no hiper terminal o modo selecionado
    pm2_newline();                    // vai para nova linha
        

    return(i);            // retorna o valor numérico tipo inteiro                        
}


//--------------------------------------------------------------------------------------------------------------------------------------------------------------

void testa_cin (void)        // verifica se o caractere recebido é útil
{
    teclado = pm2_cin();                        // recebe dado da serial
    

    if (teclado == 's' || teclado == 'S')        // seleciona set point
    {
        pm2_cout(teclado);                // retorna ao hiper terminal a tecla pressionada
        pm2_newline();                    // vai para nova linha
        pm2_newline();                    // vai para nova linha
        pm2_pstr("Digite o setpoint: ");        // indica no hiper terminal a espera de um comando
        setpoint = numero();                    // lê setpoint digitado
        pm2_pstr(" C");                    // coloca unidade
        pm2_newline();                    // vai para nova linha
        pm2_newline();                    // vai para nova linha
        pm2_newline();                    // vai para nova linha
        pm2_newline();                    // vai para nova linha
        pm2_pstr("digite S para setpoint: ");        // indica no hiper terminal a espera de um comando
    }
    
}

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...