找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

DS18B20 全部程序

[复制链接]
smiles_happy 发表于 2010-5-28 08:30:48 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

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

×
这是我DS18B20的全部程序在实验板上用1602显示,不过它的测温感觉一直有问题(温度不变,一直是27.93)希望有高手指导一下

#include <AT89X52.H>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define LEN  60
#define M 16
#define BUSY (DQ==0)
///////////////config set source////////////////////////////////
#define HIGH 0x10
#define LOW  0x10
#define CON_9 0x1f
#define CON_10 0x3f
#define CON_11  0x5f
#define CON_12 0x7f
/**************************************************************/
////////////////////////////define the ROM//////////////////////
#define Read_ROM   0x33
#define Match_ROM  0x55
#define Skip_ROM  0xcc
#define Search_ROM  0xf0
#define AlARM_Search 0xec
/****************************************************************/
//////////////memory command functions/////////////////////////
#define Write_Scratchpad 0x4e
#define Read_Scratchpad  0xbe
#define Copy_Scratchpad  0x48
#define Convert_T   0x44
#define Reacll_E2E   0xb8
#define Read_Power_Supply 0xb4
/********************************************************************/
/////define the port////////////////////////////////////////////////
#define DATA P0
sbit lcd_rs=P1^0;
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2;
sbit DQ=P3^5;

//uint a0,b0;
//define the variance/////////////////////////////////////////
uchar LCD[LEN]={"                the temp is ?!!!.!!she shi du.   "};
uchar flag;
uchar fuhao[10]={'0','1','2','3','4','5','6','7','8','9'};
//define the DS18B20 han-shu/////////////////////////////////
void delay_L(uint t);
void delay_T(uchar t);
void DS18_config();
void DS18_reset();
void DS18_check();
bit DS18_rd_bit();
uint DS18_rd_byte();
void DS18_wr_byte(uchar dat);
void DS18_ini();
void DS18_temp();
uint DS18_get_int();
uint DS18_get_dec();
/*******************************************************************/
////////////////////define the LCD han-shu//////////////////////////////
void lcd_ini();
void lcd_dat(uchar a);
void lcd_com(uchar a);
void lcd_busy();
void lcd_disp();
/***********************************************************************/
////////////////////main han-shu/////////////////////////////////////////
void main()
{
   // uchar i;
    DS18_ini();
lcd_com(0x01);
P0=0xff;
P3=0xff;
while(1)
{
//  i=5;
   DS18_temp();
      //while(i--)
      lcd_disp();
}
}
/******************************************************************/

//////////////////DS18B20 start/////////////////////////////////////

