内容发布更新时间 : 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 {