温湿度检测设计有如下程序错误,请问如何改?

2020-02-05 09:25发布

include<intrins.h>
#include <absacc.h>
#include <math.h>
#include "1602.h"
#include "sht11.h"
#define uchar unsigned char
#define uint   unsigned int
#define KEY_CANCEL 0x08
#define KEY_UP 0x04
#define KEY_DOWN 0x02
#define KEY_ENTER 0x01
//uchar xdata key_lcd_val_tmp[12];//临时保存用户设置的数据,当用户按ENTER键时写入相应寄存器
//uchar current_page=1;//记录当前正在显示的页面,初始状态显示第一页
uchar is_setting_system = 0;//记录系统是否处于设置系统状态==1,默认是显示页面状态==0
uint  key_value = 0; //键值为零
uchar key_value_valid = 0;//系统可以处理新键值
uchar j;
sbit Beep     =P3^6;
sbit LED_RED  =P1^5;
sbit LED_GREEN=P1^4;                        
sbit KEY01=P2^0;
sbit KEY02=P2^1;
sbit KEY03=P2^2;
sbit KEY04=P2^3;                  
void delay(uint);
void Init();
void delay_LCM(uint);                                     //LCD延时子程序
void initLCM( void);                       //LCD初始化子程序
void lcd_wait(void);      //LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数
void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData);                                         //显示指定坐标的一串字符子函数
void weishu1(float m);           
void display(void);
void alarm(void);
void handle_key_lcd1602(void);//处理按键与lcd1602显示,while循环中直接使用       
/**********main funcation************/
void main(void)
{
/*********************************/
        uint temp,humi;
//        uint Temp_CHA;
//        float humi_val;
//        float temp_val;                //定义两个共同体,一个用于湿度,一个用于温度
//        float dew_point;                            //用于记录露点值
        uchar error;                //用于检验是否出现错误
        uchar checksum;//CRC
        bit temp_f;
        unsigned char HUMI,TEMP;
        HUMI=0X01;
        TEMP=0X02;
        temp_f=1;
//        uchar wendu[6];//用于记录温度
//        uchar shidu[6];//用于记录湿度
/**********************************/
//delay(500);                      //系统延时500ms启动
//t=0;                   //采样值存储单元初始化为0
initLCM( );
Init();
LED_GREEN=0;
Beep =1;
delay(1000);
Beep =0;
WriteCommandLCM(0x01,1);                    //清显示屏
  DisplayListChar(0,0,str1);
DisplayListChar(0,1,str2);
s_softreset();
//s_connectionreset();                           //启动连接复位
while(1)
{
handle_key_lcd1602();
if( is_setting_system == 0 )
{
error=0;                                           //初始化error=0,即没有错误
error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量
error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
if(error!=0) s_connectionreset();                 ////如果发生错误,系统复位
else
{
humi_val.f=(float)humi_val.i;                   //转换为浮点数
temp_val.f=(float)temp_val.i;                   //转换为浮点数
calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
//                   dew_point=calc_dewpoint(humi_val.f,temp_val.f); //计算e dew_point
temp=temp_val.f*10;
humi=humi_val.f*10;
Temp_bai=temp/1000;                     //温度百位
Temp_shi=temp%1000/100;             //温度十位       
Temp_ge =temp%100/10;                        //温度个位
Temp_fen=temp%10;                                //温度小数点后第一位               
Humi_bai=humi/1000;                     //湿度百位
Humi_shi=humi%1000/100;             //湿度十位       
Humi_ge =humi%100/10;                        //湿度个位
Humi_fen=humi%10;                                //湿度小数点后第一位                  
alarm();
if(( Temp_bai !=0) && ( Temp_bai !=1) )
{
temp=temp*-1.0+10.0;
Temp_shi=temp%1000/100;             //温度十位       
Temp_ge =temp%100/10;                        //温度个位
Temp_fen=temp%10;                                //温度小数点后第一位
                                /*
Temp_CHA=Temp_shi*100+Temp_ge*10+Temp_fen;
Temp_CHA=55.0-Temp_CHA;
Temp_shi=Temp_CHA/100;                             //温度十位       
Temp_ge =Temp_CHA%100/10;                        //温度个位
Temp_fen=Temp_CHA%10;                                //温度小数点后第一位
                                */
display0();       
                        }
                        else
                        {
                                display1();       
                        }
                           display2();
                  }
                }
                else
handle_key_lcd1602();
  }
}
/***********************/
void Init()
{
//TMOD=0x11;
//TL1=0x3C;
//TH1=0xB0;
EA=1;
//        ET1=1;        //定时器1允许
IT1=1;
EX1=1;        //外部中断1允许
//        TR1=1;        //定时器1运行
}
/*********延时K*1ms,12.000mhz**********/

void delay(uint k)
{
   uint i,j;
   for(i=0;i<k;i++)
    for(j=0;j<100;j++);
}   
/*****************报警子函数*******************/

