打印

18B20终于成功了!大家一起分享一下

[复制链接]
3623|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
豪枭|  楼主 | 2007-1-26 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
/*********
*接口定义
*********/
sbit H_CS=P1^0  ;
sbit H_CLK=P1^1  ;
sbit H_DATA=P1^2 ;
sbit H_KEY=P1^3  ;
sbit DQ=P1^6;
/*********
*HD7279各指令定义
*********/
#define REST 0xa4              //复位
#define TEST 0xbf              //测试
#define RLC  0xa3              //循环左移
#define RRC  0xa2              //循环右移
#define RL   0xa1              //左移
#define RR   0xa0              //右移
#define DECODE0  0x80          //译码方式0
#define DECODE1  0xc8          //译码方式1
#define UNDECODE 0x90          //译码方式2,不译码
#define HIDE     0x98          //消隐
#define FLASH    0x88          //闪烁
#define SEGON    0xe0          //段亮
#define SEGOFF   0xc0          //段灭
#define READ     0x15          //读键盘
/*************
*函数声明
*************/
void Sdelay(void);                                  //短延时
void Ldelay(void);                                  //长延时
void delay10ms(unsigned t);                         //延时10MS
void sent_btye(unsigned char out_B);                //发送一个字节
receive_btye();             //接收一个字节
void write(unsigned char comd,unsigned char dat);   //发送一个命令
read();                                             //读键盘
delay15us(unsigned char n);
char init18b20(void);
void write18b20(unsigned ch);
unsigned int read18b20();
void extemp(void);
unsigned char readtemp();
void bm(void);
/*********
*子函数
*********/
void Sdelay(void)              //短延时
{ _nop_();_nop_();_nop_();_nop_();_nop_();
}
void Ldelay(void)              //长延时
{unsigned int i;
 for(i=0;i<10;i++)
 {Sdelay();}
}
void delay10ms(unsigned t)    //延时10*t ms程序
{unsigned int i,j;
 for(i=0;i<t;i++)
  {for(j=0;j<0x390;j++)
      {_nop_();}
  }
}
void sent_byte(unsigned char out_B)  //在7279中写入一个字节
{unsigned char i;
 H_CS=0;
 Ldelay();
 for(i=0;i<8;i++)
 {if(out_B&0x80){H_DATA=1;}
  else{H_DATA=0;}
  H_CLK=1;
  Sdelay();
  H_CLK=0;
  Sdelay();
  out_B=out_B<<1;
  }
  H_DATA=0;
}
receive_byte()     //接收一个来自7279的字节
{unsigned char i,in_B;
 H_DATA=1;
 Ldelay();
 for(i=0;i<8;i++)
 {H_CLK=1;
  Sdelay();
  in_B=in_B<<1;
  if(H_DATA)
   {in_B=in_B|0x01;
    H_CLK=0;
    Sdelay();
   }
   H_CLK=0;
   return(in_B);
  }
}
void write(unsigned char comd,unsigned char dat)  //在7279中写入指令
{sent_byte(comd);
 sent_byte(dat);
}
read()
{unsigned char key;
 if(!H_KEY)
 {sent_byte(READ);
  key=receive_byte();
  delay10ms(1);
  if(!H_KEY){return(key);}
   key=0xff;
   return(key);
 }
}
/**************
*定义变量
**************/
unsigned char data dat[4]={0x00,0x00,0x00,0x00};
unsigned char i,j,k,count,temp;
/************
18b20程序
************/

