DS18B20
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit IO_18b20 = P3^7;
void delay(u16 i)
{
while(i--);
}
bit Init_18b20() //18b20初始化
{
bit ack ;
EA = 0;
IO_18b20 = 0;
delay(50);
IO_18b20 = 1;
delay(6);
ack = IO_18b20;
while(!IO_18b20); //等待18b20释放总线
EA = 1 ;
return ack ;
}
void write18b20(u8 dat)
{
u8 i;
EA = 0;
for(i=0;i<8;i++)
{
IO_18b20 = 0;
_nop_();
_nop_();
IO_18b20 = dat&0x01;
delay(6);
IO_18b20 = 1;
dat >>= 1;
}
EA = 1;
}
u8 read18b20()
{
u8 mask;
u8 dat;
EA = 0;
for(mask = 0x01;mask != 0;mask<<=1)
{
IO_18b20 = 0;
_nop_();
_nop_();
IO_18b20 = 1;
_nop_();
_nop_();
if(!IO_18b20)
dat &= ~mask;
else
dat |= mask;
delay(6);
}
EA = 1;
return dat;
}
void Start18b20()
{
bit ack;
ack = Init_18b20();
if(ack == 0)
{
write18b20(0xcc); //跳过ROM操作命令
write18b20(0x44); //温度转换命令
}
}
void DS18b20temp()
{
bit ack;
ack = Init_18b20();
if(ack == 0)
{
write18b20(0xcc);
write18b20(0xbe); //发送读取温度命令
}
}
int Get18b20temp()
{
bit ack;
int temp = 0;
u8 LSB,MSB;
ack = Init_18b20();
if(ack == 0)
{
Start18b20(); //启动18b20,开始温度转化
b
DS18b20temp(); //然后等待转换完后发送读取温度命令
LSB = read18b20(); //读取温度值共16位,先读低字节
MSB = read18b20(); //再读高字节
temp = ((int)MSB<<8) + LSB;
}
return temp;
}
main
#include<reg52.h>
#define LED P0
typedef unsigned char u8;
typedef unsigned int u16;
bit Init_18b20();
void write18b20(u8 dat);
u8 read18b20();
void Start18b20();
void DS18b20temp();
int Get18b20temp();
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
u8 ledchar[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
u8 flag1s = 0;
u8 i = 0;
void init()
{
TMOD = 0x01;
TH0 = 0xff; //fff6 = 65526
TL0 = 0xf6;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0() interrupt 1
{
static u16 cnt;
TH0 = 0xff;
TL0 = 0xf6;
cnt++;
if(cnt == 1) //定时10us
{
cnt = 0;
flag1s = 1;
}
LED = 0x00;
switch(i)
{
case(0):LSA = 0;LSB = 0;LSC = 0;i++;LED = ledchar[0];break;
case(1):LSA = 1;LSB = 0;LSC = 0;i++;LED = ledchar[1];break;
case(2):LSA = 0;LSB = 1;LSC = 0;i++;LED = ledchar[2];break;
case(3):LSA = 1;LSB = 1;LSC = 0;i++;LED = ledchar[3];break;
case(4):LSA = 0;LSB = 0;LSC = 1;i++;LED = ledchar[4];break;
case(5):LSA = 1;LSB = 0;LSC = 1;i++;LED = ledchar[5];break;
case(6):LSA = 0;LSB = 1;LSC = 1;i++;LED = ledchar[6];break;
case(7):LSA = 1;LSB = 1;LSC = 1;i=0;LED = ledchar[7];break;
default:break;
}
}
void datapros(int temp)
{
float tp;
if(temp)
{
ledchar[0] = 0x00;
tp=temp; //因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
if(flag1s == 1)
{
flag1s = 0;
ledchar[1] = smgduan[temp/10000];
ledchar[2] = smgduan[temp%10000/1000];
ledchar[3] = smgduan[temp%1000/100] | 0x80;
ledchar[4] = smgduan[temp%100/10];
ledchar[5] = smgduan[temp%10];
}
}
}
void main()
{
init();
while(1)
{
datapros(Get18b20temp()); //数据处理函数
}
}