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
    }
    
}