• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> 求助温度报警器程序问题!
    求助温度报警器程序问题!
    2012年03月06日 点击: 编辑: 中星6b
    我想做一个温度报警器,我这段程序不知道是哪里出错了,用Keil不能生成,请大家帮我指出来!我在这里谢谢大家了。
      #include<reg51.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit DQ=P3^2;
    sbit w1=P2^3;
    sbit w2=P2^2;
    sbit w3=P2^1;
    sbit w4=P2^0;
    sbit key1=P2^4;//模式按键
    sbit key2=P2^5;//加按键
    sbit key3=P2^6;//减按键
    sbit bell=P1^7;//蜂鸣器
    //uint temp;//温度值
    uint x;
    uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xff,0x89,0xc7};//共阳数码管段码
    uchar n=0;//数码管位数
    uchar sb[4];//显示缓存
    uchar H_Temp=50;//报警上限
    uchar L_Temp=10;//报警下限
    bit Alarm_en=0;//报警
    void delay(uint x)
    {
      uint i;
      uchar j;
      for(i=x;i>0;i--)
        for(j=110;j>0;j--);
    }
    void key_sound(uint x)
    {
      uint k,l;
       for(k=x;k>0;k--)
    {
      bell=~bell;
      for(l=35;l>0;l--);

    }
    bell=1;//保证发声结束后输出高电平(即无效电平)
    }
    void wx(uchar w)
    {
    switch(w)
      {
          case 0:
          w1=0;
          w2=1;
          w3=1;
          w4=1;
          break;
       case 1:
          w1=1;
          w2=0;
          w3=1;
          w4=1;
          break;
       case 2:
          w1=1;
          w2=1;
          w3=0;
          w4=1;
          break;
       case 3:
          w1=1;
          w2=1;
          w3=1;
          w4=0;
          break;
       }
    }
    void display()
    {
    if(n>3)n=0;
    P0=0;
    wx(n);
    P0=seg[sd[n]];
    delay(3);
    n++;
    }
    //键盘扫描
    {
    uchar i;
    uchar key_back;
    key_back=0;
    if(!key1|!key2|!key3)
    {
      for(i=7;i>0;i--)display();
       if(!key1|!key2|!key3)
       {
        if(!key1) key_back=1;
        else if(!key2) key_back=2;
        else if(!key3) key_back=3;
       }
       while(!key1|!key2|!key3)display();
    }
    return key_back;
    }
    //======================
    //按键处理
    void key_action(key_back)
    {
      if(key_back==1)
      {
      MODE++;
        if(MODE>2)MODE=0;
      }
    else if(key_back==2)
    {
      if(MODE==1)
      {
      H_Temp++;
        if(H_Temp>150)H_Temp=150;
      }
      else
      {
          if(L_Temp>150)L_Temp=150;
      }
    }
    else if(key_back==3)
    {
      if(MODE==1)
      {
          H_Temp--;
        if(H_Temp>150)H_Temp=0;
      }
      else
      {
        L_Temp--;
        if(L_Temp>150)L_Temp=0;
      }
    }
    }
    //======================
    //显示数据处理
    void Fuction()
    {
      if(!MODE)
      {
          sd[0]=temp_value/10;
        sd[1]=temp_value%10;
        sd[2]=10;
        sd[3]=temp_value1;
      }
      else if(MODE==1)
      {
        sd[0]=12;//H
        sd[1]=11;//不显示
        sd[2]=H_Temp/10;
        sd[3]=H_Temp%10;
      }
    else if(MODE==2)
    {
      sd[0]=13;//L
      sd[1]=11;//灭
      sd[2]=L_Temp/10;
      sd[3]=L_Temp%10;
    }
    }
    //==================
    //检查报警上下限
    void Check_Alarm()
    {
    if((temp_value>H_Temp)||(temp_value<L_Temp))Alarm_en=1;
    else if((temp_value==H_Temp)&&(temp_value1>0))Alarm_en=1;
    else Alarm_en=0;
    if(Alarm_en)key_sound(300);
    }
    void main()
    {
    uchar i;
    uchar key_back;
    Init_DS18B20();//DS18B20初始化
    ReadTemp();
    while(1)
    {
      i++;
      if(i==250)
      {
      i=0;
        ReadTemp();//检查报警
      }
    Fuction();//显示处理
    key_back==key_scan();
    if(key_back)key_action(key_back);
    display();
    }
    }
    赞助网站 | 关于我们 | 版权声明 | 站点导航 | 收藏本站 | 设为首页