?? 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 + -