找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6383|回復: 5
收起左側(cè)

18b20溫度顯示

  [復制鏈接]
ID:73477 發(fā)表于 2015-2-10 21:52 | 顯示全部樓層 |閱讀模式
網(wǎng)上看到的18b20溫度顯示,特此收集供大家學習交流一下。


下面是源程序:
/*****************************************************************
*程序名稱:18b20數(shù)碼管顯示溫度            
*程序功能:   顯示實時溫度監(jiān)測,帶上位機     
*端口定義: DQ -P1^7   
*編寫:muye414  
*修改:
*修改何處:   
*****************************************************************/
#include <reg52.h>
#include <string.h>
#include <stdio.h>

#define XTAL 11059200    // CUP 晶振頻率
#define baudrate 9600    // 通信波特率
#define uchar unsigned char
#define uint unsigned int
#define duan P0  //數(shù)碼管顯示的段選
#define wei  P2   //數(shù)碼管顯示的位選

/*********************函數(shù)聲明************************/
void Send_Byte(uchar);
void Send_Str(char);
void send_char(void);
/*********************函數(shù)聲明結(jié)束********************/
sbit DQ = P1^7;   // 定義DS18B20端口DQ
sbit BEEP = P3^7; //蜂鳴器端口定義
bit sendtempflag=0;
uchar presence ;
float f_temp;
uint temp;

uchar code  LEDData1[ ]={0x40,0x79,0x24,0x30,0x19,0x12,
       0x02,0x78,0x00,0x10,0xff};//帶小數(shù)點的共陽數(shù)碼管"0-9"段碼數(shù)字
uchar code  LEDData[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
                     0x82,0xF8,0x80,0x90,0xff};//共陽數(shù)碼管段碼
uchar code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                         0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//溫度的小數(shù)位
uchar data  temp_data[2] = {0x00,0x00};
uchar data  display[5] ={0x00,0x00,0x00,0x00,0x00};
void beep();

bit  flash=0;    // 顯示開關(guān)標記
bit  flag_zf=0;   // 正負溫度標志
/**********************************************************/
void Delay(unsigned int num)// 延時函數(shù)
{
   while( --num );
}
/*********************************************************

********************以下為1820相關(guān)函數(shù)*******************

/*********************************************************/
uchar Init_DS18B20(void) // 初始化ds1820
{
  
  DQ = 1;      // DQ復位
  Delay(8);    // 稍做延時
  DQ = 0;      // 單片機將DQ拉低
  Delay(90);   // 精確延時 大于 480us
  DQ = 1;       // 拉高總線
  Delay(8);
  presence = DQ;    // 如果=0則初始化成功 =1則初始化失敗
  Delay(100);
  DQ = 1;
     
     return(presence); // 返回信號,0=presence,1= no presence
}

/**********************************************************/
uchar ReadOneChar(void) // 讀一個字節(jié)
{
unsigned char i = 0;
unsigned char dat = 0;
for (i = 8; i > 0; i--)
    {
DQ = 0; // 給脈沖信號
dat >>= 1;
DQ = 1; // 給脈沖信號
     if(DQ)
     dat |= 0x80;
     Delay(4);
    }
     return (dat);
}
/**********************************************************/
void WriteOneChar(unsigned char dat)// 寫一個字節(jié)
{
  unsigned char i = 0;
  for (i = 8; i > 0; i--)
    {
   DQ = 0;
   DQ = dat&0x01;
   Delay(5);
   DQ = 1;
   dat>>=1;
    }
}
/*********************************************************/
Read_Temperature(void)// 讀取溫度
{
   uchar a,b;
   Init_DS18B20();
   if(presence==1)        
    {
     beep();Delay(25000);
     flash=1;
  }                        // DS18B20不正常,蜂鳴器報警
else
    {
  flash=0;
WriteOneChar(0xCC);  // 跳過讀序號列號的操作
WriteOneChar(0x44);  // 啟動溫度轉(zhuǎn)換
Init_DS18B20();
WriteOneChar(0xCC);  // 跳過讀序號列號的操作
WriteOneChar(0xBE);  // 讀取溫度寄存器
a = ReadOneChar();   // 溫度低8位
b = ReadOneChar();   // 溫度高8位
temp_data[0]=a;
temp_data[1]=b;
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;//后面小數(shù)取一位,并四舍五入
f_temp=f_temp+0.05;
return temp;
    }
}
/*********************************************************/
void Disp_Temperature()// 顯示溫度
{
  unsigned char  n=0;
  if(temp_data[1]>7)                  //當溫度高八位中的高五位全為O
  { flag_zf=1;                     // 所測溫度為負時,要進行轉(zhuǎn)換
temp_data[1]=!( temp_data[1]);
  temp_data[0]=!( temp_data[0]);
temp_data[0]= temp_data[0]+1;
if(temp_data[0]==0)
  { temp_data[1]= temp_data[1]+1;}
  }
else
  {flag_zf=0;}  //判斷測得的溫度數(shù)據(jù)是正還是負,如果為正,不做任何處理

display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];     // 查表得小數(shù)位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;//百位
display[1]=display[4]%100;//存儲十位和個位
display[2]=display[1]/10;//十位
display[1]=display[1]%10;//個位