char init18b20(void)
{unsigned char x=0;
 DQ=1;
 _nop_();
 DQ=0;
 delay15us(36);  //延时480us
 DQ=1;
 delay15us(4);; //延时60us
 x=DQ;
 DQ=1;
 delay15us(18); //延时270us
}
/********
写数据18B20读写数据都从低位开始,而7279读写数据都是从高位开始
******/
void write18b20(unsigned char ch)
{unsigned char i;
 for(i=0;i<8;i++)
 {DQ=0;
  delay15us(1);    //首先将DQ拉低,并延时15us
  DQ=ch&0x01;      //从低8位开始写入
  ch=ch>>1;        //数据右移一位
  delay15us(4);    //写入数据后并延时45us以上
  DQ=1;
 }
}
/****************
读数据
***********/
unsigned int read18b20()
{unsigned char i;
 unsigned char ch=0;
 for(i=0;i<8;i++)
 {DQ=0;
  ch=ch>>1;
  DQ=1;
  delay15us(1);
  if(DQ==0) {ch=ch&0x7f; }
  else     {ch=ch|0x80; }
  delay15us(3);
  //DQ=1;
 }
 return(ch);
}
/*******
15us标准延时程序
*******/
delay15us(unsigned char n)
{  _nop_();
   for(;n>1;n--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
}

/******
*读温度函数
*必须用extemp()函数启动温度转换后750ms才能取得到温度
*******/
unsigned char readtemp()
{unsigned char t,x,y;
  init18b20();
  write18b20(0xCC);      //跳过skip rom
  write18b20(0x44);      //启动温度转换
  init18b20();
  write18b20(0xCC);      //跳过多路传感器识别 skip rom
  write18b20(0xBE);      //读暂存器,
  x=read18b20();         //返回读出温度值  16位补码形式
  y=read18b20();
  x=x>>4;
  y=y<<4;
  t=x|y;
  return t;
}
/*************************************
*** 显示温度函数
*************************************/
showtemp()
{ unsigned char t,x,y,z;
       t=readtemp();
       if(t>0)
             {x=t/10;
              t=t%10;
              y=t/1;
              z=t%1;
              write(DECODE0,0x00);
              write(DECODE0+1,x);
              write(DECODE0+2,0x80+y);
              write(DECODE0+3,z);
             }
      else   {t=~t;
              t=t+1;
              x=t/10;
              t=t%10;
              y=t/1;
              z=t%1;
              write(DECODE0,0x0a);
              write(DECODE0+1,x);
              write(DECODE0+2,0x80+y);
              write(DECODE0+3,z);
             }
}
main()
{
 unsigned char t,x,y,z;
  sent_byte(TEST);
  Sdelay();
  sent_byte(REST);
  Ldelay();
 while(1){
          showtemp();
         }
}

相关帖子

沙发
豪枭|  楼主 | 2007-1-27 13:53 | 只看该作者

程序说明

此程序是我用HD7279显示 温度传感器18B20程序 初学不久 请大家提供宝贵意见 

使用特权

评论回复
板凳
murphy.he| | 2007-1-27 17:21 | 只看该作者

支持,顶

使用特权

评论回复
地板
songfei002| | 2007-1-30 20:31 | 只看该作者

呵呵,恭喜楼主!

建议楼主把调试过程中的一些问题写出来,让大家欣赏一下,这样大家都有提高!

还有建议楼主再进一步把18B20的组网测量功能调试一下,这是象18B20这样的单线IC的优点!

使用特权

评论回复
5
ycc326| | 2007-1-30 20:39 | 只看该作者

顶,辛苦了!!!!

使用特权

评论回复
6
sillboy| | 2007-2-1 17:28 | 只看该作者

不错,学习

使用特权

评论回复
7
471908737| | 2007-4-3 11:08 | 只看该作者

18B20终于成功了!大家一起分享一下

先恭喜你了,祝你有更大的进步。

使用特权

评论回复
8
HJTJHJ| | 2007-4-4 08:00 | 只看该作者

固然卧虎藏龙

果然卧虎藏龙!!

使用特权

评论回复
9
ayb_ice| | 2007-4-4 08:27 | 只看该作者

单总线难吗

单总线难吗...

使用特权

评论回复
10
soso| | 2007-4-4 09:31 | 只看该作者

楼主的这一小步。好快就会来一大步!

恭喜。

使用特权

评论回复
11
caiping88| | 2007-4-4 11:38 | 只看该作者

厉害!

使用特权

评论回复
12
keaiduoyu| | 2007-4-4 12:04 | 只看该作者

恭喜楼主贺喜楼主

单总线的很方便啊,我也弄过,不过现在很多传感器都是OC输出,需加上拉电阻,我刚开始没加就怎么也弄不出来,不知道楼主有没有这经历

使用特权

评论回复
13
pandalove1| | 2007-4-5 22:23 | 只看该作者

厉害啊

使用特权

评论回复
14
iC921| | 2007-4-6 01:28 | 只看该作者

恭喜恭喜

如果能把调试过程中的问题与解决过程写出来,就太好了。

使用特权

评论回复
15
beyondzxc| | 2007-4-6 09:51 | 只看该作者

请教

这属于哪个范畴啊?是数字集成电路设计吗?原来c语言也能写啊,与vhdl语言相比哪个更好呢?

使用特权

评论回复
16
豪枭|  楼主 | 2007-5-29 06:54 | 只看该作者

回复15楼

好久没来了,看到这么多人回复我的贴子,谢谢你们支持我,我也是一个新手
回复15楼:这个是单片机范畴的,你那个VHDL语言是描述硬件的,没有可比性

使用特权

评论回复
17
豪枭|  楼主 | 2007-5-29 06:57 | 只看该作者

回复12楼

你说的那是集成的一些芯片和管子,使用他们时应该仔细阅读他们的DATASHEET与时序才能写好程序

使用特权

评论回复
18
豪枭|  楼主 | 2007-5-30 12:39 | 只看该作者

表情不对

抱歉,上面回复的表情错了

使用特权

评论回复
19
youyoujian| | 2007-7-4 14:06 | 只看该作者

恭喜恭喜啊

C语言不错啊!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

22

帖子

0

粉丝