找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS18B20B20温度传感器源程序

[复制链接]
跳转到指定楼层
楼主
ID:170658 发表于 2017-5-4 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//程序适合单个DS18B20和MCS-51单片机的连接,晶振为12MHz
//测量的温度范围-55℃~+99℃,温度精确到小数点后一位

#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit  DQ =P1^0;                       //定义端口
sbit  RS=P1^7;
sbit  RW=P1^6;
sbit  EN=P1^5;
union{
    uchar c[2];
    uint x;
}temp;
uchar flag;//flag为温度值的正负号标志单元, "1"表示为负值,"0"时表示为正值。
uint cc,cc2;//变量cc中保存读出的温度值   
float cc1;
uchar buff1[13]={"temperature:"};
uchar buff2[6]={"+00.0"};
//检查忙函数
void  fbusy()
{
        P2 = 0xff;
        RS = 0;
        RW = 1;
        EN = 1;
        EN = 0;
        while((P2 & 0x80))
        {
        EN = 0;       
        EN = 1;               
        }
}
//写命令函数
void  wc51r(uchar  j)
{
    fbusy();
        EN = 0;
        RS = 0;
        RW = 0;
        EN = 1;
        P2 = j;
        EN = 0;
}
//写数据函数
void  wc51ddr(uchar  j)
{
        fbusy();                //读状态;
        EN = 0;
        RS = 1;
        RW = 0;
        EN = 1;
        P2 = j;
        EN = 0;
}
void  init()
{
wc51r(0x01);         //清屏
wc51r(0x38);         //使用8位数据,显示两行,使用5*7的字型
wc51r(0x0c);         //显示器开,光标开,字符不闪烁
wc51r(0x06);         //字符不动,光标自动右移一格
}
void delay(uint useconds)                       //延时程序
{
  for(;useconds>0;useconds--);
}
uchar ow_reset(void)                            //复位
{
  uchar presence;
  DQ = 0;                               // DQ 低电平
  delay(50);                                   // 480ms
  DQ = 1;                                      // DQ 高电平
  delay(3);                                    // 等待
  presence = DQ;                               // presence 信号
  delay(25);
  return(presence);                     // 0允许, 1禁止
}                                          
uchar read_byte(void)                                 //从单总线上读取一个字节
{
  uchar i;
  uchar value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ = 0;
    DQ = 1;
    delay(1);
    if(DQ)value|=0x80;
    delay(6);
  }
  return(value);
}
void write_byte(uchar val)             //向单总线上写一个字节
{
  uchar i;
  for (i=8; i>0; i--)                 // 一次写一字节
  {
    DQ = 0;
    DQ = val&0x01;
    delay(5);
    DQ = 1;
    val=val/2;
  }
  delay(5);
}

void Read_Temperature(void)          //读取温度
{
  ow_reset();
  write_byte(0xCC);                   // 跳过 ROM
  write_byte(0xBE);                          // 读
  temp.c[1]=read_byte();
  temp.c[0]=read_byte();
  ow_reset();
  write_byte(0xCC);
  write_byte(0x44);                          // 开始
  return;
}
void main()                             //主程序
{
uchar  k;
delay(10);
  EA=0;
  flag=0;
  init();
wc51r(0x80);                                   //写入显示缓冲区起始地址为第1行第1列
for (k=0;k<13;k++)                                //第一行显示提示信息"current temp is:"
        { wc51ddr(buff1[k]);}
while(1)
{
  delay(10000);
  Read_Temperature();                 //读取双字节温度
  cc=temp.c[0]*256.0+temp.c[1];
  if  (temp.c[0]>0xf8) {flag=1;cc=~cc+1;}else flag=0;
  cc1=cc*0.0625;                      //计算出温度值

  cc2=cc1*100;                                        //放大100倍,放在整型变量中便于取数字
  buff2[1]=cc2/1000+0x30;if ( buff2[1]==0x30) buff2[1]=0x20;//取出十位,转换成字符,如果十位是0不显示。
  buff2[2]=cc2/100-(cc2/1000)*10+0x30;//取出个位,转换成字符
  buff2[4]=cc2/10-(cc2/100)*10+0x30;//取出小数点后一位,转换成字符
  if (flag==1) buff2[0]='-';else buff2[0]='+';
  wc51r(0xc5);                  //写入显示缓冲区起始地址为第2行第6列      
  for (k=0;k<6;k++)                        //第二行显示温度
        { wc51ddr(buff2[k]);}
}
}

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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