原创 基于EDN51的DS1820测试程序

2007-12-3 17:56 2895 8 11 分类: MCU/ 嵌入式

压缩包上传不上来,先把源码贴上来,明天在传压缩包,源码中关于lcd1602的部分需要替换成自己写的,呵呵


 


/*******************************************************************/
//模 块 名: DS18B20驱动
//创 建 者: 好心情
//修 改 者:
//功能描述: DS18B20驱动
//其他说明: 51上运行通过,晶振12M
//版    本: V1.0
//日    期:  2007-12-3
/*******************************************************************/
# include "lcd1602-4bit1.H" 
# include <reg51.h>
# include <intrins.h>
# define unchar unsigned char


/****************************接口定义*******************************/
sbit ds1820_dq = P1^6;


/**************************全局变量定义*****************************/
bit flag;   // 标志位


unsigned char data  temp_data[2] = {0x00,0x00} ;  // 保存读取到的数值
unsigned char data  display_date[5] =   {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
/****************************函数声明*******************************/
void delay_us(unchar delay); // 延时us级
unchar ds1820_read(void);  //读时序
void ds1820_write(unchar dat);  //写
void ds1820_init(void);   // 初始化,返回一个bit值,0表示器件
        //存在且ok,1不存在,或损坏



/********************************************************************
*DS1820初始化(通过存在脉冲可以判断DS1820是否损坏)
*函数名称:ds1820_init(void)
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在,复位脉冲最
*少480us,最大960us.总线释放后延时15-60us1820产生60-240us的应答脉冲
********************************************************************/
void ds1820_init(void)
{
    // 复位脉冲 
 ds1820_dq = 1;  //将总线拉高,准备复位 
 ds1820_dq = 0;  //复位
 delay_us(100);  //延时>480us,这里取520us
 ds1820_dq = 1;  //释放总线,进入接收状态
 // 读应答信号
 delay_us(11);  //延时100us
 flag = ds1820_dq;  
 ds1820_dq = 1;  //释放总线*/    
}


/********************************************************************
*读时序(分为读0和读1)
*函数名称:ds1820_read(void)
*说明:主机将总线拉低后,15us内就要释放总线,好让1820将数据送到总线上,完
*成一个读过程至少需要60us;
********************************************************************/
unchar ds1820_read(void)
{
  unchar dat,i ;
  for(i=8;i>0;i--)
  {      
   ds1820_dq = 0; //给脉冲
   dat>>=1;  //右移1位,如果未读到1,右移一位相当与读0,同时用该指令延时
   ds1820_dq = 1; //15us内释放总线 
  
   if(ds1820_dq) //读1
   {
    dat|=0x80; //先读出低位值,将其写入dat最高位
   }
   delay_us(10); //延时60us,完成一个读过程,至少要60us    
   }
   return dat;  //返回结果
}


/********************************************************************
*写时序(分为写0和写1)
*函数名称:ds1820_write(unchar dat)
*说明:先写低位值,利用dat&0x01取出最低位的值,如果是1,执行写1操作,否则
*写0;写完之后将dat中的数值右移一位
********************************************************************/
void ds1820_write(unchar dat)
{
 unchar i;
 for(i=8;i>0;i--)
 {
  if(dat&0x01)     // 写1
  {
   ds1820_dq = 0;
   _nop_();     // 15us内释放总线
   ds1820_dq = 1;
   delay_us(1);    // 稍作延时,让器件读数据
  }
  else     //写0
  {
   ds1820_dq = 0;
   delay_us(60);    //延时至少60us,好让器件在15-45us时读到数据
   ds1820_dq = 1;
  }
  dat>>=1;      // 右移一位,
 }
}


/********************************************************************
*读取温度()
*函数名称:ds1820_write(unchar dat)
*说明:先写低位值,利用dat&0x01取出最低位的值,如果是1,执行写1操作,否则
*写0;写完之后将dat中的数值右移一位
********************************************************************/
void ds1820_read_temp(void)
{
 //do{
 ds1820_init();   //初始化
 //}while(!flag);


 ds1820_write(0xcc);   //跳过读序列号操作
 ds1820_write(0x44);  //启动温度转换,对于12位精度,转换需要750ms的时间
       
 do      //这里采用判断语句来确认是否转换完成
 {
 ds1820_init();   // 初始化
 }while(!flag);


 ds1820_write(0xcc);
 ds1820_write(0xbe);  //读取温度寄存器


 temp_data[0] = ds1820_read(); //温度低8位
 temp_data[1] = ds1820_read(); //高8位


/********************************************************************
*转换温度()
*函数名称: void ds1820_tempchange()
*说明:通过在转换结果上+0x30将其转换为数字对应的ascii码
********************************************************************/
 void ds1820_tempchange(void)
{
 //小数部分
  display_date[4]=temp_data[0]&0x0f ;
  display_date[0]=ditab[display_date[4]]+0x30 ;     //查表得小数位的值
   //整数部分
  display_date[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  display_date[3]=display_date[4]/100+0x30 ;
  display_date[1]=display_date[4]%100 ;
  display_date[2]=display_date[1]/10+0x30 ;
  display_date[1]=display_date[1]%10+0x30 ;


    if(display_date[3]==0x30)        //高位为0,不显示
   {
     display_date[3]=0x20 ;             
     if(display_date[2]==0x30)      //次高位为0,不显示
     display_date[2]=0x20 ;
   }


     lcd_write_char(0,1,display_date[3]);            
             //百位数显示
     lcd_write_char(0,2,display_date[2]);         
             //十位数显示
     lcd_write_char(0,3,display_date[1]);
          //各位显示 
  lcd_write_char(0,4,'.'); //小数点
     lcd_write_char(0,5,display_date[0]); //小数位 
}


/********************************************************************
*延时函数,us级
*函数名称:delay_us(unchar delay)
*说明:不精确延时
********************************************************************/
void delay_us(unchar delay)

 while(--delay);
}
/******************************************************************/



/****************************************/
void main()

 lcd_init();  // lcd初始化
 
 ds1820_init();  // ds1820初始化
  if(!flag)
  { 
  ds1820_read_temp();
  ds1820_tempchange();
  delay_1ms(200);
  }else
  {
   lcd_write_string(1,0,"ds1820_NG") ;
  }
 
 
}

文章评论3条评论)

