找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2874|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

DS18B20B20溫度傳感器源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:170658 發(fā)表于 2017-5-4 10:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//程序適合單個DS18B20和MCS-51單片機(jī)的連接,晶振為12MHz
//測量的溫度范圍-55℃~+99℃,溫度精確到小數(shù)點后一位

#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為溫度值的正負(fù)號標(biāo)志單元, "1"表示為負(fù)值,"0"時表示為正值。
uint cc,cc2;//變量cc中保存讀出的溫度值   
float cc1;
uchar buff1[13]={"temperature:"};
uchar buff2[6]={"+00.0"};
//檢查忙函數(shù)
void  fbusy()
{
        P2 = 0xff;
        RS = 0;
        RW = 1;
        EN = 1;
        EN = 0;
        while((P2 & 0x80))
        {
        EN = 0;       
        EN = 1;               
        }
}
//寫命令函數(shù)
void  wc51r(uchar  j)
{
    fbusy();
        EN = 0;
        RS = 0;
        RW = 0;
        EN = 1;
        P2 = j;
        EN = 0;
}
//寫數(shù)據(jù)函數(shù)
void  wc51ddr(uchar  j)
{
        fbusy();                //讀狀態(tài);
        EN = 0;
        RS = 1;
        RW = 0;
        EN = 1;
        P2 = j;
        EN = 0;
}
void  init()
{
wc51r(0x01);         //清屏
wc51r(0x38);         //使用8位數(shù)據(jù),顯示兩行,使用5*7的字型
wc51r(0x0c);         //顯示器開,光標(biāo)開,字符不閃爍
wc51r(0x06);         //字符不動,光標(biāo)自動右移一格
}
void delay(uint useconds)                       //延時程序
{
  for(;useconds>0;useconds--);
}
uchar ow_reset(void)                            //復(fù)位
{
  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)                                 //從單總線上讀取一個字節(jié)
{
  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)             //向單總線上寫一個字節(jié)
{
  uchar i;
  for (i=8; i>0; i--)                 // 一次寫一字節(jié)
  {
    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);                                   //寫入顯示緩沖區(qū)起始地址為第1行第1列
for (k=0;k<13;k++)                                //第一行顯示提示信息"current temp is:"
        { wc51ddr(buff1[k]);}
while(1)
{
  delay(10000);
  Read_Temperature();                 //讀取雙字節(jié)溫度
  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倍,放在整型變量中便于取數(shù)字
  buff2[1]=cc2/1000+0x30;if ( buff2[1]==0x30) buff2[1]=0x20;//取出十位,轉(zhuǎn)換成字符,如果十位是0不顯示。
  buff2[2]=cc2/100-(cc2/1000)*10+0x30;//取出個位,轉(zhuǎn)換成字符
  buff2[4]=cc2/10-(cc2/100)*10+0x30;//取出小數(shù)點后一位,轉(zhuǎn)換成字符
  if (flag==1) buff2[0]='-';else buff2[0]='+';
  wc51r(0xc5);                  //寫入顯示緩沖區(qū)起始地址為第2行第6列      
  for (k=0;k<6;k++)                        //第二行顯示溫度
        { wc51ddr(buff2[k]);}
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表