#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx
《#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx》由会员分享,可在线阅读,更多相关《#基于DS18B20温度传感器温控系统的Proteus仿真Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
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());
谨供参考学习使用,如有错误欢迎指正。