赞助论坛
  • 2972阅读
  • 0回复

求助温度报警器程序问题! [复制链接]

楼层直达
发帖
4
精华
0
金币
8
威望
0
贡献
0
好评
0
注册
2010-04-20
楼主    中星6b 发表于: 2012-03-06 10:15:20 
我想做一个温度报警器,我这段程序不知道是哪里出错了,用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();
}
}