if(flag_zf==1)
{duan=0xbf;//"-"
wei=0x02;
Delay(100);}      //溫度為負數(shù)時第二個數(shù)碼管顯示負號
if(!display[3])          // 高位為0,不顯示
   {
    display[3]=0x0a;              
    if(!display[2])      // 次高位為0,不顯示
    display[2]=0x0a;
    }
  duan = 0xc6;    // 顯示 C
  wei = 0xfe;    // 位選線為P2.7口,LED為共陽極顯示,當位選線為低電平時選通
  Delay(100);

  duan = 0x9c;    // 顯示 °  
  wei = 0xfd;   // 選中P2.6口
  Delay(100);

  duan = 0x7F; //在個位上顯示小數(shù)點"."
  wei = 0xf7;  //位選
  Delay(100);

  duan =LEDData[display[0]] ;  // 顯示小數(shù)位
  wei = 0xfb;      //p2.5
  Delay(100);
  
  duan =LEDData[display[1]];  // 顯示個位
  wei = 0xf7;
  Delay(100);

  duan =LEDData[display[2]];  // 顯示十位
  wei = 0xef;      
  Delay(100);

  duan =LEDData[display[3]];  // 顯示百位
  wei = 0xdf;
  Delay(100);

  wei = 0xff;                // 關(guān)閉顯示
}
/*********************************************************

******************1820相關(guān)函數(shù)到此結(jié)束*******************

/*********************************************************/
void beep(void)
{
    unsigned char i;
    for (i=0;i<100;i++)
    {
       Delay(120);
       BEEP=!BEEP;                // BEEP取反
    }
    BEEP=1;                        // 關(guān)閉蜂鳴器


}
/*********************************************************

********************以下為初始化函數(shù)*********************

/*********************************************************/
void Init(void)
{
  
TMOD = 0x20;   // 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率

// TH1=(uchar)(256 - (XTAL / (32L * 12L * baudrate)));
// TL1=(uchar)(256 - (XTAL / (32L * 12L * baudrate)));   // 定時器1賦初值

TH1=0xfd;   //Baud:9600 fosc="11.0592"MHz
TL1=0xfd;
SCON = 0x50;   // 設(shè)定串行口工作方式- 模式 1, 8-bit UART, 使能接收
     //串口設(shè)置為方式1,REN=1,允許接收

PCON &= 0x00;   // 波特率不倍增
// ES=1;   //打開串口中斷
TR1 = 1;    // 啟動定時器1
// EA  = 1;     // "中斷總允許"
// IE = 0x00;    // 禁止任何中斷
}
/*********************************************************

********************以下為串口相關(guān)函數(shù)*******************

/*********************************************************/
void sendchar(char *ch)
{
do{
  SBUF=*ch++;//發(fā)送數(shù)據(jù)
  while(!TI);//等待發(fā)送完畢,標志置1
  TI=0; //標志清零
   }
while(*ch);//循環(huán)直至發(fā)送完畢
}


/*********************************************************

*************************主函數(shù)**************************

/*********************************************************/
void main()
{
   uchar buff[4];
   Init();

   while(1)
   {
      Read_Temperature();    // 讀取溫度
   if (flash==0)            
   {
  sprintf(buff,"%f",f_temp);//將浮點溫度格式化為字符型
  Disp_Temperature();   // 顯示溫度
     sendchar(buff);       // 傳送采集的溫度
   }
     else
    {
     wei = 0x00 ;    // DS18B20不正常,關(guān)閉顯示
    }



   }
}




回復

使用道具 舉報

ID:19947 發(fā)表于 2015-8-9 23:52 | 顯示全部樓層
謝謝樓主分享!
回復

使用道具 舉報

ID:4150 發(fā)表于 2017-4-6 09:02 | 顯示全部樓層
好的,謝謝樓主
回復

使用道具 舉報

ID:185866 發(fā)表于 2017-4-6 17:26 | 顯示全部樓層
我是小白,有電路圖的話就更好了
回復

使用道具 舉報

ID:186673 發(fā)表于 2017-4-6 18:38 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:353247 發(fā)表于 2018-6-17 15:03 | 顯示全部樓層
沒有電路圖嗎?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表