资源简介
总线形式的访问多个DS18B20温度传感器的程序。程序已经测试过,试过7个DS18B20正常访问。要连接多个DS18B20要考虑其供电,最好单独供电。
用的AT89S52的单片机,程序注释里有硬件连接。
代码片段和文件信息
//读者须知:
//若要用这个程序,LCD的D0-D7跟单片机的P2口连。LCD用得是1602,LCD的第4脚与单片机的P3.5脚,LCD的第6脚与单片机的P3.4连
//LCD的第5脚接地。DS18B20的数据线(中间的引脚)接单片机的P1.0。单片机用的是AT89S52.
//这个程序,本人测试过了,测试过单总线上7个DS18B20的连接,并能正确读到。
//
//序列号只能一位一位读出来,先写个程序读出序列号,然后可以针对某一个DS18B20进行操作
//需要注意的是:若单总线上有多个DS18B20时,读不到正确的序列号,因为单片机在总线上发出读序列号的命令后
//每一个DS18B20都会开始上传自己的序列号,因此读不到正确的序列号,只能一个一个地读序列号。
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^0; //温度传感器DS18B20信号线与P1.0连
uint temptemp1temp2temp3temp4temp5temp6temp7temp8numnum1;
float f_temp;
uchar D1_ROM_ID[8];
uchar D2_ROM_ID[8];
//通过调用“read_and_display_DS18B20_ROMID()” 在1602液晶里显示序列号,如何读到正确的序列号,请
//参考read_and_display_DS18B20_ROMID()的说明,读出正确的序列号后,把序列号填到下面的数组里面,
//然后通过调用“get_temperature(DD1_ROM_ID)” 得到总线上指定的DS18B20的温度,而不会读到其它的DS18B20的温度。
//需要注意的是:若单总线上有多个DS18B20时,读不到正确的序列号,因为单片机在总线上发出读序列号的命令后
//每一个DS18B20都会开始上传自己的序列号,因此读不到正确的序列号,只能一个一个地读序列号。
uchar code DD1_ROM_ID[8]={0x280x0b0x0f0x0d0x020x000x000x5b};
uchar code DD2_ROM_ID[8]={0x280xc10xdc0x0c0x020x000x000x94};
//液晶1602部分--start
sbit LCDen=P3^4; //液晶LCD1602的第6脚与P3.4连
sbit LCDrs=P3^5; //液晶LCD1602的第4脚与P3.5连
unsigned char code table[]=“I LOVE MCU!“;
unsigned char code table1[]=“WWW.WZVCST.COM“;
//液晶1602部分--end
//延时xms毫秒
void delay(uint xms)
{
uint ij;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
//R/W-->GNDno used 液晶的第5脚没有用到,直接接地。因为往液晶里写数据就显示,所以只需要接地。
//不需要从液晶里读数据,所以这根脚就直接接地。
//往液晶里写命令:如清屏,设置显示的位置等。
void write_com(uchar com)
{
LCDrs=0;
P2=com;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}
//往液晶里写数据:要显示的数据,通过此程序来写进液晶里去。
void write_data(uchar date)
{
LCDrs=1;
P2=date;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}
//液晶部分--start:1602的初始化
void LCD_init()
{
write_com(0x38); //P150 tale7.2.6
write_com(0x0c); //open display not display cursor
write_com(0x06); //address point add one after write a char
write_com(0x01); //clear the LCD and data point
}
//液晶部分--end:1602的初始化
//DS18B20的相关程序--start
void dsreset(void) //DS18B20复位,初始化函数
{
uint i;
ds=1;
i++;
ds=0;
i=400;
while(i>0)i--;
ds=1;
// i=4;
i=8;
while(i>0)i--;
}
bit tempreadbit(void) //读1位数据函数
{
uint i;
bit dat;
ds=1;i++;
ds=0;i++;i++; i++;i++;
ds=1;i++;i++;
dat=ds;
i=30;while(i>0)i--; //i=8;while(i>0)i--; ;若是i=8,只能检测到5个 3
return(dat);
}
uchar tempread(void) //读1个字节数据函数
{
uchar ijdat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwri
相关资源
- 单片机外扩ROM外扩27C64的Proteus仿真
- proteus仿真max7219的使用方法
- 单片机的外文文献与翻译.2018_03_16
- DS18B20+UCOSIII-技术资料+源码
- 单片机PWM调速程序
- 基于AVR单片机的汽车空调控制系统资
- N76E003串口0、串口1中断程序模板
- stc15xxxx单片机RFID RC 522 读写卡程序可
- 按键数码管显示
- 基于tm4c1294单片机的打地鼠设计,M4的
- 基于单片机的智能电子钟设计
- 基于单片机的曼彻斯特编码程序
- 单总线控制多个DS18B20
- 51单片机通过GSM模块发送短信控制LE
- 基于单片机的智能电子遥控车位锁设
- proteus中51单片机控制交通灯的仿真
- 60S2单片机驱动DS18B20温度传感器C程序
- 一看就懂的51单片机RS232串口程序
- 基于STC12C5A16S2单片机电子水平仪设计
- 实验三 开关控制警报器.DSN
- 单片机课程设计数字电压表,有软件
- 51单片机控制两个LED灯分别闪烁
- 基于AT89C52单片机的光功率计的设计
- STM32f103的DS18B20温度读取
- 基于51单片机的信号发生器-完整电路
- 基于AT89S52单片机的多模式带音乐跑马
- 单片机 实现多路任意延时的一种方法
- 单片机控制多个电机程序
- 51单片机ADC0809测电压12864显示程序
- 51单片机超声波测距1602显示
评论
共有 条评论