找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

18b20測溫(求助)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:40490 發(fā)表于 2012-5-21 15:35 | 只看該作者 回帖獎勵(lì) |正序?yàn)g覽 |閱讀模式

我是利用定時(shí)器中斷來測溫的 程序如下

 #include "REG52.H"
#include "math.h"
#include <intrins.h>
sbit gewei=P2^0;
sbit shiwei=P2^1;
sbit baiwei=P2^2;
sbit qianwei=P2^3;
#define uint unsigned int
#define uchar unsigned char
uchar *p,id_buff[9];
 uchar temp_buff[9];
 uint  adcvalue;
   uchar  display_value[4]={0,0,0,0};
uchar  code gongyang[]={0xC0,0xF9,0xA4,0xB0,
                    0x99,0x92,0x82,0xF8,
                    0x80,0x90,0x88,0x83,
                    0xC6,0xA1,0x86,0x8E}; 


  
  #define FOSC 11059200
  #define SETTIME 1000
  #define BAUD 9600
  sbit ds18b20= P3^3;
  bit flag;
  uint Temperature;
    uint  counttimes;
 void SendData(char dat);
void delay_ms(int m);
void shumagua_test();
void Init18b20();
void TempDelay(uint us);
void  shumaguan_display();
void GemTemp();
void TemperatuerResult();
void ReadID();
void read_bytes();
void WriteByte();
uchar ReadByte();
void WriteByte();
void  timer_init();
void  inter_init();
void  timer0_inter();
void  serial_init();
void   mcu_init();
main()
{  mcu_init();
shumagua_test(); 
Init18b20();
 timer_init();
  serial_init();

 
  inter_init();
   delay_ms(10);
  
   p=id_buff;
   ReadID();
   while(1)
   {shumaguan_display();
   }
  }
 void Init18b20()
  {  ds18b20=1;
  _nop_();
  ds18b20=0;
 TempDelay(550);
  _nop_();
  ds18b20=1;
  TempDelay(120);
  _nop_();
  _nop_();
  _nop_();

  if(ds18b20==0)
 flag=1;
 else
 flag=0;
  TempDelay(550);
  _nop_();
  _nop_();
  ds18b20=1;
 
  } 
void delay_ms(int m)

{ unsigned int i,j;
for(i=0;i<m;i++)
 for(j=0;j<300;j++);
 }
void TempDelay (uint us)
{
  while(us--);
}

void shumagua_test()
{   gewei=0;
  shiwei=0;
  baiwei=0;
  qianwei=0;
  P0=0x00;
  delay_ms(500);
    gewei=1;
  shiwei=1;
  baiwei=1;
  qianwei=1;
  P0=0xff;
  delay_ms(500);
  

}
/************************************************************
*Function:向18B20寫入一個(gè)字節(jié)
*************************************************************/
void WriteByte (uchar wr)  //單字節(jié)寫入
{
 uchar i;
 for (i=0;i<8;i++)
 {
  ds18b20 = 0;
  _nop_();
 ds18b20=wr&0x01;
  TempDelay(5);   //delay 45 uS //5   TempDelay(2);//
  _nop_();
  _nop_();
  ds18b20=1;
  wr >>= 1;
 }
}
/************************************************************
*Function:讀18B20的一個(gè)字節(jié)
*************************************************************/
uchar ReadByte (void)     //讀取單字節(jié)
{
 uchar i,u=0;
 for(i=0;i<8;i++)
 {
  ds18b20 = 0;
  u >>= 1;
  ds18b20 = 1;
  if(ds18b20==1)
  u |= 0x80;
  TempDelay (4);  // TempDelay(2);//
  _nop_();
 }
 return(u);
}
/************************************************************
*Function:讀18B20 多字節(jié)讀
*************************************************************/
void read_bytes (uchar j)
{
 uchar i;
 for(i=0;i<j;i++)
 {
  *p = ReadByte();
  p++;
 }
}

/************************************************************
*Function:讀取溫度
*************************************************************/
void GemTemp (void)
{
 unsigned char temp1;
 read_bytes (2);      // 讀取scratchpad中的值

 temp1 = (temp_buff[0]>>4)&0x0f;  // 舍去小數(shù)點(diǎn)
 if((temp_buff[0]&0x08)==0x08)  // 四舍五入
  temp1 += 1;
 temp1 = ((temp_buff[1]<<4)&0x70)|temp1;
 Temperature = temp1;
 TempDelay(1);
}

