#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx

上传人:b****3 文档编号:18338438 上传时间:2022-12-15 格式:DOCX 页数:13 大小:247.38KB
下载 相关 举报
#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx_第1页
第1页 / 共13页
#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx_第2页
第2页 / 共13页
#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx_第3页
第3页 / 共13页
#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx_第4页
第4页 / 共13页
#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx

《#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx》由会员分享,可在线阅读,更多相关《#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx

NC:

DS18B20单总线技术:

DS18B20采用单条信号线,既可以传输数据,也可以传输时钟。

其数据传输是双向的,这种单总线技术线路简单,硬件开销小,成本低廉,便于总线扩展与维护。

单总线通常需要外接一个4.7K的上拉电阻。

它与处理器的连接非常简单,通常连接方式如下图:

DQ端外接一个上拉电阻,与处理器的任一端口连接。

DS18B20工作原理

1.ROM功能命令

(1)[33H]ReadROM读ROM。

把DS18B20传感器的ROM中编码读出来。

(2)[55H]MatchROM匹配ROM。

发出该命令接着会发送64位包含具体DS18B20序列号的ROM编码,与该编码序列号相同的DS18B20就会做出响应,序列号不匹配的DS18B20继续等待,不做响应。

由于不同的DS18B20序列号不一样,所以通过该命令可以访问控制具体的DS18B20。

(3)[F0H]SearchROM搜索ROM。

用于识别各个DS18B20的64位ROM。

(4)[CCH]SkipROM跳过ROM。

当只有一个DS18B20时,使用该命令可以忽略64位ROM地址,直接向DS18B20发送温度变换命令。

(5)[ECH]AlarmSearch告警搜索。

执行后,温度超出上限或者下限的芯片做出响应。

主机与多个DS18B20连接,要对众多在线DS18B20的某一个进行通信,首先要逐个与DS18B20连接,读出其序列号;

然后将所有的DS18B20挂接到总线上,单片机发出匹配指令55H,接着主机提供64位序列,之后就可以与序列号相应的DS18B20进行数据交换。

主机与单个DS18B20连接时,不需要读取或者匹配ROM,只要使用跳过指令CCH,就可以进行数据转换和读取操作。

(1)[44H]ConvertT温度转换。

启动DS18B20进行温度转换。

12位精度转换时最长为750ms,转换结束后将数据存入内部9字节的RAM。

(2)[4EH]WriteScratchpad写暂存器。

发出该命令后,将两字节的数据写入内部RAM的第2、3字节,作为上、下限温度数据。

(3)[BEH]ReadScratchpad读暂存器。

读取内部9字节的温度数据。

(4)[48H]CopyScratchpad复制暂存器。

将RAM中的第2、3字节的内容复制到E2PROM。

(5)[B8H]RecallE2重调E2PROM。

将E2PROM内容恢复到RAM中的第3、4字节。

(6)[B4H]ReadPowerSupply读供电方式。

读取DS18B20的供电模式。

2.工作时序图

(1)初始化

Step1:

数据线置低电平

Step2:

延时800us左右(时间范围为480us至960us)

Step3:

数据线拉高电平

Step4:

延时40us左右(时间范围为15us至60us)

(2)读数据

逐位读取数据,然后把8位数据组成1个字节。

编写程序时分为两个部分,一个实现读取一位数据,另一个实现读取一个字节数据。

读取数据步骤:

延时5us左右(大于1us即可)

延时10us左右(这次延时和第一次延时之和接近15us左右)

Step5:

读取一位数据

Step6:

延时60us左右(大于45us即可)

Step7:

重复上面步骤,直到读完一个字节

(3)写数据

写数据分为写数据位1和数据位0。

写数据位1步骤:

数据线拉为高电平

延时70us左右(大于55us即可)

写数据位0步骤:

延时70us左右(大于60us即可)

延时5us左右(不要太小)

根据DS18B20的结构和性能,在Proteus中构建仿真工程,电路连接图如下:

上面的电路要实现的功能是,把传感器测量的温度显示到1602液晶上。

温度变化的范围是0℃至99.9℃,温度传感器通过设置可以设定温度调节的步长,这里取温度变化的步长为0.1℃,设置如下图:

设置好之后,就可以根据DS18B20的特性和控制方式编写程序。

参考程序如下:

#include<

reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodedisp[]="

0123456789"

;

ucharcodedisp2[]="

Tempreture"

ucharcodedisp3[]="

^C"

sbitlcden=P2^0;

sbitlcdrw=P2^1;

sbitlcdrs=P2^2;

sbittempt=P2^3;

uintu_temp;

//定义无符号整型形参

floatf_temp;

//定义浮点型形参

voiddelay(uintx)//延时500ms程序

{

uinti,j;

for(i=0;

i<

x;

i++)

for(j=0;

j<

130;

j++);

}

voidwrite_com(ucharcom)//液晶写命令

lcdrs=0;

P0=com;

delay(5);

lcden=1;

lcden=0;

voidwrite_data(uchardate)//液晶写数据

lcdrs=1;

P0=date;

voidlcd_init()//液晶初始化

lcdrw=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

voiddisplay_tempt(uintdate)//温度数据显示

uchari,j,k;

i=date/100;

//十位

j=date%100/10;

//个位

k=date%100%10;

//小数位

write_com(0x80+0x40+5);

write_data(disp[i]);

write_data(disp[j]);

write_data('

.'

);

write_data(disp[k]);

voidreset_tempt()//DS18B20复位,初始化

uinti;

tempt=0;

i=90;

//延时

while(i>

0)i--;

tempt=1;

i=4;

//延时

bitread_bit()//读一位DS18B20数据

bitdat;

i++;

dat=tempt;

i=8;

returndat;

ucharread_tempt()//读一个字节DS18B20数据

uchari,j,dat;

dat=0;

for(i=1;

=8;

{

j=read_bit();

dat=(j<

<

7)|(dat>

>

1);

//将读取的数据位按读取先后顺序,

}//从低位到高位(从右往左)排列保存到dat

voidwrite_byte(uchardat)//写一个字节数据到DS18B20

ucharj;

bittestbit;

for(j=1;

j++)

testbit=dat&

0x01;

//每次只写一位数据

dat=dat>

1;

if(testbit)

{

tempt=0;

i++;

tempt=1;

i=8;

while(i>

}

else

}

}

voidconvert_tempt()//DS18B20开始获取温度并进行转换

reset_tempt();

delay

(1);

write_byte(0xcc);

write_byte(0x44);

uintget_tempt()//读取DS18B20寄存器中的温度数据

uchara,b;

write_byte(0xbe);

a=read_tempt();

b=read_tempt();

u_temp=b;

u_temp<

u_temp=u_temp|a;

f_temp=u_temp*0.0625;

//精度为12位,所以分辨率为0.0625

u_temp=f_temp*10;

//乘以10,将实际温度扩大10倍returnu_temp;

//返回的u_temp是整型数据

voiddisplay()//静态文字显示

uchari,j;

write_com(0x80+3);

10;

write_data(disp2[i]);

write_com(0x80+0x40+10);

for(j=0;

2;

write_data(disp3[j]);

voidmain()//主函数

uchari;

lcd_init();

display();

while

(1)

{

convert_tempt();

for(i=0;

display_tempt(get_tempt());

谨供参考学习使用,如有错误欢迎指正。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1