Hola, estoy usando un microcontrolador 8051. Tengo un medidor de agua digital que da datos de tipo binario 0 1 0 1. Lo conecté con el 8051 INT1 para que pueda obtener la interrupción. Ahora, cuando el flujo de agua a través del medidor se iniciará el envío de interrupción (pulsos de 0101) a 8051 INT1. Ahora quiero contar el total de pulsos y enviarlo.
Para ello estoy usando este programa en Kiel en lenguaje C : [2da Actualización]
#include<reg51.h> // include at89x51 . h
#include<stdio.h>// include stdio . h
#include<stdlib.h>// include stdlib . h
unsigned long value,x;
unsigned long check;
unsigned long time_overflow_count=0;
void initialize_GSM_modem(void);
void initialize_serialcommunication(void);
unsigned char Command_CMGF[]="AT+CMGF=1\r";
// AT+CMGF for selecting Text Mode
unsigned char CtrlZ=0x1A;
// CTRL+Z for sedning SMS after the message has been entered
unsigned char Command_CMGS[]="AT+CMGS=\"+9xxxxxxxxx\"\r";
// recepient mobile number
unsigned char Command_AT[]="AT\r";
unsigned char msg02[]="Hello!";
unsigned char buf[10]={0};
void send(void)interrupt 1
{
time_overflow_count=time_overflow_count+1;
if (time_overflow_count==5){
if(value==x){
sprintf((char*)buf, "R %lu", value);
time_overflow_count=0;
initialize_GSM_modem();
value=0;
}
}
TR0=1;
}
void input_counting(void) interrupt 2
{
TR0=0;
TL0=0x00;
TH0=0x00;
value=value+1;
TR0=1;
}
void main (void) {
TMOD = 0x21;
TH1 = 0xFD;
TL0=0x55;
TH0=0x55;
SCON = 0x50;
TR1=1;
EX1=1;///Enable external intrrupt 1
EA=1;
IE1=1;
IT1=1;
PX1=1;
ET0=1;
TI=1;
while(1)
{
x=value;
}
}
void delay(void){
unsigned int i;
for(i=0;i<50;i++);
}
void delay2(void){
unsigned long i;
for(i=0;i<15000;i++);
}
void initialize_GSM_modem(void)
{
delay2();
puts(Command_CMGS);
delay2();
puts((char *)buf);
delay2();
while(!TI); TI = 0;SBUF = 0x1A;
}
* Actualizado : *Así que usando esto estoy tratando de conseguir una interrupción del temporizador que comprueba cuando no hay pulsos durante algún intervalo de tiempo entonces asume que el flujo del medidor está completo y envía el mensaje.
Pero hay un error: no sé por qué pero nuestro programa sigue enviando mensajes continuos durante un número de veces incluso si no arranco el contador de agua. Si pongo en marcha el contador de agua, envía el valor total en la parada y si no lo hago, sigue enviando 0 a intervalos regulares
Lo que quiero es que espere a que fluya el agua (o a que se inicie la interrupción) y luego compruebe el último valor y lo envíe una sola vez.
La próxima vez que inicie el medidor, debería esperar y enviar el valor de nuevo, pero no debería seguir enviando 0s a intervalos regulares.
ACTUALIZACIÓN : He actualizado el código y su trabajo bien, pero su no funciona como yo deseo
Por favor, sugiera
Gracias