51单片机读18b20序列号proteus仿真电路 下载本文

内容发布更新时间 : 2024/11/16 11:57:48星期一 下面是文章的全部内容请认真阅读。

本人想用单片机同时控制两个温度传感器18B20,由于每个18b20都有自己的序列号,就好像人们的身份证一样;这样一根线上就可以挂接多个18b20,实现多点控制;但前提是必须先知道每个18b20的序列号,只有匹配对了序列号,才可以正确的读取相对应的18b20的温度。本人从网上搜刮整理了一个用来读取18b20的程序,可以直接拿来用的。Lcd1602液晶显示。现我把程序和proteus仿真电路的连线图发上来,大家分享学习一下。版权所有,仿冒必究;如有雷同,纯属巧合。。。。。。

注:读序列号时必须只能挂接一个18b20,切记!!!切记!!!

#include

#define uchar unsigned char #define uint unsigned int

/********************************************************************/ sbit DS = P3^3; //温度传感器信号线

sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明 sbit rw = P1^3; //LCD读写控制,写为0,读为1 sbit lcden = P1^2; //LCD使能信号端位声明

/********************************************************************/ void delay(uint z); //延时函数

void DS18B20_Reset(void); //DS18B20复位,初始化函数 bit DS18B20_Readbit(void); //读1位数据函数

uchar DS18B20_ReadByte(void); //读1个字节数据函数

void DS18B20_WriteByte(uchar dat); //向DS18B20写一个字节数据函数 void LCD_WriteCom(uchar com); //1602液晶命令写入函数 void LCD_WriteData(uchar dat); //1602液晶数据写入函数

void LCD_Init(); //LCD初始化函数 void Display18B20Rom(char Rom); //显示18B20序列号函数 /**********************************************/ /* 主函数 */ /**********************************************/

void main()

{ uchar a,b,c,d,e,f,g,h; LCD_Init(); rw = 0;

DS18B20_Reset(); delay(1);

DS18B20_WriteByte(0x33); delay(1);

a = DS18B20_ReadByte(); b = DS18B20_ReadByte(); c = DS18B20_ReadByte(); d = DS18B20_ReadByte(); e = DS18B20_ReadByte();

f = DS18B20_ReadByte(); g = DS18B20_ReadByte(); h = DS18B20_ReadByte(); LCD_WriteCom(0x80+0x40); Display18B20Rom(h); Display18B20Rom(g); Display18B20Rom(f); Display18B20Rom(e); Display18B20Rom(d); Display18B20Rom(c); Display18B20Rom(b); Display18B20Rom(a); while(1); }

/***************************************************/ /* 延时函数:void delay() */ /* 功能:延时函数 */ /***************************************************/ void delay(uint z)//延时函数 {

uint x,y;

for( x = z; x > 0; x-- )

for( y = 110; y > 0; y-- ); }

/***************************************************/ /* DS18B20函数:void DS18B20_Reset() */ /* 功能:复位18B20 */ /***************************************************/ void DS18B20_Reset(void)//DS18B20复位,初始化函数 {

uint i; DS = 0; i = 103;

while( i > 0 ) i--; DS = 1; i = 4;

while( i > 0 ) i--; }

/***************************************************/ /* DS18B20函数:void DS18B20_Readbit() */ /* 功能:读1个字节数据函数 */ /***************************************************/ bit DS18B20_Readbit(void) //读1位数据函数

{

uint i; bit dat; DS = 0;

i++; //i++起延时作用 DS = 1; i++; i++;

dat = DS; i = 8;

while( i > 0 )i--; return( dat ); }

/***************************************************/ /* DS18B20函数:void DS18B20_ReadByte() */ /* 功能:读1个字节数据函数 */ /***************************************************/ uchar DS18B20_ReadByte(void) //读1个字节数据函数 {

uchar i,j,dat; dat = 0;

for( i = 1; i <= 8; i++ ) {

j = DS18B20_Readbit(); dat = ( j << 7 ) | ( dat >> 1 ); }

return(dat); }

/***************************************************/ /* DS18B20函数:void DS18B20_WriteByte() */ /* 功能:向DS18B20写一个字节数据函数 */ /***************************************************/

void DS18B20_WriteByte(uchar dat) //向DS18B20写一个字节数据函数 {

uint i; uchar j; bit testb;

for( j=1; j<=8; j++) {

testb = dat&0x01; dat= dat>>1;

if(testb) //写1 {