我可以知道,C ++可以为温度和湿度监视系统创建代码吗?该系统使用PIC16F877A,SHT11传感器,蜂鸣器和LCD 2x16.下面的编码是否正确? [英] May I know, can C++ create a coding for temperature and humidity monitoring system?The system uses PIC16F877A, SHT11 sensor, buzzer and LCD 2x16. Is the coding below is correct?

查看:108
本文介绍了我可以知道,C ++可以为温度和湿度监视系统创建代码吗?该系统使用PIC16F877A,SHT11传感器,蜂鸣器和LCD 2x16.下面的编码是否正确?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <16F877A.h>
#include <string.h>
// #device *=16
#fuses HS,NOLVP,WDT,NOPUT,NOBROWNOUT
#use delay (clock=10000000,RESTART_WDT)
#USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,STREAM=COM_A)
#USE RS232(BAUD=9600,XMIT=PIN_D2,RCV=PIN_D3,STREAM=COM_B)
#include <math.h>

#include <string.h>

// Definiciones Sensores Temp y HR
#define DATA_SHT  PIN_C0 // sht75 1
#define SCK_SHT   PIN_C1
#define DATA_SHT2 PIN_C2 // sht75 2
#define SCK_SHT2  PIN_C3

#define noACK 0
#define ACK   1
#define STATUS_REG_W 0x06   //000   0011    0 //adr|command|r/w  command code
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1E   //000   1111    0
#define C1  -4.0            // constant use for SHT1x Humidity Measurement
#define C2  0.0405
#define C3  -0.0000028
#define D1  -40.00          // constant use for SHT1x Temperature Measurement
#define D2  0.01
#define T1  0.01            // constant use for SHT1x True Humidity Measurement
#define T2_ 0.00008