登录后参与讨论

用户42640 2008-4-3 16:28

加我QQ联系

用户42640 2007-12-5 09:46

谢了,哈哈

wang1jin 2007-12-4 17:49

帮顶一下.哈哈.

用户386123 2007-6-8 18:04

深圳市科芯微电子专业生产DC/DC升压IC、白光驱动IC、降压IC、恒流IC、恒压IC、降压电路、恒流电路、恒压电路、升压、白光驱动、降压、恒流、恒压www.szkxw.com E-M:szkxw@126.com MSN:szkxw@hotmail.com QQ382254114
相关推荐阅读
用户42640 2012-03-28 09:28
评论:@小野兽的小草窝 博客中提到的“【博客 大赛】虚焊,你伤不起~~”
这个确实很重要,不起眼的问题会折腾人很久 ...
用户42640 2010-11-05 14:14
怎样用Realview MDK生成bin文件?
怎样用Realview MDK生成bin文件?       使用RVCT的fromelf.exe工具进行转换。也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*....
用户42640 2010-10-28 21:35
新塘M051中文技术参考手册
  今天无意中在网上看到的,这个要比研讨会上光盘上提供的那个中文版详细很多,看了一下,就是英文手册的完整翻译版 需要的朋友可以到这里下载:http://www.wang1jin.com/bbs/vie...
用户42640 2010-10-26 16:50
保护三极管基础
这次出现的问题是使用了ULN2003,由于直接用它的输入级接入模块的输入端,因此出现了问题。 由于电缆上存在分布电感和分布电容,因此很容易出现耦合,在ISO7637的实验中,存在高频脉冲250V,20...
用户42640 2010-08-10 09:04
广岛无冤魂
1945年8月6日,美国的B-29“空中堡垒”轰炸机向日本广岛投下代号为”男孩”(Boy)的原子弹,实施了人类首次核轰炸。 总听到有些人(尤其是中国人)说,战争是日本军国主义者全面发动的,日本人民是受...
用户42640 2010-07-15 16:59
RT-Thread学习笔记--- 初步认识RT-Thread
最近对RT-Thread很感兴趣,准备学习一下,硬件使用安富莱开发板2.0。软件使用keil MDK   RT-Thread的目录结构 其中Bsp是针对各个具体的平台,可以认为是用户代码。为了方...
我要评论
3
8
关闭 站长推荐上一条 /2 下一条