一条总线上最多连接4个ds18b20,也就是说当总线上最多4个ds18b20时温度显示正常,当再多连接一个ds18b20时温度就都显示为55度,正在做毕业设计,还请高手帮忙,期待解决。
程序如下:
#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE
sbit DQ = P3^5; //DS18B20数据口
unsigned char TMPH,TMPL;
unsigned char T[8];
unsigned char displayT[2];
unsigned char ROM1[8]={0x28,0xb2,0x39,0x35,0x05,0x00,0x00,0xfc};
unsigned char ROM2[8]={0x28,0x07,0xe6,0x34,0x05,0x00,0x00,0xae};
unsigned char ROM3[8]={0x28,0x35,0xf1,0x34,0x05,0x00,0x00,0x00};
unsigned char ROM4[8]={0x28,0xe1,0xc8,0x35,0x05,0x00,0x00,0xe0};
unsigned char ROM5[8]={0x28,0x10,0xa4,0x35,0x05,0x00,0x00,0x95};
unsigned char ROM6[8]={0x28,0x80,0xc2,0x35,0x05,0x00,0x00,0xa9};
unsigned char ROM7[8]={0x28,0x8c,0xc6,0x35,0x05,0x00,0x00,0xcb};
unsigned char ROM8[8]={0x28,0xaa,0x73,0x35,0x05,0x00,0x00,0x52};
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delays()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint N)
{
int i;
for(i=0; i<N; i++)
;
}
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar Reset(void)
{
uchar deceive_ready;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}
/**********************************************************************
functionName: void Read_ROM(void)
description :ROM 匹配
**********************************************************************/
void Matching_ROM(unsigned char mux)
{
unsigned char i,*P;
if(mux==1) P=ROM1;
if(mux==2) P=ROM2;
if(mux==3) P=ROM3;
if(mux==4) P=ROM4;
if(mux==5) P=ROM5;
if(mux==6) P=ROM6;
if(mux==7) P=ROM7;
if(mux==8) P=ROM8;
write_byte(0x55);
for(i=0;i<8;i++)
{
write_byte(*(P+i));
}
}
/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读 DS18B20 温度
**********************************************************************/
void readTempDS18B20(void)
{ unsigned char i;
uchar tempL,tempH,temp;
for(i=1;i<9;i++)
{
Reset();
Matching_ROM(i);
write_byte(0x44); //启动温度转换
delay(10); //转换延时
Reset();
Matching_ROM(i);
write_byte(0xbe); //读数据
tempL=read_byte();
tempH=read_byte();
temp = tempL / 16 + tempH* 16;
T[i]=temp;
}
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 初始化串口程序,晶振11.0592, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
TH1 = 0xFd;
TR1 = 1;
SCON = 0x50;
}
void Delay_10ms(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
uchar i,j;
Com_Init();
Reset();
readTempDS18B20();
for (i=1;i<9;i++)
{
displayT[1]=T[i]/10%10+48;
displayT[2]=T[i]%10+48;
for(j=1;j<3;j++)
{
SBUF = displayT[j];
while(!TI)
{
_nop_();
}
TI = 0;
}
}
Delay_10ms(200);
} |