void alarm(void)
{
         uint sht_temp1;
         uint sht_temp2;
         uint sht_humi1;
         uint sht_humi2;
         uint sht_temp;
         uint sht_humi;
         sht_temp1=sht_10[0]*100+sht_10[1]*10+sht_10[2];
         sht_temp2=sht_10[3]*100+sht_10[4]*10+sht_10[5];
         sht_humi1=sht_10[6]*100+sht_10[7]*10+sht_10[8];
         sht_humi2=sht_10[9]*100+sht_10[10]*10+sht_10[11];
         sht_temp =Temp_bai*100+Temp_shi*10+Temp_ge;
         sht_humi =Humi_bai*100+Humi_shi*10+Humi_ge;
         if(sht_temp>=sht_temp1)
         {
                 Beep     =1;
                 LED_RED  =0;
                 LED_GREEN=1;
                delay(500);       
         }
         else
         {
                 Beep     =0;
                 LED_RED  =1;
                 LED_GREEN=0;       
         }
         if(sht_temp<=sht_temp2)
         {
                 Beep     =1;
                 LED_RED  =0;
                 LED_GREEN=1;
                delay(500);       
         }
         else
         {
                 Beep     =0;
                 LED_RED  =1;
                 LED_GREEN=0;       
         }
         if(sht_humi>=sht_humi1)
         {
                 Beep     =1;
                 LED_RED  =0;
                 LED_GREEN=1;
                delay(500);       
         }
         else
         {
                 Beep     =0;
                 LED_RED  =1;
                 LED_GREEN=0;       
         }
         if(sht_humi<=sht_humi2)
         {
                 Beep     =1;
                 LED_RED  =0;
                 LED_GREEN=1;
                delay(500);       
         }
         else
         {
                 Beep     =0;
                 LED_RED  =1;
                 LED_GREEN=0;       
         }
         /*
         if(sht_temp>=124 || sht_temp<=-40 || sht_humi>=101 || sht_humi<0)
         {
                 Beep     =1;
                 LED_RED  =0;
                 LED_GREEN=1;
                delay(1000);       
         }
         else
         {
                 Beep     =0;
                 LED_RED  =1;
                 LED_GREEN=0;       
         }*/
}
void handle_key_lcd1602(void) //处理按键与lcd1602显示,while循环中直接使用
{
       
        //uchar j=0;//临时循环变量
        //static uchar xdata save_data[12]={0,0,0,0,0,0,0,0,0,0,0,0};
        //static uchar inner_page_offset=1;
        //static uchar key_up_down_value = 0;//指向0f
if( is_setting_system == 0 ) //当前处于循环显示 数据界面
        {
if(key_value_valid==1)//按键值有效,按键按下(检测ENTER按键按下)
                        {
                                if(key_value==KEY_CANCEL)
                                        {
                                                        is_setting_system = 1;//下一次进入系统设置页面
                                                        //inner_page_offset = 1;
                                                        display3();
                                                        display4();
                                        }
                               
                        }                       
        }                                       
        else//当前处于设置界面
        {
        if(key_value_valid == 1)//有效按键按下
                        {
switch(key_value)//处理有效键值
                                {
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/               
case KEY_UP://按下的是向上键↑
{
sht_10[j]++;
if(sht_10[j]>=9)
sht_10[j]=9;
display3();
display4();       
}       
break;       
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/                                                case KEY_DOWN://按下的是向下键↓
{
sht_10[j]--;
if(sht_10[j]<=0)
sht_10[j]=0;
                                                       
display3();
display4();       
                                                }
break;
/*ENTER ENTER ENTER ENTER ENTER ENTER */
case KEY_ENTER:
{
j++;
if(j>12)
j=0;
                                                }
break;
/*CANCEL CANCEL CANCEL CANCEL CANCEL */
case KEY_CANCEL:
is_setting_system = 0;//下一次进入系统设置页面                                               
break;
default:
break;       
                                }                                               
                        }
        }
key_value_valid=0;//键值无效,为下一次按键做准备
EX1=1;        //外部中断1允许
}
/**************************/
void interrupt_key() interrupt 2 using 2
{
uint delay_time = 10000;
uchar key_command = 0;
//uchar key_command1 = 0;
uchar i;
uchar key_tmep_value[]={0x00,0x00,0x00,0x00};
//置端口为输入状态
KEY01 = 1;
KEY02 = 1;
KEY03 = 1;
KEY04 = 1;       
EX1=0;        //外部中断1允许
if(key_value_valid==0)//系统正在处理按键信息,所以当前按键无效
{
while(delay_time--);//延时片刻,待信号稳定
key_tmep_value[0] = ~KEY01;
key_tmep_value[1] = ~KEY02;
key_tmep_value[2] = ~KEY03;
key_tmep_value[3] = ~KEY04;
for(i=0;i<4;i++)
                                {                               
key_command |= (key_tmep_value[i] <<i);
                                }
switch(key_command)
                                {
case KEY_UP:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效
break;
case KEY_DOWN:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效       
break;
case KEY_ENTER:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效
break;               
case KEY_CANCEL:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效                                                                                               
break;       
default:
//serial_send_string("key error",strlen("key error"));//--test
break;
                                }
                }
错误提示如下;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。