Jump to content
Fórum Script Brasil
  • 0

Problema no programa em C para 8051


Edu666

Question

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 to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...