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
}
}
Question
Edu666
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:
Link to comment
Share on other sites
0 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.