微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 程序有点问题 求大神指点

程序有点问题 求大神指点

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<stdio.h>
#include <math.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0   //LCD接口
#define noACK 0
#define ACK   1
uchar code temp[]={"temp: "};
uchar code tempset[]={"tempset: "};
uchar code hun[]={"hun: "};
uchar code hunset[]={"hunset: "};
uchar code set[]={"step in set!"};
uchar tempset1,s1num,s4num,hunset1,hun1,hun2;
float temp1=0;
uchar stop=0;
uchar xiaoying=0;
//        stop=0;
int t_bai,t_shi,t_ge,t_qian,
          h_bai,h_shi,h_ge,h_qian;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
sbit s5=P1^4;
sbit s6=P1^5;
sbit wbj=P2^2;
sbit sw=P2^3;
sbit jw=P2^4;
sbit sbj=P3^5;
sbit js=P3^6;
sbit zs=P3^7;
sbit lcdrs=P2^5;
sbit lcdrw=P2^6;
sbit lcden=P2^7;
sbit DATA = P2^1;
sbit SCK = P2^0;
void delay(uint z)          //延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
//SHT11写字节
uchar s_write_byte(uchar value)
{
  uchar i,error=0;  
  for (i=0x80;i>0;i/=2)        // //高位为1,循环右移     
  {
    if (i & value)                                 // 和要发送的数相与,结果为发送的位
                DATA=1;        
    else
                DATA=0;                        
            SCK=1;                          
            _nop_();
                _nop_();
                _nop_();                        //延时3us
            SCK=0;
  }
                  DATA=1;                //释放数据线           
                  SCK=1;                           
                  error=DATA;            //检查应答信号,确认通讯正常           
                  SCK=0;        
                  return error;          //error=1 通讯错误         
}
// SHT11读字节程序
uchar s_read_byte(uchar ack)
{
  uchar i,val=0;
  DATA=1;                     //释放数据线      
  for (i=0x80;i>0;i/=2)            
  {
                  SCK=1;                        
    if (DATA) val=(val | i);     //读一位数据线的值   
            SCK=0;                                           
  }
                  DATA=!ack;               //如果是校验,读取完后结束通讯         
                  SCK=1;                           
                  _nop_();
                _nop_();
                _nop_();         
                  SCK=0;                                                    
                  DATA=1;                          
                  return val;
}
//SHT11启动传输
void s_transstart(void)
{  
   DATA=1;
   SCK=0;                  
   _nop_();
   SCK=1;
   _nop_();
   DATA=0;
   _nop_();
   SCK=0;  
   _nop_();
   _nop_();
   _nop_();
   SCK=1;
   _nop_();
   DATA=1;                  
   _nop_();
   SCK=0;                  
}
//连接复位
void s_connectionreset(void)
{  
  uchar i;
  DATA=1;
   SCK=0;                    
  for(i=0;i<9;i++)                  //dat保持高,SCK时钟触发9次,发送启动传输,通迅即复位
  { SCK=1;
    SCK=0;
  }
  s_transstart();                   //启动传输
}
//SHT11温度检测
uint measure_T()
{
    uchar val_1,val_2;
        uint tempval,error=0;
        s_connectionreset();
        s_transstart();
        error+=s_write_byte(0x03);                        //测量温度
        if(error!=0)
         s_connectionreset();
        else
          {
            while(DATA==1)
                 _nop_();
                 if(DATA==0)
                   {
                     val_1=s_read_byte(ACK);
                        val_2=s_read_byte(noACK);
                        tempval=val_2+val_1*256; //转换成 16 位的 int 型
                   }
                 else
                 error=1;
          }
         return tempval;     
}
float c_T(uint temp_val)           //将检测到的数据转化为相应的温度数据
{
    uchar i;
        const float d1=-40.0;           // 14位温度精度 5V条件  修正公式
        const float d2=+0.01;          // 14位温度精度 5V条件  修正公式
        float temp_final;
        temp_val=temp_val&0x3fff;      //取低14位
        temp_final=d1+d2*(float)temp_val;
        for(i=100;i>0;i--)
        delay(1);
        return temp_final;
}
//SHT11湿度检测
uint measure_H()
{
    uchar val_1,val_2;
        uint tempval,error=0;
        s_connectionreset();
        s_transstart();
        error+=s_write_byte(0x05);                        //测量温度
        if(error!=0)
         s_connectionreset();
        else
          {
             while(DATA==1)
                 _nop_();
                 if(DATA==0)
                   {
                     val_1=s_read_byte(ACK);
                        val_2=s_read_byte(noACK);
                        tempval=val_2+val_1*256; //转换成 16 位的 int 型
                   }
                 else
                   error=1;
          }
         return tempval;     
}
//检测到的数据转化为相应的湿度数据
float c_H(float t,float h)      
{
    uchar i;
        const float C1=-4.0;              // 12位湿度精度 修正公式
        const float C2=+0.0405;           // 12位湿度精度 修正公式
        const float C3=-0.0000028;        // 12位湿度精度 修正公式
    const float T1=+0.01;             // 14位温度精度 5V条件  修正公式
        const float T2=+0.00008;          // 14位温度精度 5V条件  修正公式
        float rh=h;
        float rh_lin;                     // rh_lin: 湿度 linear值
        float rh_true;                                            // rh_true: 湿度 ture值
        float t_C;                        // t_C   : 温度 ℃
        t_C=t*0.01-40;                    //补偿温度
        rh_lin=C3*rh*rh + C2*rh + C1;     //相对湿度非线性补偿
        rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
        if(rh_true>100)
        rh_true=100;       //湿度最大修正
        if(rh_true<0.1)
        rh_true=0.1;       //湿度最小修正
        for(i=100;i>0;i--)
        delay(1);
        return rh_true;
}
//读温度
  void read_T(float temperature)
{
    float temp;
        temp=temperature*100;
        t_qian=(int)temp/1000;
        t_bai =(int)temp%1000/100;
        t_shi =(int)temp%100/10;
        t_ge  =(int)temp%10;
        }