///////////////////////////////////////////////////////////////sensor1
// SHT1x Transmission Start Sequence
void sht1x_xmission_start()
{  output_high(DATA_SHT);output_low(SCK_SHT);delay_us(2);output_high(SCK_SHT);
   delay_us(2);output_low(DATA_SHT);delay_us(2);output_low(SCK_SHT);delay_us(2);
   delay_us(2);delay_us(2);output_high(SCK_SHT);delay_us(2);
   output_high(DATA_SHT);delay_us(2);output_low(SCK_SHT);delay_us(2);
}
// SHT1x Connection Reset Sequence
void sht1x_connection_reset()
{  int i;
   output_high(DATA_SHT);
   for (i=0; i<9; i++)
    {output_high(SCK_SHT);delay_us(2);output_low(SCK_SHT);delay_us(2);}
   sht1x_xmission_start();
}
// SHT1x Address & Command Mode with address=000
void sht1x_command_mode(int iMode)
{  int i;
   for (i=128; i>0; i/=2)
   {  if (i & iMode) output_high(DATA_SHT);
      else  output_low(DATA_SHT);
      delay_us(2); output_high(SCK_SHT);
      delay_us(2); output_low(SCK_SHT);
   }
   output_float(DATA_SHT);  delay_us(2);
   output_high(SCK_SHT);    delay_us(2);
   output_low(SCK_SHT);     delay_ms(250);
}
// SHT1x Soft Reset
// resets the interface, clears the status register to default values
// wait minimum 11ms before next command
void sht1x_soft_reset()
{ sht1x_connection_reset(); sht1x_command_mode(RESET); }
// read DATA_SHT from SHT1x and store
long sht1x_read_DATA_SHT()
{  int i;
   long lTmp;
   long lVal1=0;
   long lVal2=0;
   long lValue;
   // get MSB from SHT1x
   for (i=0; i<8; i++)
   {
      lVal1<<=1;
      output_high(SCK_SHT);
      lTmp = input(DATA_SHT);
      delay_us(2);
      output_low(SCK_SHT);
      delay_us(2);
      if (lTmp) lVal1|=1;
   }
   // acknowledge routine
output_low(DATA_SHT); delay_us(2);
output_high(SCK_SHT); delay_us(2);
output_low(SCK_SHT);
output_float(DATA_SHT);
delay_us(2);
   // get LSB from SHT1x
   for (i=0; i<8; i++)
   {
      lVal2<<=1;
      output_high(SCK_SHT);
      lTmp = input(DATA_SHT);
      delay_us(2);
      output_low(SCK_SHT);
      delay_us(2);
      if (lTmp) lVal2|=1;
   }
   lValue = make16(lVal1,lVal2);
   return(lValue);
}
// calculate dewpoint
float sht1x_calc_dewpoint(float h,float t)
{
float logEx,dew_point;
logEx=-2+0.66077+((7.5*t)/(237.3+t))+log10(h);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
///////////////////////////////////////////////////////////////sensor1

///////////////////////////////////////////////////////////////sensor2
// SHT1x Transmission Start Sequence
void sht1x_xmission_start2()
{  output_high(DATA_SHT2);
   output_low(SCK_SHT2);    delay_us(2);
   output_high(SCK_SHT2);   delay_us(2);
   output_low(DATA_SHT2);   delay_us(2);
   output_low(SCK_SHT2);    delay_us(2);  delay_us(2);  delay_us(2);
   output_high(SCK_SHT2);   delay_us(2);
   output_high(DATA_SHT2);  delay_us(2);
   output_low(SCK_SHT2);    delay_us(2);
}
// SHT1x Connection Reset Sequence
void sht1x_connection_reset2()
{  int i;
   output_high(DATA_SHT2);
   for (i=0; i<9; i++)
   {  output_high(SCK_SHT2);  delay_us(2);
      output_low(SCK_SHT2);   delay_us(2);
   }
   sht1x_xmission_start2();
}
// SHT1x Address & Command Mode with address=000
void sht1x_command_mode2(int iMode)
{  int i;
   for (i=128; i>0; i/=2)
   {  if (i & iMode) output_high(DATA_SHT2);
      else  output_low(DATA_SHT2);
      delay_us(2); output_high(SCK_SHT2);
      delay_us(2); output_low(SCK_SHT2);
   }
   output_float(DATA_SHT2);  delay_us(2);
   output_high(SCK_SHT2);    delay_us(2);
   output_low(SCK_SHT2);     delay_ms(250);
}
// SHT1x Soft Reset
// resets the interface, clears the status register to default values
// wait minimum 11ms before next command
void sht1x_soft_reset2()
{ sht1x_connection_reset2(); sht1x_command_mode2(RESET); }
// read DATA_SHT from SHT1x and store
long sht1x_read_DATA_SHT2()
{  int i;
   long lTmp;
   long lVal1=0;
   long lVal2=0;
   long lValue;
   // get MSB from SHT1x
   for (i=0; i<8; i++)
   {
      lVal1<<=1;
      output_high(SCK_SHT2);
      lTmp = input(DATA_SHT2);
      delay_us(2);
      output_low(SCK_SHT2);
      delay_us(2);
      if (lTmp) lVal1|=1;
   }
   // acknowledge routine
output_low(DATA_SHT2); delay_us(2);
output_high(SCK_SHT2); delay_us(2);
output_low(SCK_SHT2);
output_float(DATA_SHT2);
delay_us(2);
   // get LSB from SHT1x
   for (i=0; i<8; i++)
   {
      lVal2<<=1;
      output_high(SCK_SHT2);
      lTmp = input(DATA_SHT2);
      delay_us(2);
      output_low(SCK_SHT2);
      delay_us(2);
      if (lTmp) lVal2|=1;
   }
   lValue = make16(lVal1,lVal2);
   return(lValue);
}
// calculate dewpoint
float sht1x_calc_dewpoint2(float h,float t)
{
float logEx,dew_point;
logEx=-2+0.66077+((7.5*t)/(237.3+t))+log10(h);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
///////////////////////////////////////////////////////////////sensor2







// Main Program
void main(void)
{  float fRh_lin, fRh_true, fTemp_true;
   float fRh_lin2, fRh_true2, fTemp_true2;
   long lValue_rh,lValue_temp;
   long lValue_rh2,lValue_temp2;
   char temp_cadena[6];
   char humi_cadena[6];
   char cadena_rs232[25];

   char espacio[2];
   char transmite[42];
   char transmite2[6];
   char transmite3[6];
   strcpy(espacio," ");
   strcpy(transmite,"");
   strcpy(transmite2,"");
   strcpy(transmite3,"");
   setup_wdt(WDT_2304MS);

while(TRUE)
{  restart_wdt(); 
   sht1x_connection_reset();   delay_ms(500);
   sht1x_connection_reset2();  delay_ms(500);
   strcpy(transmite,"");
   strcpy(temp_cadena,"");
   strcpy(humi_cadena,"");

   delay_ms(12); sht1x_xmission_start(); sht1x_command_mode(MEASURE_TEMP);
   lValue_temp = sht1x_read_DATA_SHT(); fTemp_true = (D1+(D2*lValue_temp));     // calcula la medida fisica de temp1
   delay_ms(12); sht1x_xmission_start(); sht1x_command_mode(MEASURE_HUMI);
   lValue_rh = sht1x_read_DATA_SHT();                                           // calcula la humedad relativa
   if((lValue_temp==65535)||(lValue_rh==65535)) {sht1x_connection_reset();
                                                }
   else
   {fRh_lin = (C1+(C2*lValue_rh)+(C3*lValue_rh*lValue_rh));
    fRh_true = (((fTemp_true-25)*(T1+(T2_*lValue_rh)))+fRh_lin);
    strcpy(temp_cadena,"");
    sprintf(temp_cadena,"%02.0f",fTemp_true);     // convierte a cadena el valor de Temp ##
    sprintf(humi_cadena,"%02.0f",fRh_true);
    strcpy(transmite,"");
    strcat(transmite,temp_cadena);                // añade este valor a cadena tranmite
    strcat(transmite,espacio);
    strcat(transmite,humi_cadena);
    strcpy(transmite2,"");
    strcpy(transmite2,transmite);

   }

   strcpy(transmite,"");
   strcpy(temp_cadena,"");
   strcpy(humi_cadena,"");
   delay_ms(12);sht1x_xmission_start2();sht1x_command_mode2(MEASURE_TEMP);
   lValue_temp2 = sht1x_read_DATA_SHT2(); fTemp_true2 = (D1+(D2*lValue_temp2));   // calcula la medida fisica de temp2
   delay_ms(12); sht1x_xmission_start2(); sht1x_command_mode2(MEASURE_HUMI);
   lValue_rh2 = sht1x_read_DATA_SHT2();
   if((lValue_temp2==65535)||(lValue_rh2==65535)) {sht1x_connection_reset2();
                                                }
   else
   {fRh_lin2 = (C1+(C2*lValue_rh2)+(C3*lValue_rh2*lValue_rh2));
    fRh_true2 = (((fTemp_true2-25)*(T1+(T2_*lValue_rh2)))+fRh_lin2);
    strcpy(temp_cadena,"");
    sprintf(temp_cadena,"%02.0f",fTemp_true2);     // convierte a cadena el valor de Temp ##
    sprintf(humi_cadena,"%02.0f",fRh_true2);
    strcpy(transmite,"");
    strcat(transmite,temp_cadena);                // añade este valor a cadena tranmite
    strcat(transmite,espacio);
    strcat(transmite,humi_cadena);
    strcpy(transmite3,"");
    strcpy(transmite3,transmite);
   }

   if  ((strlen(transmite2))!=0&&(strlen(transmite3))!=0)
     { strcpy(transmite,"");
       strcat(transmite,transmite2);
       strcat(transmite, espacio);
       strcat(transmite,transmite3);
       fgets(cadena_rs232,COM_B); // cual=1; esto lo puse pal tec
       strcat(transmite,espacio);
       strcat(transmite,cadena_rs232);
       fprintf(COM_A,"%s",transmite);
       printf("\r");
     }

} // while
} // main</string.h></math.h></string.h>



添加了代码块[/编辑]



Code block added[/Edit]

推荐答案

我们怎么知道?
我们无权访问您的硬件图,因此不知道如何将所有内容连接在一起.
您有软件,也有硬件.
试试吧.看看是否有效!

顺便说一句:将来,请在发布代码之前先整理一下缩进-这样会使代码更容易阅读,而不仅仅是发布整个程序-这被称为代码转储,被认为是不礼貌的.
How would we know?
We do not have access to your hardware diagrams and so have no idea how everything is connected together.
You have the software, you have the hardware.
Try it. See if it works!

BTW: in future, please sort out your indentation before you post code - it makes it a lot easier to read, and don''t just post a whole program - taht''s called a code dump and is considered rude.


这篇关于我可以知道,C ++可以为温度和湿度监视系统创建代码吗?该系统使用PIC16F877A,SHT11传感器,蜂鸣器和LCD 2x16.下面的编码是否正确?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