⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20.c

📁 18b20测温程序 单片机c程序
💻 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 + -