📄 18b20.c
字号:
/*
总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如:
指令 代码
Read ROM(读ROM) [33H]
Match ROM(匹配ROM) [55H]
Skip ROM(跳过ROM] [CCH]
Search ROM(搜索ROM) [F0H]
Alarm search(告警搜索) [ECH]
存储器操作命令:
指令 代码
Write Scratchpad(写暂存存储器) [4EH]
Read Scratchpad(读暂存存储器) [BEH]
Copy Scratchpad(复制暂存存储器) [48H]
Convert Temperature(温度变换) [44H]
Recall EPROM(重新调出) [B8H]
Read Power supply(读电源) [B4H]
经过单总线访问18B20的协议如下:
。初始化
。ROM操作指令
。存储器操作指令
。处理/数据
*******************************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
const uchar LEDCode[10] = {0x40|0x80,0x79|0x80,0x24|0x80,0x30|0x80,0x19|0x80,0x12|0x80,0x02|0x80,0x78|0x80,0x00|0x80,0x10|0x80};
extern crlr();
sbit DQ = P3^3; //定义通信端口
sbit P3_7 = P3^7;
sbit P3_6 = P3^6;
sbit P3_5 = P3^5;
sbit P3_4 = P3^4;
void Delay(uchar i)//延时
{
while(i--);
}
void Init_18B20()
{
uchar i = 0;
DQ = 1;
Delay(5);
DQ = 0;
Delay(90);
DQ = 1;
Delay(8);
i = DQ;
while(i);
Delay(80);
DQ = 1;
_nop_();
}
void Write0()
{
DQ = 1;
_nop_();
DQ = 0;
Delay(10);
DQ = 1;
_nop_();
}
void Write1()
{
DQ = 1;
_nop_();
DQ = 0;
Delay(2);
DQ = 1;
_nop_();
Delay(7);
_nop_();
_nop_();
DQ = 1;
_nop_();
}
bit ReadDQ()
{
bit i;
DQ = 1;
DQ = 0;
_nop_();
Delay(2);
i = DQ;
Delay(10);
_nop_();
DQ = 1;
_nop_();
return i;
}
void WriteAByte(uchar Byte)
{
uchar i;
for(i=8;i>0;i--)
{
if(Byte&0x01)
Write1();
else
Write0();
Byte = Byte>>1;
}
}
uchar ReadAByte(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
void GetTemp(uchar Temp[2])
{
uchar TempH,TempL,LSL4,LSH4,MSL3,MSH5;
bit byte = 0;
Init_18B20();
WriteAByte(0xcc);
WriteAByte(0x44);
Init_18B20();
WriteAByte(0xcc);
WriteAByte(0xbe);
TempL = ReadAByte();
TempH = ReadAByte();
LSL4 = TempL&0x0f;
LSH4 = TempL&0xf0;
LSH4 >>= 4;
MSL3 = TempH&0x07;
Temp[0] = (((LSL4&0x08)>>3)*0.5+((LSL4&0x04)>>2)*0.25+((LSL4&0x02)>>1)*0.125+(LSL4&0x01)*0.0625)*100;
Temp[1] = LSH4 + MSL3*16;
if(MSH5)
{
Temp[0] = ~Temp[0] + 1;
Temp[1] = ~Temp[1] + 1;
}
}
void main()
{
uchar Temp[2],iL,jL,jH,iH;
P3 = 0x00;
while(1)
{
GetTemp(Temp);
iH = Temp[1]/10;
iL = Temp[1]%10;
jH = Temp[0]/10;
jL = Temp[0]%10;
P3 = (P3&0x0f)|0x10;
P2 = LEDCode[iH];
Delay(2000);
P3 = (P3&0x0f)|0x20;
P2 = LEDCode[iL]&0x7f;
Delay(2000);
P3 = (P3&0x0f)|0x40;
P2 = LEDCode[jH];
Delay(2000);
P3 = (P3&0x0f)|0x80;
P2 = LEDCode[jL];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -