Hola, estoy usando el microcontrolador 8051. Tengo un medidor de agua digital que proporciona datos binarios del tipo 0 1 0 1. Lo adjunté con 8051 INT1 para que pueda recibir interrupciones. Ahora, cuando el agua fluya a través del medidor, comenzará a enviar interrupciones (impulsos de 0101) a 8051 INT1. Ahora quiero contar los pulsos totales y enviarlos.
Para eso estoy usando este programa en Kiel en lenguaje C: [2do Actualizado]
#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: * Por lo tanto, al usar esto estoy tratando de obtener una interrupción del temporizador que verifica cuando no hay pulsos durante algún intervalo de tiempo, luego se supone que el flujo del medidor está completo y envía el mensaje.
Pero hay un error: no sé por qué, pero nuestro programa continúa enviando mensajes continuos varias veces, incluso si no inicio el contador de agua. Si inicio 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 se interrumpa para comenzar) y luego verifique el último valor y lo envíe solo una vez.
La próxima vez que inicie el medidor, debería esperar y enviar el valor nuevamente, pero no debería seguir enviando 0s a intervalos regulares.
ACTUALIZACIÓN : he actualizado el código y está funcionando bien, pero no funciona como deseo
Por favor, sugiere
Gracias