#include<reg52.h>
#include<intrins.h>
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint t)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_(); _nop_();
}
void init()//初始化
{
bit x;
ds=1;
delay(1);
ds=0;
delay(32);
ds=1;
delay(4);
x=ds;
delay(32);
// return x;
}
void ds_wbit(bit i)//写一位
{
ds=0;
_nop_();
_nop_();//总线拉低持续时间要大于1us
ds=i;
delay(3);//延时60us 等待取样
ds=1;//释放总线
}
void ds_wbyte(uchar dat)//写一个字节
{
uchar i;
while(i++<8)
{
ds_wbit(dat&0x01);
dat>>=1;
}
}
bit ds_rbit()//读一位
{
uchar ret;
ds=0;
_nop_();_nop_();
ds=1;
_nop_(); _nop_();
_nop_(); _nop_();
ret=ds;
delay(3);
ds=1;
return ret;
}
uchar ds_rbyte()//读一个字节
{
uchar i,j,dat;
for(i=0;i<8;i++)
{
j=ds_rbit();
dat=(j<<7)|(dat>>1);
/*dat>>=1;//先读最低位
if(ds_rbit())
dat|=0x80;*/
}
return dat;
}
void tempchange(void) //DS18B20 begin change
{
init();
delay(1);
ds_wbyte(0xcc); // address all drivers on bus
ds_wbyte(0x44); // ini
tiates a single temperature conversion
}
uint get()
{
uchar a,b;
uint t=0;
float tt;
/*ds_wbyte(0xcc);//跳过读序列号的操作
ds_wbyte(0x44);//启动温度转换*/
init();//复位
ds_wbyte(0xcc);//跳过读序列号操作
ds_wbyte(0xbe);//读取温度寄存器等(共可读九个寄存器)其中前两个就是温度
a=ds_rbyte();//获取温度低8位
b=ds_rbyte();//获取温度高8位
t=b;
t<<=8;
t=t|a;//两个8位的字节 组合为一个字
tt=t*0.0625;//温度转化
t=tt*10+0.5;//对结果进行4舍5入
return t;
}
void display(uint temp)
{
uint bai,shi,ge;
uchar cnt;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;
cnt++;
switch(cnt)
{
case 1: P0=0xff;
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xfe;
wela=0; break;
case 3: P0=0xff;
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xfd;
wela=0; break;
case 5:P0=0xff;
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xfb;
wela=0; break;
case 7: cnt=0; break;
default:break;
}
}
void main()
{
//uint a;
init();
do
{
tempchange();
delay(100);
display(get());
}while(1);
}
一周热门 更多>