18B20单片机程序

#include <reg52.h>
#include <ds18b20.h>


/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(unsigned char k) //参数传递进来时单精度被转化为unsigned char
{
int s=(int)((temperature-k)*10);//取得temperature值的小数点后一位数字
if(k>=0&&k <10)
{
led1=0;              //第一位数码管灭

P0=tabx[k%10];      //将温度值个位数显示在第二位数码管
        led2=1;
delay(400);
        led2=0;

//将温度值小数点后一位数显示在第三位数码管
P0=tab[s]; //显示小数点后一位
led3=1;
delay(400);
        led3=0;
       

P0=0xc6;            //第四位数码管显示字符"C",表示摄氏度℃
led4=1;
delay(400);
        led4=0;
}
else if(k <100&&k>=10)
{
P0=tab[k/10];    //将温度值十位数显示在第一位数码管
led1=1;
delay(400);
        led1=0;


P0=tabx[k%10];  //将温度值个位数显示在第二位数码管
led2=1;
delay(400);
        led2=0;


P0=tab[s]; //将温度值小数点后一位数显示在第三位数码管
led3=1;
delay(400);
        led3=0;
   

P0=0xc6;      //第四位数码管显示字符"C",表示摄氏度℃
led4=1;
delay(400);
        led4=0;

}
else //若超过测量范围,则数码管灭
{
led1=0;led2=0;led3=0;led4=0;
}

}

/****************************************************************************
函数功能:按键扫描程序
入口参数:            
出口参数:
****************************************************************************/
void button(void)
{
if(k1==0)
{
blueled=0; //除了ds18b20的工作灯(黄灯)亮之外,其余灯灭
greenled=1;
RT_flag=1; //启动温度读取与转换函数ReadTemperature()
BZ_flag=1; //启动蜂鸣器扫描函数speaker()
ds18b20_flag=1; //ds18b20标志位为1
EX0=0; //关外部中断0
EX1=0; //关外部中断1
}

else if(k2==0)
{
greenled=0;   //除了设置报警值时的状态灯(绿灯)亮之外,其余灯灭
blueled=1;
RT_flag=0;
BZ_flag=0;
temperature=30.0; //进入设置报警值时,初始显示30℃
EX0=1; //开外部中断1
EX1=1; //开外部中断1
}
else
return;
}

/****************************************************************************
函数功能:蜂鸣器扫描程序
入口参数:B_flag            
出口参数:
****************************************************************************/
void speaker(unsigned char B_flag)
{
if(B_flag)
{
if(temperature>TH) 
          {buzzer=0; redled=0; yellowled=1;} //温度大于上限值,启动蜂鸣器,红灯亮,报警
        else if(temperature <TL)
          {buzzer=0; yellowled=0; redled=1;} //温度大于下限值,启动蜂鸣器,黄灯亮,报警
        else
          {buzzer=1; yellowled=1; redled=1;}

}
else
return;  
}


/****************************************************************************
函数功能:DS18B20初始化子程序
入口参数:            
出口参数:
****************************************************************************/
void Init_DS18B20(void)
{
unsigned char result_18b20; //用来存储DQ的脉冲
do{
DQ=0; //拉低总线,发出复位脉冲
delay_18b20(25); //延时530us
DQ=1; //释放总线,等待ds18b20的应答脉冲
delay_18b20(5); //等待110us
result_18b20=DQ; //读取ds18b20的应答脉冲
delay_18b20(15); //等待周期结束
}while(result_18b20==1); //若ds18b20无应答,则继续发复位脉冲
}

/****************************************************************************
函数功能:向DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i,j;
unsigned char dat=0;
for(i=8;i>0;i--)
{
  dat>>=1; //右移一位
  DQ=0; //拉低总线
for(j=2;j>0;j--); //延时4us
  DQ=1; //释放总线,以让DS18B20把数据传输到单总线上
  for(j=4;j>0;j--); //延时8us
  if(DQ==1) //读取ds18b20发来的数据,从低位读起
  dat|=0x80; //将读到的数据保存在d中
  delay_18b20(2); //延时等待读周期结束
  DQ=1;
}
  return(dat); //返回读到的数据
}

/****************************************************************************
函数功能:向DS18B20写一字节数据
入口参数:d
出口参数:
****************************************************************************/
void WriteOneChar(unsigned char dat)
{
  unsigned char i,j;
  for(i=8;i>0;i--)
  {
DQ=0; //拉低总线
for(j=2;j>0;j--); //延时4us
DQ=dat&0x01; //主机在总线上写数据传送到ds18b20
delay_18b20(3); //延时等待写周期结束
DQ=1; //重新将总线拉高
  dat>>=1; //右移一位
  }
}

/****************************************************************************
函数功能:向DS18B20读温度值并转换成实际温度
入口参数:R_flag
出口参数:
****************************************************************************/
void ReadTemperature(unsigned char R_flag)
{
if(R_flag==1)
{
unsigned char n;
Init_DS18B20(); //初始化ds18b20
WriteOneChar(0xcc); //发送读指令跳过rom
WriteOneChar(0x44); //发送指令启动温度转换
Init_DS18B20(); //初始化ds18b20
WriteOneChar(0x55); //发送读指令匹配rom
if(ds18b20_flag==1) //若K1键被按下,则选择ds18b20工作
{
for(n=0;n <8;n++) 
WriteOneChar(id[n]);    //发送64 bit ID
}

WriteOneChar(0xbe); //发送指令开始读取温度
tempL=ReadOneChar(); //读取温度值低位
tempH=ReadOneChar(); //读取温度值高位
Init_DS18B20(); //再发送一次复位脉冲,终止温度的读取
temperature=((tempH*256)+tempL)*0.0625;   //转换成实际温度
}
else
return;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值