//读湿度
void read_H(float humidity)
{
    float hum;
        hum=humidity*100;
        h_qian=(int)hum/1000;
        h_bai =(int)hum%1000/100;
        h_shi =(int)hum%100/10;
        h_ge  =(int)hum%10;
}
///////////////////////////////////////////////////////////
void write_com(uchar com)   //lcd写命令函数
{
       
        lcdrs=0;
        lcdrw=0;
        lcden=0;
        P0=com;
        delay(10); //延时
        lcden=1;   //下三行表示E高脉冲到来就开始转换
        delay(10);
        lcden=0;
}
void write_data(uchar date)           //lcd写数据函数
{
        lcdrs=1;
        lcdrs=1;
        lcdrw=0;
        lcden=0;
        P0=date;
    delay(1);
        lcden=1;
    delay(1);
        lcden=0;
}
void init()            //初始化函数
{
        s1=1;
        tempset1=25;
        hunset1=50;
        lcdrw=0;       
        lcden=0;
        write_com(0x38);
        delay(10);
        write_com(0x0f);
        delay(10);
        write_com(0x06);
        delay(10);
        write_com(0x01);
        delay(10);
}
void print(uchar a,uchar *str)          //输出字符
{
        write_com(a);
        while(*str!='\0') {write_data(*str++);}
        *str=0;
                       
}
void print1(uchar a,uchar t)   //输出SHT11数据到1602
{
        write_com(a);
        write_data(t);
}
void print2(uchar a1,uchar t1)   //输出设置温度数据到1602
{
        uchar sshi,sge;  
        sshi=t1/10;
        sge=t1%10;
        write_com(0x80+a1);
        write_data(sshi+0x30);
        write_data(sge+0x30);
}
////////////////////////////////////////////////////////////
void keyscan()        //键盘扫描函数
{
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {
                s1num++;
                while(!s1);
               
                if(s1num==1)
                        {
                        write_com(0x01);
                        print(0x80,tempset);
                        print1(0x8e,0x43);
                        print1(0x80+11,0x2e);
                        print1(0x80+12,0+0x30);
                        print1(0x80+13,0+0x30);
                        write_com(0x80+9);
                        write_com(0x0f);
                        delay(20);  
                           }
                if(s1num==2)
                        {
                        write_com(0x01);
                        print(0x80,hunset);
                        print1(0x8b,0x30);
                        print1(0x8d,0x25);
                          print1(0x8e,0x20);
                        write_com(0x80+11);
                        write_com(0x80+11);
                        }
                if(s1num==3)
                        {
                        s1num=0;
                        write_com(0x01);
                        s4num=1;
                        }
                }
        }
