#include <reg52.h>
#include <intrins.h>
#define NOP() _nop_()
#define uchar unsigned char
#define uint unsigned int
unsigned int temp;
float f_temp;
sbit ds = P2^2;
sbit dula=P2^6; //数码管段选线
sbit wela=P2^7; //数码管位选线
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef}; //不带小数点的编码
void delay15us();
void delayUS(int us); //us=50为600us
/*
当us=1时,延迟时间为30us,
当us=2时,延迟时间为43us
当us=3时,延迟时间为56us,
可以看出基本的调用时间为17us,每增加一次循环增加13us,
*/
void reset();
void writeBit(char dat);
void writeByte(unsigned char val);
char readBit(void);
char readByte(void);
void convert(void);
unsigned int getTemperature(void);
void display(unsigned char num,unsigned char dat);
void dis_temp(unsigned int t);
void main(void)
{
dula=0;
wela=0;
while(1)
{
convert();
dis_temp(getTemperature());
}
}
void delayUS(int us)
{
while(us--);
// NOP();
}
void delay15us()
{
NOP();NOP();NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();
}
void reset()
{
ds = 0;
delayUS(37);//480us
ds = 1;
delayUS(37);//对照着ds18b20 复位时序图写
}
void writeBit(unsigned char dat)
{
ds = 0;
delay15us();
if(dat == 1)
ds = 1;
delay15us();
delay15us();
delay15us();
ds = 1;
}
void writeByte(unsigned char val)
{
unsigned char dat;
int i;
for(i = 8; i > 0; i--)
{
dat = val & 0x01;
writeBit(dat);
val = val>>1;
}
}
char readBit(void)
{
char dat;
ds = 0;
NOP();
ds = 1; //应该在0~15us的时间内,ds18b20都会在数据线上写数据,可以再这之后写几个nop();
delay15us();
dat = ds;
delayUS(3);
return dat;
}
char readByte(void)
{
uchar i,temp,dat;
dat=0;
for(i=1;i<=8;i++)
{
temp=readBit(); //在读暂存器时,数据以位0为最低有效位从单总线移出
dat=(temp<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void convert(void)
{
reset();
writeByte(0xCC);
writeByte(0x44);
}
unsigned int getTemperature(void)
{
uchar LSB, MSB;
reset();
writeByte(0xCC);
writeByte(0xBE);
LSB = readByte();
MSB = readByte();
temp = MSB;
temp = (temp<<8) | LSB;
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
void display(uchar num,uchar dat)
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delayUS(150);
}
void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}