/************************************************************
*Function:讀18B20ID
*************************************************************/
void ReadID (void)//讀取器件 id
{
 Init18b20();
 WriteByte(0x33);  //read rom
 read_bytes(8);
}
/************************************************************
*Function:18B20 測溫處理
*************************************************************/
void TemperatuerResult(void)
{
 Init18b20 ();
 WriteByte(0xcc);   //skip rom
 WriteByte(0x44);   //溫度轉(zhuǎn)換指令
 TempDelay(6000);

 Init18b20 ();
 WriteByte(0xcc);   //skip rom
 WriteByte(0xbe);   //讀取溫度指令, 即讀 scratchpad
 p = temp_buff;
 GemTemp();
}
void  shumaguan_display(void)
{
  P0=gongyang[display_value[3]];
  gewei=0;
 delay_ms(1);
  gewei=1;

  P0=gongyang[display_value[2]];
  shiwei=0;
delay_ms(1);
  shiwei=1;

  P0=gongyang[display_value[1]];
  baiwei=0;
  delay_ms(1);
  baiwei=1;

  P0=gongyang[display_value[0]]&0x7f;   //0111 1111
  qianwei=0;
 
delay_ms(1);
  P0=0xff;
}
  void  timer_init()      //定時(shí)器初始化
{
  TMOD=TMOD&0xf0|0x01;
  TL0= 0;
  TH0= 0;
  TR0=1;

  TMOD=TMOD&0x0f|0x20;
  TL1=TH1=0;
  TR1=1;
}
void  inter_init()    //中斷初始化
{
 
  ET0=1;
  ES=1;
  EA=1;

}
void  timer0_inter()  interrupt 1    //定時(shí)器0中斷函數(shù)
{
   TL0= 0;
   TH0= 0;

   counttimes++;
 
  if((counttimes%10)==0)
    {
      // keyvalue=keypad();
  //   adcvalue=getadcvalue(0);
  //   adcvalue=adcvalue*4.883;
   TemperatuerResult();
   Temperature=Temperature*0.0625;
     adcvalue=Temperature*10;
     display_value[0]=adcvalue/1000;
     display_value[1]=(adcvalue%1000)/100;
   display_value[2]=(adcvalue%1000%100)/10;
   display_value[3]=(adcvalue%1000%100)%10;

    }

  if((counttimes%100)==0)
    { 

     SendData(display_value[0]+0x30);
     SendData(0x2e);
     SendData(display_value[1]+0x30);
     SendData(display_value[2]+0x30);
     SendData(display_value[3]+0x30);
     counttimes=0;
    }

  if((counttimes%1000)==0)
     {

     }

}
void  serial_init()
{
   SCON=0X50;
   PCON=0X00;
  
//   AUXR=AUXR|0x40; 
   delay_ms(10);
}
   void SendData(char dat)
{  
    SBUF = dat;                     //Send current data
    while (!TI)
     {
      ;
     }                     //Wait for the previous data is sent
    TI = 0;                         //Clear TI flag
}
void   mcu_init(void)
{
  P0=0xff;
  P1=0xff;
  P2=0xff;
  P3=0xff; 
  //pwmadc=0;
 // P4SW=0xff;
//  P4=0xff;
}

 

 

 

 

 

 

 

 

 

 

 

 

 


 

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

使用道具 舉報(bào)

板凳
ID:89347 發(fā)表于 2015-9-4 08:09 | 只看該作者
本帖最后由 51控 于 2015-9-4 08:16 編輯

   /*************************此部分為18B20的驅(qū)動程序*************************************/  #include <reg52.H> #include <intrins.h>  sbit    D18B20=P3^7; #define  NOP()   _nop_()   /* 定義空指令 */ #define  _Nop()  _nop_()   /*定義空指令*/  void TempDelay (unsigned char idata us); void Init18b20 (void); void WriteByte (unsigned char idata wr);  //單字節(jié)寫入 void read_bytes (unsigned char idata j); unsigned char CRC (unsigned char j); void GemTemp (void); void Config18b20 (void); void ReadID (void); void TemperatuerResult(void);   bit  flag; unsigned int  idata Temperature; unsigned char idata temp_buff[9]; //存儲讀取的字節(jié),read scratchpad為9字節(jié),read rom ID為8字節(jié) unsigned char idata id_buff[8]; unsigned char idata *p,TIM; unsigned char idata crc_data;   unsigned char code CrcTable [256]={ 0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65, 157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220, 35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98, 190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255, 70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7, 219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154, 101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36, 248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185, 140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205, 17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80, 175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238, 50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115, 202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139, 87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22, 233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168, 116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53};  // /************************************************************ *Function:延時(shí)處理 *parameter: *Return: *Modify: *************************************************************/ void TempDelay (unsigned char idata us) {         while(us--); }  /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) {         
