#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE
sbit DQ = P2^3; //DS18B20数据口
unsigned char TMPH,TMPL;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//********************************************************************
//unsigned char inbuf[]={'#','1','2','3','4','1','2','3','4','1','2','3','4','1','2','3','4','#','\0'};//一个浮点数处理成四位字符型数据
unsigned char inbuf[]={0xbb,0x28,'\0'};
void delay1(int ms)
{
char k;
while(ms--)
{
for(k = 0; k < 120; k++);
}
}
void delay_1() //140us
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
void delay(uint N)
{
int i;
for(i=0; i<N; i++)
;
}
void send_char( unsigned char x)
{
SBUF=x;
while (TI== 0 );
TI= 0;
}
void send_string( unsigned char *s, unsigned int string_length)
{
unsigned int i= 0;
while (i<string_length)
{
send_char(*(s + i)); //向串口发送一个字符
i++;
}
}
/*void Convert_F_C(unsigned char n,float f)
{
inbuf[n] = *((char *)(&f));
inbuf[n+1] = *((char *)(&f) + 1);
inbuf[n+2] = *((char *)(&f) + 2);
inbuf[n+3] = *((char *)(&f) + 3);
} */
/********************************************************************
* 名称 : 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);
}
}
void Com_Init(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main(void)
{
char dat;
uint temp;
Com_Init();
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
temp = TMPL / 16 + TMPH * 16;
P0 = table[temp/10%10];
inbuf[0] = temp;
P2 = 6;
delay(5);
P0 = table[temp%10];
P2 = 7;
delay(5);
if(RI)
{ RI = 0; //清除串行接受标志位
dat = SBUF; //从串口缓冲区取得数据
if(dat==0x27)
{
SBUF=0x27;
while(!TI);
TI=0;
delay1(10);
send_string(inbuf,strlen(inbuf));
}
}
}
}