[求助] 温度测量

15075039ZQ   2009-5-17 16:12 楼主
#include "reg51.h"
#include "intrins.h"
sbit p24=P2^4;//数码管位控制口
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
sbit jdq=P2^0;//控制继电器
sbit p10=P1^0;//键控制按键抠
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
bit b0=1;//控制数码管的亮熄
bit b1=1;
bit b2=1;
bit b3=1;
bit a0=0;//数码管闪烁控制位
bit a1=0;//数码管闪烁控制位
unsigned char k=0;//累计按键按下次数
unsigned int d=0;//低位
unsigned int e=0;//高位
unsigned int f=0;//fx测量累计频率
unsigned int baocun=0;//保存数据
unsigned int t=0;//温度
unsigned char led5=0xfe;//灯初始位置
unsigned char code x[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void fun()//数码管延时
{
unsigned char i;
for(i=0;i<50;i++)
;
}
void xs()//显示程序
{
P0=x[e/10];
p24=0;
fun();
p24=1;

P0=x[e%10];
p25=0;
fun();
p25=1;

P0=x[d/10];
if(b1)
p26=0;
fun();
p26=1;

P0=x[d%10];
if(b0)
p27=0;
fun();
p27=1;
}
void kongzhi()//温度控制
{
if(t     {
     jdq=0;//继电器工作
  }
}
void inetop1() interrupt 3//T1控制数码管闪
{
if(a0)
{
TH1=0X3C;//0.1s
TL1=0XB0;
if(a0)  b0=!b0;//闪的控制
if(a1)  b1=!b1;
}
else
{
    TR0=0;
    TR1=0;//定时计数都停止
   f=(TH0*256+TL0);//取频率数据
   if((f<1900)&&(f>=1540))
   {
     t=(f-1500)/38+40;//40~80度
   }
   else if((f<1540)&&(f>1520))
   {
     t=40;//40度
   }
   else if((f<1520)&&(f>=1200))
   {
   t=(f-1220)/30+30;//30~40度
   }
    else if((f<1200)&&(f>=900))
{
t=(f-930)/29+20;//20~30度?
}
else
{
t=0xff;
}
    kongzhi();//比较后控制继电器
d=t%100;//低位
    e=t/100;//求温度,高位
    TH1=0X3c;
TL1=0Xb0;//0.1s
    TH0=0X0;
TL0=0X0; //频率为0
    TR0=1;
    TR1=1;//为下一次计数器工作 作准备
      }   
}
void key() interrupt 0//键盘函数
{   
p10=1;p11=1;
  if(p10==0)
  {k++;//按键次数累计
  if(k==1)
  {
  a0=1;//数码管闪烁控制位
  a1=0;
  TR0=0;
  TR1=0;//计数器停止工作
  }
    if(k==2)
    { k=0;
            a0=1;
        TR0=1;
          TR1=1;
      baocun=d;//保存数据
   b0=1;b1=1;//数码管正常工作,按键次数清0
   //修改参数保存
    }
  }
  
  if(p11==0)
  {//闪烁时对应数码管加1
  if(a0)
  {         
                d++;
    if(d==100)
    {
    d=0;
    }
        }
    }
}
void main()
{ TMOD=0X15;//方式1控制
TH0=0X0;//赋初值T0,控制数码管计时
TL0=0X0;
    TH1=0X3c;//赋初值T1,控制数码管闪烁
TL1=0Xb0;
TR0=1;//启动T0,控制时间
TR1=1;//启动T1,控制数码管?
IT0=1;//选择触发方式
EX0=1;//开允许位T0
    ET1=1;//开允许位T
// EX1=1;//开允许位T1
    EA=1;//开总中断

for(;;)
{
xs();
}
}


徐老师,这个程序能够测温度,测量温度基本正确,20~50度误差不太大,就是退出,保存时不正确,(参数修改后不能退出到测量模式)

回复评论 (1)

用一个状态位控制“正常测试”和“参数修改”状态切换。
设置按键使进入“参数修改”状态,保存按键恢复“正常测试”
点赞  2009-5-18 08:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复