在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 4077|回复: 10

初学1wire ds18b20!有些问题想问下!

[复制链接]
发表于 2008-12-8 19:12:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我刚刚从网络上下载的一些程序!有人可以帮我解释下其中些参数的含义吗?一开始的com1 com2 com3什么的还有后来的abcdefg具体指的什么意思!
#include
#include


void delay(unsigned int t);


unsigned char DisBuff[4];
unsigned char COM;  

sbit COM1=P2^7;           //定义通信端口                 
sbit COM2=P2^4;
sbit COM3=P2^5;
sbit COM4=P2^6;
sbit   DQ=P3^7;   


#define        a 0x04                  //  AAAA
#define        b 0x01                                        // F    B
#define        c 0x10                                        // F    B
#define        d 0x40                                        //  GGGG
#define        e 0x80                                        // E    C
#define        f 0x02                                        // E    C
#define g 0x08                                        //  DDDD    H
#define        h 0x20                          

unsigned char code LED_table[]={
a+b+c+d+e+f,                                   //"0"
b+c,                                                   //"1"
a+b+d+e+g,                                           //"2"
a+b+c+d+g,                                           //"3"
b+c+f+g,                                           //"4"
a+c+d+f+g,                                           //"5"
a+c+d+e+f+g,                                   //"6"
a+b+c,                                                   //"7"
a+b+c+d+e+f+g,                                   //"8"
a+b+c+d+f+g,                                   //"9"
b+c+e+f+g,                                           //"H"
a+f+e+g,                                           //"C"
d+e+f,                                                   //"L"
g,                                                           //"-"
0x00                                                   //black
};

#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g

#define SP 14                                                                        
/********************************************************/
/*                             初始化系统                                                */
/********************************************************/
void Sys_Init()                        
{
  TMOD=0x01;
  TH0=(65536-1000)/256;                 //1ms
  TL0=(65536-1000)%256;  
  EA=1;
  ET0=1;
  TR0=1;
}

/*********************************************************/
/*                          初始化DS18B20                                                 */
/*********************************************************/  
void Init_DS18B20(void)                //初始化函数
{
  unsigned char x=0;
  DQ = 1;         //DQ复位
  delay(8);       //稍做延时
  DQ = 0;         //pull DQ line low
  delay(80);      //leave it low for 480~960us
  DQ = 1;         //allow line to return high
  delay(14);          //wait for presence 15~60us
  x=DQ;           //稍做延时后 如果x=0则初始化成功
  delay(20);          //                           x=1则初始化失败
}
/*********************************************************/
/*                            读一个字节                                                 */
/*********************************************************/  
unsigned char Read_byte(void)
{
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 Write_byte(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;                   //取数据最低位
  delay(5);
  DQ = 1;
  dat>>=1;
}
delay(4);
}

/*********************************************************/
/*                                读取温度                                            */
/*********************************************************/
ReadTemperature(void)                                 
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;

Init_DS18B20();

Write_byte(0xCC); // 跳过读序号列号的动作  因为只有一个器件
Write_byte(0x44); // 启动温度转换

Init_DS18B20();

Write_byte(0xCC); //跳过读序号列号的动作
Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=Read_byte();    //读取温度值低位
b=Read_byte();    //读取温度值高位
//a=a>>4;         //低位右移4位,舍弃小数部分
//b=b<<4;         //高位左移4位,舍弃符号位
//t=b|a;
//return(t);
return((b*256+a)*10/16); //        b*256+a  把两个8位温度变成16位
}                                                 // *10      扩大10倍从而保留小数位
                                                 // /16      把18b20的输出换算成实际温度,
                                                 //          显示时的小数点视情况而定

/*********************************************************/
/*                                温度显示函数                                    */
/*********************************************************/
void DisplayNumber(unsigned int Num)         
{
        unsigned char i;
        EA=0;
        for(i=0;i<4;i++)
        {
        DisBuff=Num%10;
        Num/=10;
        }
/*          if(DisBuff[3]==0)
          {
             DisBuff[3]=0xff;         
             if(DisBuff[2]==0)
              {
                DisBuff[2]=0xff;         
                if(DisBuff[1]==0)
                          DisBuff[1]=0xff;
              }
          }          */
for(i=3;i>=0;i--)                                                    //消隐无效"0"
   {
         if(DisBuff==0) DisBuff=SP;
         else break;
   }
           delay(100);         
        EA=1;

}  
/*********************************************************/
/*                              数码管扫描选通                                        */
/*********************************************************/
void Display_Scan() interrupt 1               //中断1触发时,就会指向该函数执行
{                                                                            //并且保留现场,该函数完成后,回到入口,
TR0=0;                                                                   //从原现场继续执行,等待下次中断发生
  TH0=(65536-1000)/256;                                   //1ms
  TL0=(65536-1000)%256;   
TR0=1;
         
        if(COM>3) COM=0;
        COM1=1;COM2=1;COM3=1;COM4=1;
    switch(COM)
    {
        case 0:        P0=LED_table[DisBuff[0]]; COM1=0; break;
    case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break;         //在数码管第二位上点亮小数点
        case 2:        P0=LED_table[DisBuff[2]]; COM3=0; break;
        case 3:        P0=LED_table[DisBuff[3]]; COM4=0; break;
    }
        COM++;                                          
}

/*********************************************************/
/*                                 延时子程序                                            */
/*********************************************************/
void delay(unsigned int i)
{
     while(i--);
     
}
/*********************************************************/
/*                                 主函数                                              */
/*********************************************************/
void main(void)
{
   unsigned int temp;
   Sys_Init();
   while(1)                         //死循环
   {
    temp=ReadTemperature();
    DisplayNumber(temp);
   }
}
发表于 2008-12-9 12:11:32 | 显示全部楼层
要对应18B20的数据手册来看就明白了。
发表于 2009-3-22 13:57:19 | 显示全部楼层
中文资料 自己看

DS18B20资料.pdf

431.84 KB, 下载次数: 21 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2009-3-22 21:20:09 | 显示全部楼层

给一个汇编的代码

上传一个汇编的代码,希望对大家有用。

DS18B20.rar

2.98 KB, 下载次数: 0 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2012-2-10 21:45:18 | 显示全部楼层
谢谢啦!
发表于 2012-2-12 15:37:15 | 显示全部楼层
学习了
发表于 2012-12-14 20:38:31 | 显示全部楼层
kankan
发表于 2015-5-20 11:00:40 | 显示全部楼层
感谢分享资料 !!! 谢谢。
发表于 2015-8-19 20:35:54 | 显示全部楼层
对方是个办法是大哥大哥大帅哥
发表于 2015-9-10 07:16:06 | 显示全部楼层
找一个18b20datasheet 看一下,对应时序图看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-18 23:59 , Processed in 0.072987 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表