找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1667|回复: 0
打印 上一主题 下一主题
收起左侧

求助keil的编译无法在仿真上实现求帮忙看看程序

[复制链接]
跳转到指定楼层
楼主
ID:292990 发表于 2018-3-18 08:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include <intrins.h>                                                                                                                                                //库文件
#include <math.h>                                                                                                                                                   //库文件
#include <stdio.h>                                                                                                                                                        //库文件
#include <1602.h>                                                                                                                                                                //lcd1602头文件
#include <sht11.h>                                                                                                                                                        //sht11头文件
#include <24c02.h>                                                                                                                                                  //24c02头文件

#define uchar unsigned char
#define uint  unsigned  int
       
#define W_cmd 0xa0                                                                                                                                            //24c02写指令
#define R_cmd 0xa1                                                                                                                                                        //24c02读指令

uchar temp,humi,gas;                                                                                                                                                 //定义温度,湿度,气体浓度
value humi_val,temp_val;                                                                                                              //定义两个共同体,一个用于湿度,一个用于温度
uchar error;                                                                                //检验是否出现错误
uchar checksum;                                                                                   //CRC                    
uchar nn;                                                                                         //用于蜂鸣器                  
uchar TEMP_data[7];                                                                         //用于记录实测的温度
uchar HUMI_data[6];                                                                         //用于记录实测的湿度
uchar show_temp[10];                                                                  //保存设定的温度
uchar show_humi[8];                                                                         //保存设定的湿度
uchar show_gas[8];                                                                                                                                                        //保存设定的气体浓度

uchar idata temp_humi_gas_cache[12];                                                        //温湿度和气体浓度设置缓存
uchar temp_high;                                                                                         //温度上限变量
uchar temp_low;                                                                              //温度下限变量
uchar humi_high;                                                                            //湿度上限变量
uchar humi_low;                                                                                                //湿度下限变量
uchar gas_high;                                                                                                                                                                        //气体浓度上限变量
uchar gas_low;                                                                                                                                                                        //气体浓度下限变量
uchar presskeynum;                                                                          //按键次数变量

uchar code word1[]={"  a product of  "};
uchar code word2[]={"husijia"};
uchar code word3[]={" Welcome"};

sbit k1=P3^2;                                                                                                                                                                         //选择按键
sbit k2=P3^3;                                                                                                                                                                         //增加按键
sbit k3=P3^4;                                                                                                                                                                         //减小按键
sbit k4=P3^5;                                                                                                                                                                                //确认按键
sbit led1=P1^0;                                                                                                                                                                         //温度过低指示灯报警
sbit led2=P1^1;                                                                                                                                                                        //温度过高指示灯报警
sbit led3=P1^2;                                                                                                                                                                        //湿度低于下限值,报警,加湿
sbit led4=P1^3;                                                                                                                                                                        //湿度过高,报警,不调湿
sbit beep=P2^5;                                                                                                                                                                        //定义蜂鸣器
sbit motor1=P1^4;                                                                                                                                                                //加热电机
sbit motor2=P1^5;                                                                                                                                                                //降温电机
sbit motor3=P1^6;                                                                                                                                                                //加湿电机
sbit motor4=P1^7;                                                                                                                                                                //干燥电机
sbit P2_6=P2^6;

/*************************************************************************/

//****************************延时函数************************************/
void delay(uint z)                                                                                                                                                  //z为毫秒数

{
     int a,b;
     for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}

/*************************************************************************/