if(s1num!=0)
{
        if(s1num==1)
                {
                        if(s2==0)
                        {
                                delay(5);
                                if(s2==0)
                                {
                                        while(!s2);
                                        if(s1num==1)
                                        {
                                                tempset1++;
                                                write_com(0x80+10);
                                                print2(9,tempset1);
                                                if(tempset1==40)
                                                tempset1=15;
               
                                        }
                                }                               
                        }
        if(s3==0)
                {
                        delay(5);
                        if(s3==0)
                        {
                                while(!s3);
                                if(s1num==1)
                                {
                                        tempset1--;
                                        write_com(0x80+11);
                                         print2(9,tempset1);
                                        if(tempset1==15)
                                        tempset1=40;
                                }
                        }
                }
                }
                                               
if(s1num==2)
{
        if(s2==0)
        {
        delay(5);
        if(s2==0)
                {
                while(!s2);
                if(s1num==2)
                        {
                        hunset1++;
                        write_com(0x80+10);
                        print2(11,hunset1);
                        if(hunset1==90)
                        hunset1=10;
               
                        }
                }
                                               
        }
if(s3==0)
        {
                delay(5);
                if(s3==0)
                        {
                                while(!s3);
                                if(s1num==2)
                                {
                                        hunset1--;
                                        write_com(0x80+11);
                                        print2(11,hunset1);
                                        if(hunset1==10)
                                        hunset1=90;
                                }
                                       
                        }
        }                                                               
}
}
       
if(s4==0)
       
        {
                delay(5);
                if(s4==0)
                {
                s4num++;
                while(!s4);
                }
        }
       
if(s4num!=0)
        {                  
        if(s4num==1)
        {
          print(0x80,tempset);
      print(0xc0,temp);
          print2(9,tempset1);
          print1(0X8b,0x2e);
          print1(0X8c,0+0x30);
          print1(0X8d,0+0x30);
          print1(0X8e,0xdf);
          print1(0x8f,0x43);               
          if(t_qian!=0)
                print1(0xc9,t_qian+0x30);
          else
          print1(0xc9,0x20);
          print1(0xca,t_bai+0x30);
          print1(0xcb,0x2e);
          print1(0xcc,t_shi+0x30);
          print1(0xcd,t_ge+0x30);
          print1(0xce,0xdf);
          print1(0xcf,0x43);
               
        }
               
        if(s4num==2)
        {
        print(0x80,hunset);
        print(0xc0,hun);
        print2(9,hunset1);
        print1(0x80+7,0x20);
        print1(0x80+8,0x20);
        print1(0x8b,0x2e);
        print1(0x8c,0x30);
        print1(0x8d,0x30);
        print1(0x8e,0x25);
        print1(0x8f,0x20);
        if(h_qian!=0)
                print1(0xc9,h_qian+0x30);
        else
          print1(0xc9,0x20);
          print1(0xca,h_bai+0x30);
          print1(0xcb,0x2e);
          print1(0xcc,h_shi+0x30);
          print1(0xcd,h_ge+0x30);
          print1(0xce,0x25);
          print1(0xcf,0x20);                                       
        }
        }
if(s5==0)
       
        {
                delay(5);
                if(s5==0)
                {
                xiaoying=1;
                while(!s5);       
                               
                }
        }
if(s6==0)
       
        {
                delay(5);
                if(s6==0)
                {
                 stop=1;
                while(!s6);
               
                }
        }
        if(s4num==3)
        {
         write_com(0x01);
         print(0x80,set);
        s4num=0;                               
        }
}
void main()
{
    float dis_tempval,dis_humival;
        uint tempval,humival;
        init();
        print(0x80,set);
        wbj=0;jw=1;        sw=1;sbj=0;js=1;zs=1;
        while(1)
        {         
                      delay(10);
                          dis_tempval=c_T(tempval);
                          read_T(dis_tempval);
                          dis_humival=c_H(dis_tempval,humival);
                          read_H(dis_humival);
                            keyscan();
                           tempval=measure_T();
                            humival=measure_H();
                          if((xiaoying==0)&&(stop==0))
                          {
                                     if ((int)dis_tempval>=(int)tempset1+5) //继电器控制温度
                                                    {wbj=1;jw=0;}
                                  if ((int)dis_tempval<(int)tempset1-5)  //        此处有问题
                                                  {wbj=1;sw=0;}
                                        if((int)dis_humival>=(int)hunset1+10)//继电器控制湿度
                                        {sbj=1;js=0;}       
                                     if((int)dis_humival<(int)hunset1-10)          //                  此处有问题
                                        {sbj=1;zs=0;}       
                          }
                          if(xiaoying==1)
                          {
                                          wbj=0;        sbj=0;
                          }

                   if(stop==1)
                   {
                                   jw=1;sw=1;zs=1;js=1;
                   }
}
}
主函数中的if语句 在执行的时候有问题  本意是在温度高于设定值5度或低于设定值5度报警  湿度高于设定值10或低于设定值10报警 现在是开始就报警  而且是低于设定值 报警  求大神啊

看一下你读到的温湿度数据是不是正确

正确的 现在问题找到了 if语句有问题  还是要谢谢你

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top