本文包含原理图、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);
} |