//****************************按键函数************************************/
void key()
{
     uchar m;
     if (k1==0)                                                                                                                                                                 //调整按键检测
     {
         delay(10);
         if (k1==0)
         {
             presskeynum++;
             if(presskeynum==7)
             presskeynum=0;
             while(k1==0);                                                                                                                         //若一直按下,循环
             LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
         }
     }
    if(presskeynum==1)                                                                                                                                        //第一次按下温度上限设置
   {
      if(k2==0)                                                                                                                                                                        //数字加
      {
         delay(300);                                                                                                                                                //延时
         temp_high++;
         if (temp_high>90)
         temp_high=0;
         if (temp_high<0)
         temp_high=90;
         while(k2==0);                                                                                                                       //按下后松开才做处理
      }
      if(k3==0)                                                                                                                                                                        //数字减
      {
         delay(300);
         temp_high--;
         if (temp_high>90)
         temp_high=0;
         if (temp_high<0)
         temp_high=90;
         while(k3==0);                                                                                                                       //按下后松开才做处理
      }
   }
   if(presskeynum==2)                                                                                                                                                //第二次按下温度下限设置
   {
      if(k2==0)                                                                                                                                                                        //数字加
      {
         delay(300);
         temp_low++;
         if (temp_low>90)
         temp_low=0;
         if (temp_low<0)
         temp_low=90;
         while(k2==0);
      }
      if(k3==0)                                                                                                                                                                        //数字减
      {
         delay(300);
         temp_low--;
         if (temp_low>90)
         temp_low=0;
         if (temp_low<0)
         temp_low=90;
         while(k3==0);
      }
   }
   if(presskeynum==3)                                                                                                                                                //第三次按下湿度上限设置
   {
      if(k2==0)                                                                                                                                                                        //数字加
      {
          delay(300);
          humi_high++;
          if (humi_high>50)
          humi_high=0;
          if (humi_high<0)
          humi_high=50;
          while(k2==0);
      }
      if(k3==0)                                                                                                                                                                        //数字减
      {
          delay(300);
          humi_high--;
          if (humi_high>50)
          humi_high=0;
          if (humi_high<0)
          humi_high=50;
          while(k3==0);
      }
   }
   if(presskeynum==4)                                                                                                                                                //第四次按下湿度下限设置
   {
      if(k2==0)                                                                                                                                                                        //数字加
      {
          delay(300);
          humi_low++;
          if (humi_low>50)
          humi_low=0;
          if (humi_low<0)
          humi_low=50;
          while(k2==0);
      }
      if(k3==0)                                                                                                                                                                        //数字减
      {
          delay(300);
          humi_low--;
          if (humi_low>50)
          humi_low=0;
          if (humi_low<0)
          humi_low=50;
          while(k3==0);
      }
   }
         if(presskeynum==5)                                                                                                                                                //第五次按下浓度上限设置
   {
      if(k2==0)                                                                                                                                                                        //数字加
      {
          delay(300);
                                        gas_high++;
          if (gas_high>30)                                                                                                                        //因为空气中二氧化碳占比0.3%,氧气浓度占比21%,故上限值减少至30
          gas_high=0;
          if (gas_high<0)
          gas_high=30;
          while(k2==0);
      }
      if(k3==0)                                                                                                                                                                        //数字减
      {
          delay(300);
          gas_high--;
          if (gas_high>30)
          gas_high=0;
          if (gas_high<0)
          gas_high=30;
          while(k3==0);
      }
   }
   if(presskeynum==6)                                                                                                                                                //第六次按下浓度下限设置
   {
      if(k2==0)                                                                                                                                                                        //数字加
      {
          delay(300);
          gas_low++;
          if (gas_low>30)
          gas_low=0;
          if (gas_low<0)
          gas_low=30;
          while(k2==0);
      }
      if(k3==0)                                                                                                                                                                        //数字减
      {
          delay(300);
          gas_low--;
          if (gas_low>30)
          gas_low=0;
          if (gas_low<0)
          gas_low=30;
          while(k3==0);
      }
   }

       if(k4==0)// 退出键
       {
            delay(10);
            if(k4==0)
            {
                while(k4==0);
                presskeynum=0;
                                                                temp_humi_gas_cache[0]=temp_high/10;                                                                                        //将设定的温度上限值十位进行缓存
                                                                temp_humi_gas_cache[1]=temp_high%10;                                                                                        //将设定的温度上限值个位进行缓存
                                                                temp_humi_gas_cache[2]=temp_low/10;                                                                                                //将设定的温度下限值十位进行缓存
                                                                temp_humi_gas_cache[3]=temp_low%10;                                                                                                //将设定的温度下限值个位进行缓存
                                                                temp_humi_gas_cache[4]=humi_high/10;                                                                                        //将设定的湿度上限值十位进行缓存
                                                                temp_humi_gas_cache[5]=humi_high%10;                                                                                        //将设定的湿度上限值个位进行缓存
                                                                temp_humi_gas_cache[6]=humi_low/10;                                                                                                //将设定的湿度下限值十位进行缓存
                                                                temp_humi_gas_cache[7]=humi_low%10;                                                                                                //将设定的湿度下限值个位进行缓存
                                                                temp_humi_gas_cache[8]=gas_high/10;                                                                                                //将设定的浓度上限值十位进行缓存
                                                                temp_humi_gas_cache[9]=gas_high%10;                                                                                                //将设定的浓度上限值个位进行缓存
                                                                temp_humi_gas_cache[10]=gas_low/10;                                                                                                //将设定的浓度下限值十位进行缓存
                                                                temp_humi_gas_cache[11]=gas_low%10;                                                                                                //将设定的浓度下限值十位进行缓存

                for(m=0;m<=7;m++)
                                                                {  
                                                                                WriteIIC(W_cmd,0x00+m,temp_humi_gas_cache[m]);              //设定值写入24c02
                                                                }
                                                                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);                                                                   //清屏


             }
        }
}




