51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
温度传感器18B20驱动程序(C语言)
发布时间:2009/6/2  阅读次数:1198  字体大小: 【】 【】【

作者:佚名    来源:不详

/************************************************************
*18B20驱动程序,DQ为数据口,接于P2.1
*11.0592M晶振,上拉4.7k电阻
*Author:fyb
*2005-3-25 11:23,OK!
*************************************************************/
#i nclude
#i nclude

#define uchar unsigned char
#define uint   unsigned int

sbit dq = P1^7;
bit   flag;
uint Temperature;
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar id_buff[8];
uchar *p;
uchar crc_data;
uchar 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:延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TempDelay (uchar us)
{
    while(us--);
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{
  dq=1;
  _nop_();
  dq=0;
  TempDelay(86);     //delay 530 uS//80
  _nop_();
  dq=1;
  TempDelay(14);     //delay 100 uS//14
  _nop_();
  _nop_();
  _nop_();
  
  if(dq==0)
    flag = 1;     //detect 1820 success!
  else
    flag = 0;       //detect 1820 fail!
  TempDelay(20);             //20
  _nop_();
  _nop_();
  dq = 1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr)   //单字节写入
{
  uchar i;
  for (i=0;i<8;i++)
  {
    dq = 0;
    _nop_();
    dq=wr&0x01;
    TempDelay(5);     //delay 45 uS //5
    _nop_();
    _nop_();
    dq=1;
    wr >>= 1;
  }
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
uchar ReadByte (void)         //读取单字节
{
  uchar i,u=0;
  for(i=0;i<8;i++)
  {
    dq = 0;
    u >>= 1;
    dq = 1;
    if(dq==1)
    u |= 0x80;
    TempDelay (4);
    _nop_();
  }
  return(u);
}
/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes (uchar j)
{
   uchar i;
   for(i=0;i   {
       *p = ReadByte();
       p++;
   }
}
/************************************************************
*Function:CRC校验
*parameter:
*Return:
*Modify:
*************************************************************/
uchar CRC (uchar j)
{
       uchar i,crc_data=0;
     for(i=0;i         crc_data = CrcTable[crc_data^temp_buff[i]];
       return (crc_data);
}
/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp (void)
{
     read_bytes (9);
     if (CRC(9)==0) //校验正确
     {
         Temperature = temp_buff[1]*0x100 + temp_buff[0];
//         Temperature *= 0.625;
    Temperature /= 16;
    TempDelay(1);
       }
}
/************************************************************
*Function:内部配置
*parameter:
*Return:
*Modify:
*************************************************************/
void Config18b20 (void)   //重新配置报警限定值和分辨率
{
         Init18b20();
         WriteByte(0xcc);   //skip rom
         WriteByte(0x4e);   //write scratchpad
         WriteByte(0x19);   //上限
         WriteByte(0x1a);   //下限
         WriteByte(0x7f);         //set 11 bit (0.125)
         Init18b20();
         WriteByte(0xcc);   //skip rom
         WriteByte(0x48);   //保存设定值
         Init18b20();
         WriteByte(0xcc);   //skip rom
         WriteByte(0xb8);   //回调设定值
}
/************************************************************
*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();
}

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号