D18B20=1;         
_nop_();         
D18B20=0;        
TempDelay(80);   //delay 530 uS//80         
_nop_();        
D18B20=1;         
TempDelay(14);   //delay 100 uS//14         
_nop_();      
_nop_();      
  _nop_();               
  if(D18B20==0)               
  flag = 1;   //detect 1820 success!        
else                 
flag = 0;    //detect 1820 fail!         
TempDelay(20);       //20         
_nop_();         
_nop_();        
D18B20 = 1; }  /************************************************************ *Function:向18B20寫入一個(gè)字節(jié) *parameter: *Return: *Modify: *************************************************************/
void WriteByte (unsigned char idata wr)  //單字節(jié)寫入
{        
unsigned char idata i;        
for (i=0;i<8;i++)      
  {                 
D18B20 = 0;               
_nop_();                 
D18B20=wr&0x01;                 
TempDelay(3);   //delay 45 uS //5               
_nop_();               
_nop_();               
D18B20=1;               
  wr >>= 1;        
}
}  /************************************************************ *Function:讀18B20的一個(gè)字節(jié) *parameter: *Return: *Modify: *************************************************************/
unsigned char ReadByte (void)     //讀取單字節(jié)
{        
unsigned char idata i,u=0;      
  for(i=0;i<8;i++)        
{               
D18B20 = 0;               
u >>= 1;                 
D18B20 = 1;               
  if(D18B20==1)               
u |= 0x80;                 
TempDelay (2);                 
_nop_();        
}         
return(u);
}  /************************************************************ *Function:讀18B20 *parameter: *Return: *Modify: *************************************************************/
void read_bytes (unsigned char idata j) {         
unsigned char idata i;         
for(i=0;i<j;i++)         
{                  
*p = ReadByte();                  
p++;         
}
}  /************************************************************ *Function:CRC校驗(yàn) *parameter: *Return: *Modify: *************************************************************/
unsigned char CRC (unsigned char j)
{            
unsigned char idata i,crc_data=0;         
  for(i=0;i<j;i++)  //查表校驗(yàn)            
crc_data = CrcTable[crc_data^temp_buff];     
return (crc_data);
}  /************************************************************ *Function:讀取溫度 *parameter: *Return: *Modify: *************************************************************/
void GemTemp (void) {    read_bytes (9);   
if (CRC(9)==0) //校驗(yàn)正確   
{            
Temperature = temp_buff[1]*0x100 + temp_buff[0]; //            
Temperature *= 0.625;                 
Temperature /= 16;                 
TempDelay(1);     
}
}  /************************************************************ *Function:內(nèi)部配置 *parameter: *Return: *Modify: *************************************************************/
void Config18b20 (void)  //重新配置報(bào)警限定值和分辨率
{     
Init18b20();      
WriteByte(0xcc);  //skip rom      
WriteByte(0x4e);  //write scratchpad      
WriteByte(0x19);  //上限      
WriteByte(0x1a);  //下限      
WriteByte(0x7f);     //set 12 bit (0.125)      
Init18b20();      
WriteByte(0xcc);  //skip rom      
WriteByte(0x48);  //保存設(shè)定值     
Init18b20();      WriteByte(0xcc);  //skip rom      
WriteByte(0xb8);  //回調(diào)設(shè)定值 }  /************************************************************ *Function:讀18B20ID *parameter: *Return: *Modify: *************************************************************/
void ReadID (void)//讀取器件 id
{         
Init18b20();         
WriteByte(0x33);  //read rom        
read_bytes(8);
}  /************************************************************ *Function:18B20ID全處理 *parameter: *Return: *Modify: *************************************************************/
void TemperatuerResult(void)
{         
p = id_buff;           
ReadID();           
Config18b20();         
Init18b20 ();      
  WriteByte(0xcc);   //skip rom         
WriteByte(0x44);   //Temperature convert         
Init18b20 ();         
WriteByte(0xcc);   //skip rom         
WriteByte(0xbe);   //read Temperature         
p = temp_buff;         
GemTemp();
}   
void GetTemp()
{            
if(TIM==100) //每隔 1000ms 讀取溫度        
{  
TIM=0;            
TemperatuerResult();      
  }  
}  /*************************************  [ t1 (10ms)中斷] 中斷 *************************************/
void T1zd(void) interrupt 3
{   
TH1 = 0xD8;    //10   
TL1 = 0xF0;   
TIM++;  
}
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:89258 發(fā)表于 2015-9-2 12:26 | 只看該作者
好吧納尼
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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