/*************************************************************************/

//****************************主函数************************************/

void main()
{
         uchar t;
     k1=k2=k3=k4=1;
         motor1=motor2=motor3=motor4=0;                                                                                                                                                                        //4个执行器初始化
         P2_6=0;
     for (t=0;t<12;t++)
     temp_humi_gas_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);                                                                  //读入24c02设定的值
     temp_high=temp_humi_gas_cache[0]*10+temp_humi_gas_cache[1];                                        //温度上限值=缓存0+缓存1
                 temp_low=temp_humi_gas_cache[2]*10+temp_humi_gas_cache[3];                                                //温度下限值=缓存2+缓存3               
     humi_high=temp_humi_gas_cache[4]*10+temp_humi_gas_cache[5];                                        //湿度上限值=缓存4+缓存5
           humi_low=temp_humi_gas_cache[6]*10+temp_humi_gas_cache[7];                                                //湿度下限值=缓存6+缓存7
           gas_high=temp_humi_gas_cache[8]*10+temp_humi_gas_cache[9];                                                //湿度上限值=缓存8+缓存9
                 gas_low=temp_humi_gas_cache[10]*10+temp_humi_gas_cache[11];                                        //湿度下限值=缓存10+缓存11
       
     LCD_Initial();                                                                                                                                                                                                             //液晶初始化
       
     GotoXY(0,0);
     Print_slow(word1);                                                                                                                                                                                                                //lcd1602输出word1内容
     GotoXY(0,1);
     Print_slow(word2);                                                                                                                                                                                                                //lcd1602输出word2内容
       
     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);                                                                                                           //清屏
                 
     GotoXY(0,0);
     Print_slow(word3);                                                                                                                                                                                                                //lcd1602输出word3内容
                 
     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);                                                                                                            //清屏   