void delay_L(uint t)
{
while(t--);
}
/**********************************************************************/
void delay_T(uchar t)
{
    while(t--);
}
/********************************************************************/
/*void DS18_config()
{
DS18_ini();   
  DS18_wr_byte(0xcc);  //skip rom   
DS18_wr_byte(0x4e);  //write scratchpad   
DS18_wr_byte(HIGH);  //上限   
  DS18_wr_byte(LOW);  //下限     
  DS18_wr_byte(0x7f);     //set 11 bit (0.125)   
DS18_ini();   
  DS18_wr_byte(0xcc);  //skip rom   
  DS18_wr_byte(0x48);  //保存设定值   
DS18_ini();   
  DS18_wr_byte(0xcc);  //skip rom   
DS18_wr_byte(0xb8);  //回调设定值
}*/
/************************************************************************/
void DS18_ini()
{

DS18_reset();
DS18_check();
DS18_wr_byte(Skip_ROM);    //skip rom
DS18_wr_byte(Write_Scratchpad);
DS18_wr_byte(HIGH);  //上限   
  DS18_wr_byte(LOW);  //下限  
DS18_wr_byte(CON_12);
DS18_reset();
DS18_check();
_nop_();_nop_();_nop_();
DS18_wr_byte(0xcc);
//_nop_();  
DS18_wr_byte(Convert_T);
delay_L(3000);   
DS18_reset();
DS18_check();
}
bit DS18_rd_bit()
{
    bit dat;
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();
dat=DQ;
delay_L(500);
return dat;
}
uint DS18_rd_byte()
{
     uchar idata dat=0;
  uchar idata j;
  uchar idata i;
  for(i=0;i<8;i++)
  {
     j=DS18_rd_bit();
   dat=(j<<i)|dat;
   }
      return dat;
}
void DS18_wr_byte(uchar dat)
{
    uchar idata i;
uchar t;
for(i=0;i<8;i++)
{
     t=dat&0x01;
  if(t)
  {
   DQ=0;
   _nop_();_nop_();
   DQ=1;
   delay_T(70);
        }
  else
  {
      DQ=0;
   delay_T(60);
   DQ=1;
   _nop_();_nop_();
   }
        dat=dat>>1;
  }
}
uint DS18_get_int()
{  
uint idata a,b;
uint idata dat;
    uint idata yy;
uchar idata i;

   DS18_reset();
   DS18_check();
   _nop_();
   DS18_wr_byte(Skip_ROM);
   DS18_wr_byte(Convert_T);
   while(BUSY);
   DS18_reset();
   DS18_check();
   _nop_();
   __nop_();
   DS18_wr_byte(Skip_ROM);
   DS18_wr_byte(Read_Scratchpad);
   a=DS18_rd_byte();
   b=DS18_rd_byte();
   i=b;
   i=i&0xf000;
   yy=b<<8;
   yy=yy+a;
   if(i==0)
   {
     flag=0;
  yy=yy>>4;
  yy=yy&0x007f;
        dat=yy;
}
else
{
  flag=1;
  yy=~yy;
        yy++;
        yy=yy<<5;
        yy=yy>>9;
  yy=yy&0x00ff;
        dat=yy;
}
   delay_T(1);
   return dat;
}
uint DS18_get_dec()
{
   uint a,b;
   uint dat;
   uint i;
   uint yy;
   
   DS18_reset();
   DS18_check();
   DS18_wr_byte(Skip_ROM);
   DS18_wr_byte(Convert_T);
   while(BUSY);
   _nop_();
   DS18_wr_byte(Skip_ROM);
   DS18_wr_byte(Read_Scratchpad);
   a=DS18_rd_byte();   
   b=DS18_rd_byte();
  // a0=a;b0=b;
   yy=b<<8|a;
   i=b;
   i=i&0xf000;
   if(i==0)
   {
        flag=0;
  a=a&0x000f;
        dat=a;
}
else
{
  flag=1;
       yy=~yy;
       yy++;
       yy=yy&0x000f;
       dat=yy;
  }
   delay_L(10);

   return dat;
}
void DS18_reset()
{
DQ=0;
delay_L(240);
delay_L(240);
DQ=1;
}
void DS18_check()
{
while(DQ);
while(~DQ);
delay_L(1000);
}
void DS18_temp()
{
   uint idata tempH,tempL;  
   uint  idata t;
   DS18_reset();
   DS18_check();
   _nop_();
   _nop_();
   tempH=DS18_get_int();
   tempL=DS18_get_dec();
  /* LCD[29]=fuhao[a0/100];
   LCD[30]=fuhao[(a0/10)%10];
   LCD[31]=fuhao[(a0)%10];
   LCD[32]=fuhao[b0/100];
   LCD[33]=fuhao[(b0/10)%10];
   LCD[34]=fuhao[b0%10];
   */
   if(flag==0)
     LCD[28]='+';
   else
        LCD[28]='-';
   t=(uint)(tempH/1000);/////////////////////////ririririririiririiriiririiriri
   LCD[29]=fuhao[t];
   t=(tempH%100);
   t=t/10;
   LCD[30]=fuhao[t];
   t=tempH%10;
   LCD[31]=fuhao[t];
   t=(uint)((uint)tempL*625)/1000;
   LCD[33]=fuhao[t];
   t=(uint)(tempL*625/100);
   t=t%10;
   LCD[34]=fuhao[t];
}
/***********************************************************************************************************/
/**********************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
void lcd_ini()
{
  lcd_com(0x38);
lcd_com(0x0c);
lcd_com(0x03);
// lcd_com(0x01);
}
void lcd_com(uchar a)
{
    lcd_busy();
lcd_en=0;
delay_T(1);
lcd_en=1;
lcd_rw=0;
lcd_rs=0;
DATA=a;
delay_T(20);
lcd_en=0;
    delay_T(10);
}
void lcd_dat(uchar a)
{
  lcd_busy();
lcd_en=0;
delay_T(5);
    lcd_en=1;
lcd_rw=0;
lcd_rs=1;
DATA=a;
delay_T(20);
lcd_en=0;
}
  void lcd_busy()
{
    uchar busy;
do
{
    lcd_en=0;
    delay_T(10);
    lcd_en=1;
    lcd_rw=1;
    lcd_rs=0;
    busy=DATA;
    delay_T(100);
    lcd_en=0;
     }while(busy&&0x80==1);
}
void lcd_disp()
{
   uchar i,j;
   uchar *p=LCD+16;
   uchar *q=LCD+32;
   lcd_ini();
   for(i=0;i<=M;i++)
   {
       lcd_com(0x80);
    for(j=0;j<M;j++)
    {
      lcd_dat(p[j]);
   delay_L(1000);
    }
     
    lcd_com(0xc0);
    for(j=0;j<M;j++)
    {
      lcd_dat(q[j]);
   delay_L(1000);
    }
    p--;
    q--;
   
    }
delay_L(60000);

}
admin 发表于 2010-5-28 08:55:03 | 显示全部楼层
回复 1# smiles_happy


    程序一会帮你看下,先给你个思路,你那个27.93是否是液晶的初始温度,如果不是液晶的初始温度就说明显示数据的变量被改变了,这个有可能就是采集了一次,至于为什么会采集只采集一次你可以仔细看看你的采集函数又没有什么BUG。好了先说这么多一会帮你看看怎么回事。还有楼主最好进行程序的模块化 这样一大陀 以后修改调试都很麻烦的


楼主请看这里
while(BUSY);
   DS18_reset();
   DS18_check();
   _nop_();
   __nop_();
   DS18_wr_byte(Skip_ROM);

红色字体那个多了个下划线把
 楼主| smiles_happy 发表于 2010-5-28 22:50:25 | 显示全部楼层
回复 2# admin


    非常感谢,再次编译时warning没有了,但写入单片机时还是不行
还有就是我刚接触单片机对应模块化编程没有概念。希望指教——
 楼主| smiles_happy 发表于 2010-5-28 23:20:03 | 显示全部楼层
回复 3# smiles_happy


    不好意思————我用的是51实验板,没有用仿真。
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 06:26 , Processed in 0.056627 second(s), 13 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表