• 大小: 8KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: 其他
  • 标签: DS18B20  单片机  

资源简介

总线形式的访问多个DS18B20温度传感器的程序。程序已经测试过,试过7个DS18B20正常访问。要连接多个DS18B20要考虑其供电,最好单独供电。 用的AT89S52的单片机,程序注释里有硬件连接。

资源截图

代码片段和文件信息

//读者须知:
//若要用这个程序,LCD的D0-D7跟单片机的P2口连。LCD用得是1602,LCD的第4脚与单片机的P3.5脚,LCD的第6脚与单片机的P3.4连
//LCD的第5脚接地。DS18B20的数据线(中间的引脚)接单片机的P1.0。单片机用的是AT89S52.
//这个程序,本人测试过了,测试过单总线上7个DS18B20的连接,并能正确读到。
//
//序列号只能一位一位读出来,先写个程序读出序列号,然后可以针对某一个DS18B20进行操作
//需要注意的是:若单总线上有多个DS18B20时,读不到正确的序列号,因为单片机在总线上发出读序列号的命令后
//每一个DS18B20都会开始上传自己的序列号,因此读不到正确的序列号,只能一个一个地读序列号。

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^0; //温度传感器DS18B20信号线与P1.0连

uint temptemp1temp2temp3temp4temp5temp6temp7temp8numnum1;
float f_temp;
uchar D1_ROM_ID[8];
uchar D2_ROM_ID[8];

//通过调用“read_and_display_DS18B20_ROMID()” 在1602液晶里显示序列号,如何读到正确的序列号,请
//参考read_and_display_DS18B20_ROMID()的说明,读出正确的序列号后,把序列号填到下面的数组里面,
//然后通过调用“get_temperature(DD1_ROM_ID)” 得到总线上指定的DS18B20的温度,而不会读到其它的DS18B20的温度。
//需要注意的是:若单总线上有多个DS18B20时,读不到正确的序列号,因为单片机在总线上发出读序列号的命令后
//每一个DS18B20都会开始上传自己的序列号,因此读不到正确的序列号,只能一个一个地读序列号。
uchar code DD1_ROM_ID[8]={0x280x0b0x0f0x0d0x020x000x000x5b};
uchar code DD2_ROM_ID[8]={0x280xc10xdc0x0c0x020x000x000x94};

//液晶1602部分--start
sbit LCDen=P3^4; //液晶LCD1602的第6脚与P3.4连
sbit LCDrs=P3^5;    //液晶LCD1602的第4脚与P3.5连
unsigned char code table[]=“I LOVE MCU!“;
unsigned char code table1[]=“WWW.WZVCST.COM“;
//液晶1602部分--end

//延时xms毫秒
void delay(uint xms)
{
uint ij; 
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}

//R/W-->GNDno used  液晶的第5脚没有用到,直接接地。因为往液晶里写数据就显示,所以只需要接地。
//不需要从液晶里读数据,所以这根脚就直接接地。
//往液晶里写命令:如清屏,设置显示的位置等。
void write_com(uchar com)
{
LCDrs=0;
P2=com;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}

//往液晶里写数据:要显示的数据,通过此程序来写进液晶里去。
void write_data(uchar date)
{
LCDrs=1;
P2=date;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}

//液晶部分--start:1602的初始化
void LCD_init()
{
write_com(0x38); //P150 tale7.2.6
write_com(0x0c); //open display not display cursor
write_com(0x06); //address point add one after write a char
write_com(0x01); //clear the LCD and data point
}
//液晶部分--end:1602的初始化

//DS18B20的相关程序--start
void dsreset(void) //DS18B20复位,初始化函数
{
uint i;
ds=1;
i++;
ds=0;
i=400;
while(i>0)i--;
ds=1;
// i=4; 
i=8;
while(i>0)i--;
}

bit tempreadbit(void) //读1位数据函数
{
uint i;
bit dat;
ds=1;i++;
ds=0;i++;i++; i++;i++;
ds=1;i++;i++; 
dat=ds; 
i=30;while(i>0)i--;  //i=8;while(i>0)i--; ;若是i=8,只能检测到5个   3
return(dat);
}

uchar tempread(void) //读1个字节数据函数
{
uchar ijdat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}

void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;    
}
else
{
ds=0;
i=8;while(i>0)i--;       
ds=1;
i++;i++;
}
}
}

void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwri

评论

共有 条评论