DS18b20
程序员文章站
2022-07-12 10:54:49
...
#include<stc15f2k60s2.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
0X40,0X79,0X1A,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XBF,0XFF};
int one,two,three,four,five,six,seven,eight;
uchar dat;
sbit DQ=P1^4;
void Allinit();
void Delayms(uint ms);
void Display1(uchar one,two);
void Display2(uchar three,four);
void Display3(uchar five,six);
void Display4(uchar seven,eight);
void DS18B20_Init();
void DS18B20_Write(uchar dat);
long DS18B20_Read();
long TemperatureGet();
void Delay80us();
void Delay500us();
void main()
{
long t;
Allinit();
one=21;two=21;three=21;four=21;five=21;six=21;seven=21;eight=21;
while(1)
{
t=TemperatureGet();//13.0625 130625
one=t/100000;two=t%100000/10000+10;three=t%10000/1000;four=t%1000/100;five=t%100/10;six=t%10;
Display1(one,two);
Display2(three,four);
Display3(five,six);
Display4(seven,eight);
}
}
void Allinit()
{
P2=0XA0;//蜂鸣器继电器锁存器
P0=0X00;//关闭
P2=0XC0;//数码管位选锁存器
P0=0XFF;//选中所有数码管
P2=0XFF;//数码管段选锁存器 可以操作数码管
P0=0XFF;//关闭
P2=0X80;//LED锁存器
P0=0XFF;//关闭
}
void Delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void Display1(uchar one,two)
{
P2=0XC0;
P0=0X01;//0000 0001选中左边第一个数码管
P2=0XFF;
P0=tab[one];
Delayms(1);
P2=0XC0;
P0=0X02;//0000 0010
P2=0XFF;
P0=tab[two];
Delayms(1);
}
void Display2(uchar three,four)
{
P2=0XC0;
P0=0X04;//0000 0100
P2=0XFF;
P0=tab[three];
Delayms(1);
P2=0XC0;
P0=0X08;//0000 1000
P2=0XFF;
P0=tab[four];
Delayms(1);
}
void Display3(uchar five,six)
{
P2=0XC0;
P0=0X10;//0001 0000
P2=0XFF;
P0=tab[five];
Delayms(1);
P2=0XC0;
P0=0X20;//0010 0000
P2=0XFF;
P0=tab[six];
Delayms(1);
}
void Display4(uchar seven,eight)
{
P2=0XC0;
P0=0X40;//0100 0000
P2=0XFF;
P0=tab[seven];
Delayms(1);
P2=0XC0;
P0=0X80;//1000 0000
P2=0XFF;
P0=tab[eight];
Delayms(1);
}
void DS18B20_Init()
{
DQ=0;
Delay500us();
DQ=1;
Delay500us();
}
void DS18B20_Write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0X01;//0101 0110&0000 0001
Delay80us();
DQ=1;
dat>>=1;
}
}
long DS18B20_Read()
{
uchar i;
uchar dat;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ==1)
{
dat|=0X80;
}
Delay80us();
}
return dat;
}
long TemperatureGet()
{
uchar high,low;
long temp;
DS18B20_Init();
DS18B20_Write(0XCC);//向寄存器里写CC表示跳过ROM指令 因为只有一个温度传感器 所以不需要验证ROM编码
DS18B20_Write(0X44);//向寄存器里写44表示开始温度转换
Delay500us();//稳住转换需要时间所以延迟
DS18B20_Init();
DS18B20_Write(0XCC);
DS18B20_Write(0XBE);//向寄存器里写BE表示开始读取暂存器里的值
low=DS18B20_Read();
high=DS18B20_Read();
temp=(high&0X0F);//temp=(high<<4)|(low>>4) 高8位的前四位表示正负不需要直接去掉 低8位的后四位表示小数也去掉
temp=temp<<8;
temp|=low;
temp=temp*625;
return temp;
}
void Delay80us()
{
unsigned char i, j;
_nop_();
i = 1;
j = 217;
do
{
while (--j);
} while (--i);
}
void Delay500us()
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
上一篇: 线程加入join()