DS18B20测温程序完全解读Word格式.docx
- 文档编号:16885059
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:10
- 大小:17.92KB
DS18B20测温程序完全解读Word格式.docx
《DS18B20测温程序完全解读Word格式.docx》由会员分享,可在线阅读,更多相关《DS18B20测温程序完全解读Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
0x87,0xff,0xef};
//带小数点数字编码
/*延时函数*/
voidTempDelay(ucharus)
{
while(us--);
}
voiddelay(uintcount)//延时子函数
uinti;
while(count)
i=200;
while(i>
0)
i--;
count--;
/*串口初始化,波特率9600,方式1*/
voidinit_com()
TMOD=0x20;
//设置定时器1为模式2
TH1=0xfd;
//装初值设定波特率
TL1=0xfd;
TR1=1;
//启动定时器
SM0=0;
//串口通信模式设置
SM1=1;
//REN=1;
//串口允许接收数据
PCON=0;
//波特率不倍频
//
SMOD=0;
//EA=1;
//开总中断
//ES=1;
//开串行中断
/*数码管的显示*/
voiddisplay(uinttemp)
ucharbai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;
dula=0;
P0=table[bai];
//显示百位
dula=1;
//从0到1,有个上升沿,解除锁存,显示相应段
//从1到0再次锁存
wela=0;
P0=0xfe;
wela=1;
delay
(1);
//延时约2ms
P0=table1[shi];
//显示十位
P0=0xfd;
P0=table[ge];
//显示个位
P0=0xfb;
/*****************************************
时序:
初始化时序、读时序、写时序。
所有时序都是将主机(单片机)作为主设备,单总
线器件作为从设备。
而每一次命令和数据的传输
都是从主机主动启动写时序开始,如果要求单总
线器件回送数据,在进行写命令后,主机需启动
读时序完成数据接收。
数据和命令的传输都是低
位在先。
初始化时序:
复位脉冲存在脉冲
读;
1或0时序
写;
只有存在脉冲信号是从18b20(从机)发出的,其
它信号都是由主机发出的。
存在脉冲:
让主机(总线)知道从机(18b20)已
经做好了准备。
******************************************/
/*--------------------------------------------------------------------------------------------------------------------
初始化:
检测总线控制器发出的复位脉冲
和ds18b20的任何通讯都要从初始化开始
初始化序列包括一个由总线控制器发出的复位脉冲
和跟在其后由从机发出的存在脉冲。
复位脉冲+存在脉冲
具体操作:
总线控制器发出(TX)一个复位脉冲(一个最少保持480μs的低电平信号),然后释放总线,
进入接收状态(RX)。
单线总线由5K上拉电阻拉到高电平。
探测到I/O引脚上的上升沿后
DS1820等待15~60μs,然后发出存在脉冲(一个60~240μs的低电平信号)。
具体看"
倒塌18b20"
文档里的"
单线复位脉冲时序和1-wirepresencedetect"
的时序图
-------------------------------------------------------------------------------------------------------------------*/
voidds_reset(void)
ds=1;
_nop_();
//1us
ds=0;
TempDelay(80);
//当总线停留在低电平超过480us,总线上所以器件都将被复位,这里//延时约530us总线停留在低电平超过480μs,总线上的所有器件都
//将被复位。
//产生复位脉冲后,微处理器释放总线,让总线处于空闲状态,原因查//18b20中文资料
TempDelay(5);
//释放总线后,以便从机18b20通过拉低总线来指示其是否在线,
//存在检测高电平时间:
15~60us,所以延时44us,进行
1-wirepresence//detect(单线存在检测)
if(ds==0)
flag=1;
//detect18b20success
else
flag=0;
//detect18b20fail
TempDelay(20);
//存在检测低电平时间:
60~240us,所以延时约140us
//再次拉高总线,让总线处于空闲状态
/**/
/*----------------------------------------
读/写时间隙:
DS1820的数据读写是通过时间隙处理
位和命令字来确认信息交换。
------------------------------------------*/
bit
ds_read_bit(void)
//读一位
bitdat;
//单片机(微处理器)将总线拉低
//读时隙起始于微处理器将总线拉低至少1us
//拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据
//小延时一下,读取18b20上的数据,因为从ds18b20上输出的数据
//在读"
时间隙"
下降沿出现15us内有效
dat=ds;
//主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现//15us内有效
TempDelay(10);
//所有读"
必须60~120us,这里77us
return(dat);
//返回有效数据
uchards_read_byte(void)//读一字节
ucharvalue,i,j;
value=0;
//一定别忘了给初值
for(i=0;
i<
8;
i++)
j=ds_read_bit();
value=(j<
<
7)|(value>
>
1);
//这一步的说明在一个word文档里面
return(value);
//返回一个字节的数据
voidds_write_byte(uchardat)//写一个字节
uchari;
bitonebit;
//一定不要忘了,onebit是一位
for(i=1;
=8;
i++)
onebit=dat&
0x01;
dat=dat>
1;
if(onebit)
//写1
//看时序图,至少延时1us,才产生写"
//写时间隙开始后的15μs内允许数据线拉到高电平
//所有写时间隙必须最少持续60us
else
//写0
TempDelay(8);
//主机要生成一个写0时间隙,必须把数据线拉到低电平并保持至少60μs,这里64us
主机(单片机)控制DS18B20完成温度转换要经过三个步骤:
每一次读写之前都要18B20进行复位操作,复位成功后发送
一条ROM指令,最后发送RAM指令,这样才能对DS18b20进行
预定的操作。
复位要求主CPU将数据线下拉500us,然后释放,当ds18B20
受到信号后等待16~60us,后发出60~240us的存在低脉冲,
主CPU收到此信号表示复位成功
******************************************/
进行温度转换:
先初始化
然后跳过ROM:
跳过64位ROM地址,直接向ds18B20发温度转换命令,适合单片工作
发送温度转换命令
voidtem_change()
ds_reset();
//约2ms
ds_write_byte(0xcc);
ds_write_byte(0x44);
获得温度:
uintget_temperature()
floatwendu;
uchara,b;
ds_write_byte(0xbe);
a=ds_read_byte();
b=ds_read_byte();
temp=b;
temp<
temp=temp|a;
wendu=temp*0.0625;
//温度读取的解释我记录在"
倒塌18B20"
里面
temp=wendu*10+0.5;
returntemp;
读ROM
/*
voidds_read_rom()
//这里没有用到
delay(30);
ds_write_byte(0x33);
*/
voidmain()
uinta;
init_com();
while
(1)
tem_change();
//12位转换时间最大为750ms
for(a=10;
a>
0;
a--)
display(get_temperature());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 测温 程序 完全 解读