/******************************************************************************************************/                 

     while(1)
        {
                     key();
             if(presskeynum==0)                                                                                                                                                                                         //测量温湿度
             {                                                                  
             s_connectionreset();                                                                                                                                                                         //启动连接复位
             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
                 {
                      temp_val.f=(float)temp_val.i;                                           //转换为浮点数
                                                                                        humi_val.f=(float)humi_val.i;                                           //转换为浮点数
                      calc_sth10(&humi_val.f,&temp_val.f);                                     //修正相对湿度及温度
                      temp=temp_val.f*10;
                      humi=humi_val.f*10;
                                                                                        GotoXY(0,0);                                                       //选择温度显示位置
                      Print("Temp:      C");                                             //5格空格
                      GotoXY(0,1);                                                      //选择湿度显示位置
                      Print("Humi:      %");                                             //5格空格                           
                      GotoXY(5,0);                                                       //设置温度显示位置
                      TEMP_data[0]=temp/1000+'0';                                              //温度百位
                      if (TEMP_data[0]==0x30)                                                                                                                         //如果实测温度百位为0
                                                                                        TEMP_data[0]=0x20;                                                                                                                                                //第一个缓存为空格
                      TEMP_data[1]=temp%1000/100+'0';                                                //温度十位      
                      if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)                                 //如果实测温度十位为0且第一个缓存为0
                                                                                        TEMP_data[1]=0x20;                                                                                                                                                //第二个缓存为空格
                      TEMP_data[2]=temp%100/10+'0';                                           //温度个位
                      TEMP_data[3]=0x2e;                                                      //小数点
                      TEMP_data[4]=temp%10+'0';                                               //温度小数点后第一位            
                      TEMP_data[5]=0xdf;                                                      //显示温度符号℃
                      TEMP_data[6]='\0';                                                                                                                                               
                      Print(TEMP_data);                                                        //输出温度               
                      GotoXY(5,1);                                                            //设置湿度显示位置
                                                                                        HUMI_data[0]=humi/1000+'0';                                             //湿度百位                           
                      if (HUMI_data[0]==0x30)                                                                                                                                //如果实测湿度百位为0
                                                                                        HUMI_data[0]=0x20;                                                                                                                                                //第一个缓存输出为0
                      HUMI_data[1]=humi%1000/100+'0';                                                                  //湿度十位      
                      HUMI_data[2]=humi%100/10+'0';                                                                    //湿度个位
                      HUMI_data[3]='.' ;                                                                               //小数点
                      HUMI_data[4]=humi%10+'0';                                                                        //湿度小数点后第一位   
                      HUMI_data[5]='\0';                                                                                                                                               
                      Print(HUMI_data);                                                                         //输出湿度         
                                                                                       
                                                if ((temp/10)<temp_low)                                                                                                                                                                        //如果温度小于设定最小值
                                          {
                                            led1=0;                                                                                                                                                                                                                         //温度低于设定下限值LED1点亮报警
                                                        motor1=0;                                                                                                                                                                                                                        //启动加热电机
                                                  led2=1;                                                                                                                                                                                                                                //LED2暗
                                                  motor2=1;                                                                                                                                                                                                                        //制冷电机停止                       
                                                        if((temp/10)==temp_low)                                                                                                                                                                //如果实际温度等于设定温度下限值
                                                        {
                                                                led1=1;                                                                                                                                                                                                                        //LED1暗
                                                                motor1=0;                                                                                                                                                                                                                //启动加热电机
                                                                led2=1;                                                                                                                                                                                                                        //LED2暗
                                                                motor2=1;                                                                                                                                                                                                                //制冷电机停止       
                                                        }
                                          }
                                                if ((temp/10)>temp_high)                                                                                                                                                                //如果温度大于设定最大值
                                                {
                                                        led2=0;                                                                                                                                                                                                                         //温度高于设定上限值LED2点亮报警
                                                        motor2=1;                                                                                                                                                                                                                        //降温电机工作
                                                        led1=1;                                                                                                                                                                                                                                //LED1暗
                                                        motor1=0;                                                                                                                                                                                                                        //加热电机停止
              if ((temp/10)==temp_high)
                                                                {
                                                                        led2=1;                                                                                                                                                                                                                //LED2暗
                                                                        motor2=0;                                                                                                                                                                                                        //启动降温电机
                                                                        led1=1;                                                                                                                                                                                                                //LED1暗
                                                                        motor1=1;                                                                                                                                                                                                        //加热电机停止
                                                                }
                                                }
                                                else if ((temp/10)>temp_low &&((temp/10)<temp_high))                                                //如果温度在设定值之间
                                                {
                                                        led1=1;                                                                                                                                                                                                                         //LED1暗
                                                        motor1=1;                                                                                                                                                                                                                        //加热电机停止
                                                        led2=1;                                                                                                                                                                                                                                //LED2暗
                                                        motor2=1;                                                                                                                                                                                                                        //降温电机停止
                                                }
                                               
                                                if ((humi/10)<humi_low)
                                          {
                                            led3=0;                                                                                                                                                                                                                         //湿度低于设定下限值LED3点亮报警
                                                        motor3=0;                                                                                                                                                                                                                        //启动加湿电机
                                                  led4=1;                                                                                                                                                                                                                                //LED4暗
                                                  motor4=1;                                                                                                                                                                                                                        //干燥电机停止                       
                                                        if((humi/10)==humi_low)                                                                                                                                                                //如果实际湿度等于设定湿度下限值
                                                        {
                                                                led3=1;                                                                                                                                                                                                                        //LED3暗
                                                                motor3=0;                                                                                                                                                                                                                //启动加湿电机
                                                                led4=1;                                                                                                                                                                                                                        //LED4暗
                                                                motor4=1;                                                                                                                                                                                                                //干燥电机停止       
                                                        }
                                          }
            if ((humi/10)>humi_high)
            {
                                                        led4=0;                                                                                                                                                                                                                         //湿度高于设定上限值LED4点亮报警
                                                        motor4=1;                                                                                                                                                                                                                        //干燥电机工作
                                                        led3=1;                                                                                                                                                                                                                                //LED3暗
                                                        motor3=0;                                                                                                                                                                                                                        //加湿电机停止
              if ((humi/10)==humi_high)
                                                                {
                                                                        led4=1;                                                                                                                                                                                                                //LED4暗
                                                                        motor4=0;                                                                                                                                                                                                        //启动干燥电机
                                                                        led3=1;                                                                                                                                                                                                                //LED3暗
                                                                        motor3=1;                                                                                                                                                                                                        //加湿电机停止
                                                   }
                                           }
            else if ((humi/10)>humi_low &&((humi/10)<humi_high))                                                //如果温度在设定值之间
                                                {
                                                        led3=1;                                                                                                                                                                                                                         //LED3暗
                                                        motor3=1;                                                                                                                                                                                                                        //加湿电机停止
                                                        led4=1;                                                                                                                                                                                                                                //LED4暗
                                                        motor4=1;                                                                                                                                                                                                                        //干燥电机停止
                                                }        
               }  //else
       }  //if
                               
                         if (((temp/10)<temp_low)|((temp/10)>temp_high)|((humi/10)<humi_low))
            {
                for (nn=0;nn<50;nn++)
                {
                    beep=0;
                    delay(1);                                                                                                                                                                                                //延时1ms
                    beep=1;                                                                                                                                                                                                        //响0.5s
                    delay(1);
                }
            }
            if ((humi/10)>humi_high)
            {
                for (nn=0;nn<10;nn++)
                {
                    beep=0;                                                                                                                                                                                                       
                    delay(1);                                                                                                                                                                                                //延时1ms
                    beep=1;                                                                                                                                                                                                        //响0.1s                                                                                       
                    delay(1);                                                                                                                                                                                               
                }
            }               
        }
        /******************************************************************************************************/
                               
        if(presskeynum==1)                                                                                      //设置温度上限时显示的内容
        {
            set_temp[0]=temp_high/10+0x30;                                                                                        //设定上限温度十位保存于缓存
            set_temp[1]=temp_high%10+0x30;                                                                                        //设定上限温度个位保存于缓存
            set_temp[2]=0xdf;                                                                                                                                                //°
            set_temp[3]='C';                                                                                                                                                //C
            set_temp[4]='\0';
            GotoXY (0,0);                                                                                                                                                                //第一行输出SET TEMP HIGH:
            Print("SET TEMP HIGH:");       
            GotoXY (0,1);                                                                                                                                                                //第二行输出温度值
            Print(set_temp);
        }
        if(presskeynum==2)                                                                                      //设置温度下限时显示的内容
        {
            set_temp[5]=temp_low/10+0x30;                                                                                                //设定下限温度十位保存于缓存
            set_temp[6]=temp_low%10+0x30;                                                                                                //设定下限温度个位保存于缓存
            set_temp[7]=0xdf;                                                                                                                                                //°
            set_temp[8]='C';                                                                                                                                                //C
            set_temp[9]='\0';
            GotoXY (0,0);                                                                                                                                                                //第一行输出SET TEMP LOW:
            Print("SET TEMP LOW:");                                                                       
            GotoXY (0,1);                                                                                                                                                                //第二行输出温度值
            Print(set_temp);                                                       
        }
        if(presskeynum==3)                                                                                      //设置湿度上限时显示的内容
        {
            set_humi[0]=humi_high/10+0x30;                                                                                        //设定上限湿度十位保存于缓存
            set_humi[1]=humi_high%10+0x30;                                                                                        //设定上限湿度个位保存于缓存
            set_humi[2]='%';                                                                                                                                                //%
            set_humi[3]='\0';
            GotoXY (0,0);                                                                                                                                                                //第一行输出SET HUMI HIGH:
                                                Print("SET HUMI HIGH:");                                                                                                                        
            GotoXY (0,1);                                                                                                                                                                //第二行输出湿度值
            Print(set_humi);
        }
        if(presskeynum==4)                                                                    //设置湿度下限时显示的内容
        {
            set_humi[4]=humi_low/10+0x30;                                                                                                //设定下限湿度十位保存于缓存
            set_humi[5]=humi_low%10+0x30;                                                                                                //设定下限湿度个位保存于缓存
            set_humi[6]='%';                                                                                                                                                //%
            set_humi[7]='\0';
            GotoXY (0,0);                                                                                                                                                                //第一行输出SET HUMI LOW:
            Print("SET HUMI LOW:");                                                                                                                       
            GotoXY (0,1);                                                                                                                                                                //第二行输出湿度值
            Print(set_humi);                                                                                                                                       
        }     
                          if(presskeynum==5)                                                                    //设置空气浓度下限时显示的内容
        {
            set_gas[0]=gas_low/10+0x30;                                                                                                        //设定上限浓度十位保存于缓存
            set_gas[1]=gas_low%10+0x30;                                                                                                        //设定上限浓度个位保存于缓存
            set_gas[2]='%';                                                                                                                                                        //%
            set_gas[3]='\0';
            GotoXY (0,0);                                                                                                                                                                //第一行输出SET GAS LOW:
            Print("SET GAS LOW:");
                                                GotoXY (0,1);                                                                                                                                                                 //第二行输出空气浓度值
            Print(set_gas);
        }  
                                 if(presskeynum==6)                                                                    //设置空气浓度上限时显示的内容
        {
            set_gas[4]=gas_high/10+0x30;                                                                                                //设定下限浓度十位保存于缓存
                                                set_gas[5]=gas_high%10+0x30;                                                                                                //设定下限浓度个位保存于缓存
            set_gas[6]='%';                                                                                                                                                        //%
            set_gas[7]='\0';
            GotoXY (0,0);                                                                                                                                                                //第一行输出SET GAS HIGH:
            Print("SET GAS HIGH:");
            GotoXY (0,1);                                                                                                                                                                 //第二行输出空气浓度值
           Print(set_gas);
        }  
}

2018.3.17.rar

198.62 KB, 下载次数: 2

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表