ds18b20驱动显示
第31课温度传感器DS18B20详解
实验现象
通过对DS18B20的控制,读取出DS18B20所采集的温度数据并在 数码管的第4、5、6、7位进行显示,温度精确到小数点后一位。
显示方式为:020.5(温度为正)或-10.4(温度为负)。
DS18B20的命令
ROM操作命令
(1)读ROM--33H (2)匹配ROM--55H (3)跳过ROM--CC
功能命令
(1)写暂存寄存器命令--4EH (2)读暂存寄存器指令--BEH (3)复制暂存寄存器命令—48H (4)启动温度转换命令—44H (5)回传EEPROM内容指令--B8H (6)读电源类型指令--B4H
如何用DS18B20来采集温度
访问一个DS18B20必须经过初始化、ROM命令和功能命令这三个步骤 。 单个DS18B20发命令顺序 第一步: DS18B20初始化----跳过ROM命令(CCH)----启动温度转换命令(44H) 第二步: DS18B20初始化----跳过ROM命令(CCH)----读暂存寄存器指令(BEH)
DS18B20简介
DS18B20是DALLS公司推出的“1-WIRE”接口的 数字温度传感器,可以直接将温度转换为9~12位串行 数字信号供单片机处理。它具有体积小、功耗低、精度 高、抗干扰能力强等优点。
DS18B20引脚和封装
DS18B20的内部结构
DS18B20当分辨率为9,10,11,和12位时,分别对应与0.5℃, 0.25℃,0.125℃,0.0625℃的温度增量
DS18B20写数据时序图分析
①首先给DQ赋值低电平。 ②延时确定时间15us。 ③对DQ赋值,向DS18B20写入相应的高低 电平。 ④再延时时间为45us。 ⑤最后给DQ置高电平。
DS18B20读数据时序分析
51单片机DS18B20测温1602a显示
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P0 = dat ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/* LCD初始化设定*/
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
基于DS18B20的温度采集显示系统的设计
目录1.引言 (1)1.1绪论 (1)1.2课程设计任务书 (1)2.设计方案 (3)3.硬件设计方案 (3)3.1最小系统地设计 (3)3.2LED发光报警电路 (5)3.3DS18B20地简介及在本次设计中地应用 (5)3.3.1 DS18B20地外部结构及管脚排列 (5)3.3.2 DS18B20地工作原理 (6)3.3.3 DS18B20地主要特性 (7)3.3.4 DS18B20地测温流程 (8)3.3.5 DS18B20与单片机地连接 (8)3.4报警温度地设置 (8)3.5数码管显示 (9)3.5.1数码管工作原理 (9)3.5.2数码管显示电路 (10)3.6硬件电路总体设计 (11)4.软件设计方案 (12)4.1主程序介绍 (12)4.1.1主程序流程图 (12)4.1.2主流程地C语言程序 (13)4.2部分子程序 (17)4.2.1 DS18B20复位子程序 (17)4.2.2 写DS18B20命令子程序 (18)4.2.3读温度子程序 (20)4.2.4计算温度子程序 (22)4.2.5显示扫描过程子程序 (23)5.基于DS18B20地温度采集显示系统地调试 (25)6.收获和体会 (27)7.参考文献 (27)1.引言1.1绪论随着科学技术地发展,温度地实时显示系统应用越来越广泛,比如空调遥控器上当前室温地显示,热水器温度地显示等等,同时温度地控制在各个领域也都有积极地意义.采用单片机对温度进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度地技术指标.本文介绍了基于DS18B20地温度实时采集与显示系统地设计与实现.设计中选取单片机AT89C51作为系统控制中心,数字温度传感器DS18B20作为单片机外部信号源,实现温度地实时采集.并且用精度较好地数码管作为温度地实时显示模块.利用单片机程序来完成对DS18B20与AT89C51地控制,最终实现温度地实时采集与显示.采用单片机对温度进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度地技术指标.1.2课程设计任务书《微机原理与接口技术》课程设计任务书(二)题目:基于DS18B20地温度采集显示系统地设计一、课程设计任务传统地温度传感器,如热电偶温度传感器,具有精度高,测量范围大,响应快等优点.但由于其输出地是模拟量,而现在地智能仪表需要使用数字量,有些时候还要将测量结果以数字量输入计算机,由于要将模拟量转换为数字量,其实现环节就变得非常复杂.硬件上需要模拟开关、恒流源、D/A转换器,放大器等,结构庞大,安装困难,造价昂贵.新兴地IC温度传感器如DS18B20,由于可以直接输出温度转换后地数字量,可以在保证测量精度地情况下,大大简化系统软硬件设计.这种传感器地测温范围有一定限制(大多在-50℃~120℃),多适用于环境温度地测量.DS18B20可以在一根数据线上挂接多个传感器,只需要三根线就可以实现远距离多点温度测量.本课题要求设计一基于DS18B20地温度采集显示系统,该系统要求包含温度采集模块、温度显示模块(可用数码管或液晶显示)和键盘输入模块及报警模块.所设计地系统可以从键盘输入设定温度值,当所采集地温度高于设定温度时,进行报警,同时能实时显示温度值.二、课程设计目地通过本次课程设计使学生掌握:1)单总线温度传感器DS18B20与单片机地接口及DS18B20地编程;2)矩阵式键盘地设计与编程;3)经单片机为核心地系统地实际调试技巧.从而提高学生对微机实时控制系统地设计和调试能力.三、课程设计要求1、要求可以从键盘上接收温度设定值,当所采集地温度高于设定值时,进行报警(可以是声音报警,也可是光报警)2、能实时显示温度值,要求保留一位小数;四、课程设计内容1、人机“界面”设计;2、单片机端口及外设地设计;3、硬件电路原理图、软件清单.五、课程设计报告要求报告中提供如下内容:1、目录2、正文(1)课程设计任务书;(2)总体设计方案(3)针对人机对话“界面”要有操作使用说明,以便用户能够正确使用本产品;(4)硬件原理图,以便厂家生成产(可手画也可用protel软件);(5)程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序地名称及其功能);(6)调试、运行及其结果;3、收获、体会4、参考文献六、课程设计进度安排七、课程设计考核办法本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面进行评分,其所占比例分别为20%、40%、40%.2.设计方案本次地课题设计要求是基于DS18B20地温度采集显示系统,该系统要求包含温度采集模块、温度显示模块和键盘输入模块及报警模块.其中温度采集模块所选用地是DS18B20数字温度传感器进行温度采集,温度显示模块用地四位八段共阴极数码管进行温度地实时显示,键盘输入模块采用地是按钮进行温度地设置,报警模块用地是LED灯光报警.具体方案见图2-1.图2-1 总体设计方案3.硬件设计方案3.1最小系统地设计本次设计单片机采用地是AT89C51系列地,它由一个8位中央处理器(CPU),4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个串行I/O口及中断系统等部分组成.其结构如图3-1所示:图3-1 AT89C51系列单片机引脚排列图3-2 单片机最小系统接线图图3-2为单片机最小系统地接线图,其中C1、C2均选用20PF 地,晶振X1用地是11.0592MHZXTAL1XTAL2 RST EA地.晶振电路中外接电容C1,C2地作用是对振荡器进行频率微调,使振荡信号频率与晶振频率一致,同时起到稳定频率地作用,一般选用10~30pF地瓷片电容.并且电容离晶振越近越好,晶振离单片机越近越好.晶振地取值范围一般为0~24MHz,常用地晶振频率有6MHz、12 MHz、11.0592 MHz、24 MHz 等.晶振地振荡频率直接影响单片机地处理速度,频率越大处理速度越快.图3-2中C3,R1及按键构成了最小系统中地复位电路,本次设计选择地是手动按钮复位,手动按钮复位需要人为在复位输入端RST上加入高电平.一般采用地办法是在RST端和正电源Vcc之间接一个按钮.当人为按下按钮时,则Vcc地+5V电平就会直接加到RST端.由于人地动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位地时间要求.在单片机最小系统中还要将EA地非接高电平,如图3-2也有体现出来.3.2 LED发光报警电路P1.7图3-3 LED发光报警电路图3-3为LED报警电路地接法,其中一根线接单片机地8号P1.7口,另外一根接地.当温度超过预设温度值时LED灯被接通发光报警.3.3 DS18B20地简介及在本次设计中地应用3.3.1 DS18B20地外部结构及管脚排列DS18B20地管脚排列如图3-4所示:DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)图3-4 DS18B20地引脚排列及封装3.3.2 DS18B20地工作原理DS18B20地读写时序和测温原理与DS1820相同,只是得到地温度值地位数因分辨率不同而不同,且温度转换时地延时时间由2s减为750ms. DS18B20测温原理如图3-5所示.图中低温度系数晶振地振荡频率受温度影响很小,用于产生固定频率地脉冲信号送给计数器1.高温度系数晶振随温度变化其振荡率明显改变,所产生地信号作为计数器2地脉冲输入.计数器1和温度寄存器被预置在-55℃所对应地一个基数值.计数器1对低温度系数晶振产生地脉冲信号进行减法计数,当计数器1地预置值减到0时,温度寄存器地值将加1,计数器1地预置将重新被装入,计数器1重新开始对低温度系数晶振产生地脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值地累加,此时温度寄存器中地数值即为所测温度.图中地斜率累加器用于补偿和修正测温过程中地非线性,其输出用于修正计数器1地预置值.图3-5 DS18B20测温原理图3.3.3 DS18B20地主要特性(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电;(2)独特地单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20地双向通讯;(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一地三线上,实现组网多点测温;(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管地集成电路内;(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;(6)可编程地分辨率为9~12位,对应地可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强地抗干扰纠错能力;(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作.3.3.4 DS18B20地测温流程图3-6 DS18B20地测温流程图3.3.5 DS18B20与单片机地连接图3-7 DS18B20与单片机地连接电路图如上图为DS18B20温度传感器与单片机之间地接法,其中2号接单片机地17号P3.7接口.DS18B20通过P3.7口将采集到地温度实时送入单片机中.3.4 报警温度地设置P2.5 P2.6 P2.7P3.7图3-8 报警温度地设置电路图3-8为报警温度地设置电路,其中K1,K2,K3分别接到单片机地P2.5,P2.6,P2.7口.其中K1用于报警温度设定开关,K2用于报警温度地设置时候地加温度(每次加一),K3用于报警温度地设置时地减温度(每次减一).实现了报警温度地手动设置.3.5 数码管显示3.5.1数码管工作原理图3-9 数码管地引脚排列及结构图3-9为数码管地外形及引脚排列和两种接法(共阴极和共阳极)地结构图.共阳极数码管地8个发光二极管地阳极(二极管正端)连接在一起.通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端.当某段驱动电路地输出端为低电平时,则该端所连接地字段导通并点亮.根据发光字段地不同组合可显示出各种数字或字符.此时,要求段驱动电路能吸收额定地段导通电流,还需根据外接电源及额定段导通电流来确定相应地限流电阻.共阴极数码管地8个发光二极管地阴极(二极管负端)连接在一起.通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端.当某段驱动电路地输出端为高电平时,则该端所连接地字段导通并点亮,根据发光字段地不同组合可显示出各种数字或字符.此时,要求段驱动电路能提供额定地段导通电流,还需根据外接电源及额定段导通电流来确定相应地限流电阻.要使数码管显示出相应地数字或字符,必须使段数据口输出相应地字形编码.字型码各位定义为:数据线D0与a字段对应,D1与b字段对应……,依此类推.如使用共阳极数码管,数据为0表示对应字段亮,数据为1表示对应字段暗;如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮.如要显示“0”,共阳极数码管地字型编码应为:11000000B(即C0H);共阴极数码管地字型编码应为:00111111B(即3FH).依此类推,可求得数码管字形编码如表3-5所示.表3-5数码管字符表显示地具体实施是通过编程将需要显示地字型码存放在程序存储器地固定区域中,构成显示字型码表.当要显示某字符时,通过查表指令获取该字符所对应地字型码.3.5.2数码管显示电路图3-10 四位八段数码管动态显示电路图3-10为本次设计所用到地四位八段数码管动态显示,其中段选接到单片机地P0口,位选接到单片机地P2口地低四位.其中P0口也接地有上拉电阻,图中未标示出来,会在下面地总体电路中标示出来.采用地是动态显示方式.3.6 硬件电路总体设计图3-11为本次设计地硬件总体设计图,其中利用K1,K2,K3处进行报警温度地设置,然后有DS18B20进行实时温度采集,并在数码管上同步显示,若采集到地温度达到或者超过预设地报警温度,则LED 灯会发光报警,若低于该报警温度,则不会报警.P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1P2.2 P2.3图3-11 硬件电路总体设计图4.软件设计方案4.1主程序介绍4.1.1主程序流程图本次设计首先对程序进行初始化,然后打开报警温度设定开关,对报警温度进行设定,确认设定值后,DS18B20温度传感器进行温度采集并送入单片机中,单片机将传感器所检测到地温度同步显示在数码管上,并且与设置地报警温度进行比较,若达到或者超过报警温度时,LED灯发光报警,如果没有达到,则继续进行温度采集.图4-1主程序流程图4.1.2主流程地C语言程序main (){ALERT=0。
Linux下的ds18b20驱动
for(j=90;j>0;j--);
}
void msdelay(unsigned int i) //延时i ms
{
for(i=i;i>0;i--)
usdelay(1000);
}
void SetL(void)
{
s3c2410_gpio_cfgpin(DS_PIN,OUT);
int i;
for(i=0;i>=1;
}
}
unsignedint ds_read(void) //从18b20读一个字节的数据
{
unsigned int uidata=0;unsigned int i;
for(i=0;i>=1;
SetL();
udelay(1);
s3c2410_gpio_setpin(DS_PIN,1);
mdelay(50);
ds_start();
ds_send(Skip_ROM); //跳过读序号列号的操作
ds_send(Read); //准备读温度
tl=ds_read();
th=ds_read();
th0)
{
printk(copy data failed\n);
return -1;
}
//else
// printk(copy data succese\n);
flag=0;
SetH();//初始化成功后赋为高电平准备从外界读入温度
udelay(400);
return flag;
}
void ds_send(unsigned int uidata) //向18b20写入一个字节的数据
DS18B20温度传感器详细注解及驱动程序解析
DS18B20独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20的双向通讯。
测温范围-55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)1℃。
支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
工作电源:3.0~5.5V/DC(可以数据线寄生电源)在使用中不需要任何外围元件。
测量结果以9~12位数字量方式串行传送。
如果使用51单片机的话,那么中间那个引脚必须接上4.7K~10K的上拉电阻,否则,由于高电平不能正常输入/输出,要么通电后立即显示85℃,要么用几个月后温度在85℃与正常值上乱跳。
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)发出此命令之后,接着发出64 位ROM 编码,访问单总线上与该编码相符合ROM 55H对应的DS1820 使之作出响应,为下一步对该DS1820 的读写作准备。
用于确定挂接在同一总线上DS1820 的个数和识别64 位ROM 地址。
为搜索ROM FOH操作各器件作好准备。
跳过ROM CCH 忽略64 位ROM 地址,直接向DS1820 发温度变换命令。
告警搜索ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。
RAM命令启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75m温度变换44Hs)。
结果存入内部第0、1字节RAM中。
1、复位操作复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
温湿度测量系统--基于单片机和温度传感器DS18B20、HS1101是电容式空气湿度传感器
摘要此温湿度测量系统是基于单线式温度传感器DS18B20、电容式湿度传感器单片机STC89C52 对温度湿度分别测量并通过液晶显示屏1602经行显示。
温度传感器DS18B20是单线式,体积超小,硬件开消超低,抗干扰能力强,精度高,附加功能强的理想单片机温度传感器,可实时根据指令给出温度数据,可读性高。
HS1101是电容式空气湿度传感器,在不同的湿度环境下呈现出不同的电容值,0%~100%RH湿度范围内,电容从162PF变化到200PF,误差误差为2%RH。
可见其精度非常高,为了反映出其电容的变化,本系统采用555多谐震荡电路产生不同的频率,用于检测湿度。
单片机采集到两个传感器给出的数据进行处理与计算,得出当前的温度与湿度并送给液晶屏显示。
本系统具有可读性高,稳定性高,反应速度快,测量值准确的特点。
关键词:温湿度测量系统精度高速度快体积小Abstract: The temperature and humidity measurement system is based on singleline type temperature sensor DS18B20, capacitive moisture sensorSCM STC89C52 for temperature humidity measurement and respectively by LCD display. The line 1602 Temperature sensor DS18B20 is singleline type, volume super-small, hardware KaiXiao ultra-low, strong anti-jamming capability, high precision, additional features strong ideal single-chip microcomputer temperature sensor, real-time temperature data, depending on the directive given readable. HS1101 is capacitive sensor, air humidity in different humidity presents different capacitance, 0% ~ 100% RH humidity, within the scope of capacitance change to 200PF, from 162PF error for 2% RH error. e can see its precision is very high, in order to reflect the capacitance change, the system USES the 555 more harmonic concussion circuits produce different frequency, which is used to detect humidity. SCM acquisition to two sensor gives data processing and calculated, the current temperature and humidity and give the display on the LCD panel. This system has a readable, high stability, reaction speed, measured values exact characteristic.Keywords: temperature and humidity measurement system high precision speed small volume目录1.设计要求 (3)2. 方案设计及论证 (3)2.1 总体方案设计 (3)2.2系统主要单元的选择与论证 (3)2.2.1单片机控制模块的选择论证 (3)2.2.2温度湿度检测模块的选择与论证 (3)2.2.3显示模块的选择与论证 (3)2.3 系统组成 (4)3. 理论分析及计算 (4)3.1 (4)3.2..........................................................................................错误!未定义书签。
温度传感器DS18B20驱动程序
#include "ds18b20.h"#include <intrins.h>#if 0/*************************************************************************** *FUNCTION NAME: InitDS18b20*CREATE DATE: 2009/11/12*CREATED BY: XS*FUNCTION: 复位DS18B20和检测存在脉冲*MODIFY DATE: 2009/11/12*INPUT: 无* *RETURN: 初始化成功,返回1,否则返回0***************************************************************************/ BOOL InitDs18b20(void){BOOL flag = FALSE;BIT bt;bt = ET0;ET0 = 0;DQ = 1;Delay70us(1); //稍作延时DQ = 0; // 复位Delay70us(8); //精确延时大于480usDQ = 1; //拉高总线,等待存在脉冲Delay70us(1); // 60-75us之间if(0==DQ){flag = TRUE;}Delay70us(8); // 复位后大于480us延时ET0 = bt;return flag;}/****************************************************************************FUNCTION NAME: ReadByte*CREATE DATE: 2009/11/12*CREATED BY: XS*FUNCTION: 从DS18B20中读取一个字节的数据*MODIFY DATE: 2009/11/12*INPUT: 无* *RETURN: 读取的数据***************************************************************************/ UCHAR ReadByte(void){UCHAR i;UCHAR dat = 0;BIT bt;bt = ET0;ET0 = 0;for (i=0;i<8;i++){dat >>= 1;DQ = 0;Delay5us();DQ = 1;Delay5us();if(1==DQ){dat |=0x80;}Delay70us(1);}ET0 = bt;return(dat);}/****************************************************************************FUNCTION NAME: WriteByte*CREATE DATE: 2009/11/12*CREATED BY: XS*FUNCTION: 向DS18B20中写入一个字节的数据*MODIFY DATE: 2009/11/12*INPUT: 写入的数据**RETURN: 无***************************************************************************/ void WriteByte(UCHAR wDat){UCHAR i;BIT bt;bt = ET0;ET0 = 0;for (i=0; i<8; i++){DQ = 0;Delay5us();if((wDat & 0x01)!=0){DQ = 1;}else{DQ = 0;}Delay70us(1);DQ = 1;Delay5us();wDat >>= 1;}ET0 = bt;}/*************************************************************************** *FUNCTION NAME: ReadDs18b20*CREATE DATE: 2009/11/12*CREATED BY: XS*FUNCTION: 从DS18B20储存器中读取多字节数据*MODIFY DATE: 2009/11/12*INPUT: 读取数据存入的地址和需要读取数据的数量**RETURN: 无***************************************************************************/ void ReadScrat(UCHAR *prDat,UCHAR num){UCHAR i;for(i=0;i<num;i++){*prDat = ReadByte();prDat++;}}/*************************************************************************** *FUNCTION NAME: ReadTemp*CREATE DATE: 2009/11/12*CREATED BY: XS*FUNCTION: 读取温度*MODIFY DATE: 2009/11/12*INPUT: 读取的温度存入的地址**RETURN: 成功返回1,否则返回0***************************************************************************/ BOOL ReadTemp(float *prTemperature){UCHAR counter = 0;UCHAR tempBuff[9];float tempDat = 0;ClrWDT();while(1){if(InitDs18b20()){counter = 0;break;}else{counter++;if(counter>=ERR_COUNTER) // 连续3次初始化失败,即认为DS18B20出现故障{return 0;}}}WriteByte(SKIP_ROM); // 跳过读序号列号的操作WriteByte(CONVERT_T); // 启动温度转换Delay70us(20); // 延时至少500us,以供温度转换while(1){if(InitDs18b20()){counter = 0;break;}else{counter++;if(counter>=ERR_COUNTER) // 连续3次初始化失败,即认为DS18B20出现故障{return 0;}}}WriteByte(SKIP_ROM); //跳过读序号列号的操作WriteByte(READ_SCRAT); //读取温度寄存器等(共可读9个寄存器)ReadScrat(tempBuff, 9);if(0==CRC8(tempBuff,9)){if(0==(tempBuff[1]&0x80)) //为正温度{tempDat = (tempBuff[1]&0x07)*0x100 + tempBuff[0];}else{tempDat = ((0xFF-tempBuff[1])&0x07)*0x100 + (0x100-tempBuff[0]);tempDat = -tempDat;}*prTemperature = tempDat * 0.0625;return TRUE;}return FALSE;}/****************************************************************************FUNCTION NAME: GetDS18B20Temperature*CREATE DATE: 2009/8/17*CREATED BY: XS*FUNCTION: 采样3次求均值作为温度值*MODIFY DATE: 2009/8/17*INPUT: 温度储存的地址* *RETURN: 正常为1,故障为0***************************************************************************/BOOL GetDS18B20Temperature(float *pgTemperature){UCHAR i;UCHAR counter = 0;float tempDat = 0;float tempVal = 0;for(i=0;i<3;){if(ReadTemp(&tempDat)){tempVal += tempDat;counter = 0;i++;}else{counter++;if(counter>=ERR_COUNTER) //连续10次温度采样错误,则判断为故障,并返回{return FALSE;}}}*pgTemperature = tempVal / 3;// SendStr("boxTemp:");// print(*pgTemperature ,1);// SendChar('\n');return TRUE;}/****************************************************************************FUNCTION NAME: CRC8*CREATE DATE: 2009/8/17*CREATED BY: XS*FUNCTION: CRC效验*MODIFY DATE: 2009/8/17*INPUT: 需要效验的数据地址和个数**RETURN: 效验结果***************************************************************************/UCHAR CRC8(UCHAR *point,UCHAR CRClen) //效验成功则crc返回0{UCHAR i,j,crc_8,crcbuff;crc_8 = 0;for(i=0; i<CRClen; i++){crcbuff=*point++;for(j=0;j<8; j++){if(((crc_8 ^ crcbuff)&0x01)==0){crc_8 >>= 1;}else{crc_8 ^= 0x18;crc_8 >>= 1;crc_8 |= 0x80;}crcbuff >>= 1;}}return crc_8;}/*************************************************************************** *FUNCTION NAME: Delay5us*CREATE DATE: 2009/8/17*CREATED BY: XS*FUNCTION: 延时5us*MODIFY DATE: 2009/8/17*INPUT: 无* *RETURN: 无***************************************************************************/ void Delay5us(void){// UCHAR i;// for(i=0;i<7;i++);_nop_();_nop_();}#endif/*************************************************************************** *FUNCTION NAME: Delay70us*CREATE DATE: 2009/8/17*CREATED BY: XS*FUNCTION: 延时70us*MODIFY DATE: 2009/8/17*INPUT: 次数* *RETURN: 无***************************************************************************/ void Delay70us(UCHAR timers){UCHAR i,j;for(j=0;j<timers;j++){for(i=0;i<22;i++){// Delay5us();_nop_();_nop_();_nop_();}}}。
DS18B20数字温度计设计实验报告(1)
单片机原理及应用课程设计报告书题目:DS18B20数字温度计姓名:李成学号:133010220指导老师: 周灵彬设计时间: 2015年1月目录1. 引言 (3)1.1。
设计意义31。
2.系统功能要求32。
方案设计 (4)3。
硬件设计 (4)4. 软件设计 (8)5。
系统调试106. 设计总结 (11)7. 附录 (12)8。
参考文献15DS18B20数字温度计设计1.引言1.1. 设计意义在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。
而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持。
其缺点如下:●硬件电路复杂;●软件调试复杂;●制作成本高。
本数字温度计设计采用美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感器DS18B20作为检测元件,测温范围为—55~125℃,最高分辨率可达0.0625℃.DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的热点。
1.2. 系统功能要求设计出的DS18B20数字温度计测温范围在0~125℃,误差在±1℃以内,采用LED数码管直接读显示。
2. 方案设计按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路.数字温度计总体电路结构框图如4。
1图所示:图4.13. 硬件设计温度计电路设计原理图如下图所示,控制器使用单片机AT89C2051,温度传感器使用DS18B20,使用四位共阳LED 数码管以动态扫描法实现温度显示。
AT89C51 主 控制器 DS18B20 显示电路 扫描驱动主控制器单片机AT89C51具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要,很适合便携手持式产品的设计使用.系统可用两节电池供电。
AT89C51的引脚图如右图所示:VCC:供电电压。
GND:接地.P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
万年历时钟(ds1302)+温度显示(ds18b20)原理图
P3.0 (RXD) P3.1 (TXD) P3.2 (INT0) P3.3 (INT1) P3.4 (T0) P3.5 (T1) X1 X2 IC2 89C51 P27 P26 P25 P24 P23 P22 P21 P20
Байду номын сангаас
28 27 26 25 24 23 22 21
LED2
DIG0_C
DIG4_B
DIG0_B
SD3
DP3
SG3
SD2
DP2
SG2
SD2
DP2
SG2
SD1
DP1
SG1
SD1
DP1
SC3
SC2
SC2
SC1
SC1
SE3
SE2
SE2
SE1
SE1
6
A4
d
h
g
d
h
g
d
h
g
d
h
g
d
h
g
e
c
e
c
e
c
e
c
e
c
R12 1.5k
S7 DP3 S6 SA3 S16 S5:减键,代码05 C S8 S6:加键,代码06 S7:调节时间,代码 07
R12 1.5k C7 104 C7 15P
5V 5V 1 2 3 4 5 CS1 6 CLK1 7 DATA1 8 9 KEY1 10 11 12 13 14 驱动第一排 VDD VDD NC VSS NC CS CLK DATA KEY SG SF SE SD SC HD7279A RESET RC CLKO DIG7 DIG6 DIG5 DIG4 DIG3 DIG2 DIG1 DIG0 DP SA SB 28 27 26 25 24 23 22 21 20 19 18 17 16 15
DS18B20驱动程序
DS18B20驱动程序作者: 嵌入式应用软件园目录第1章程序功能 (3)第2章程序代码 (4)第3章DS18B20简介 (11)3.1 DS18B20概述 (11)3.2 DS18B20的内部结构 (11)3.3 DS18B20温度传感器的存储器 (12)3.4 DS18B20使用中注意事项 (13)3.4 DS18B20常用命令详述 (14)DS18B20驱动程序DS18B20_MAIN,您可以直接在你的应用当中使用,直接返回温度的BCD码值。
BCD码值可以直接在数码管或LCD 上显示出来。
驱动程序中包含DS18B20温度传感器用到的全部函数。
如,DS18B20的复位函数(RESET_18B20)、写函数(WRITE_18B20)、读函数(READ_18B20),读出ROM中64的ID函数(READ_18B20ID),搜索DS18B20的ID函数(CHECK_18B20ID),警报搜索(ALARM_18B20ID)。
直接调用函数RE_TEMP,会返回当前的温度值。
再经过函数CONV_TEMP转换后,可以返回温度值的BCD码值。
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
如需源代码/此代码技术支持,请访问: 嵌入式应用软件园。
第3章DS18B20简介3.1 DS18B20概述DS18B20 “一线总线”数字化温度传感器是DALLAS最新单线数字温度传感器,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
DS18B20驱动调试要点
实现一个字节读与写。需要把握的一点就是代码里面的延时一定要是在DS18B20时序的允许范围内,因为DS18B20是一个对时序精度要求很高的器件。
/********************************************************************************
3.DS18B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。
4.DS18B20拉低电平60~240us之后,会释放总线。
DS18B20复位C代码:
static void Ini tDS18B20(void)
{
DS18B20_INPUT;
SETDQ;
RESETDQ;
详细的芯片说明具体可参看Datasheet
2.
DS18B20一般都是充当从机的角色,而单片机就是主机。单片机通过一线总线访问DS18B20的话,需要经过以下
几个步骤:
1.DS18B20复位。
2.执行ROM指令。
3.执行DS18B20功能指令(RAM指令)。
一般我们都是使用单点,也就是说单线总线上仅有一个DS18B20存在而已。所以我们无需刻意读取ROM里边的
DS18B20写逻辑0的步骤如下:
1.单片机拉低电平大约10~15us。
2.单片机持续拉低电平大约20~45us的时间。
3.释放总线
DS18B20写逻辑1的步骤如下:
1.单片机拉低电平大约10~15us,。
2.单片机拉高电平大约20~45us的时间。
3.释放总线
DS18B20读逻辑0的步骤如下:
基于单片机和DS18B20的数字温度计
温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验中,有特别重要的意义。
随着人们生活水平的不断提高,,人们对温度计的要求越来越高,传统的温度计功能单一、精度低,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
数字温度计(Digital Thermometer)简称D温度是许多监控系统中的一个重要参数。
TM,它是采用数字化测量技术,把连续的温度值转换成不连续、离散的数字形式并加以显示的仪表。
采用单片机控制的数字温度计,由于精度高、可扩展性强、集成方便、抗干扰能力强,得到了广泛的应用。
本设计以单片机和温度传感器为核心,设计数字温度计。
实现对温度的采集、监视和报警。
在温度采集的实现中,使用了AT89C51单片机和温度传感器DS18B20,温度监视部分利用动态驱动技术,以单片机驱动4位LED数码管。
温度测量范围-55℃~+125℃,通过按键设置上下限报警温度,并用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到设计要求。
正文还介绍了AT89C51和集成温度传感器DS18B20。
1 设计的意义及主要功能 (3)1.1 意义 (3)1.2 主要功能 (3)2 总体方案设计 (4)2.1 方案比较 (4)2.2 方案论证 (5)2.3 方案选择 (5)3 硬件电路设计 (6)3.1 元器件的选择 (6)3.2 电路原理图 (6)3.3 特殊元器件的介绍 (6)3.3.1 AT89C51介绍 (6)3.3.2 DS18B20介绍 (9)4 总结 (13)5 参考文献 (13)附录 (14)1 设计的意义及主要功能1.1 意义随着人们生活水平的不断提高,数字化无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,一切向着数字化控制,智能化控制方向发展。
数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。
DS18B20驱动
DS18B20驱动一.概述DS18B20是一种单总线数字温度传感器。
测试温度范围-55℃-125℃,温度数据位可配置为9、10、11、12位,对应的刻度值分别为0.5℃、0.25℃、0.125℃、0.0625℃,对应的最长转换时间分别为93.75ms、187.5ms、375ms、750ms。
出厂默认配置为12位数据,刻度值为0.0625℃,最长转换时间为750ms。
从以上数据可以看出,DS18B20数据位越低、转换时间越短、反应越快、精度越低。
单总线,意味着没有时钟线,只有一根通信线。
单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。
需要注意的是,DS18B20和同一系列的DS18S20,在读写上,时序、命令一致,但因温度值存放的位置不一样,对温度数据的处理也不一样,所以程序不能直接套用。
二.电路设计在WSF-51DB开发板上,利用AT89S52单片机的P1.1脚来驱动DS18B20,上拉电阻阻值为4.7K欧姆。
DS18B20的上拉电阻的阻值是一个需要注意的参数,如果DS18B20放置的位置离电路板较远,需要用较长的电缆来连接时,上拉电阻要相应减小,以弥补线路损耗,而且连接电缆要选用优质的三芯带屏蔽层的电缆,否则不能正常读写数据。
三.软件设计/***************************************************************** *程序名称:DS18B20驱动*程序功能:读写DS18B20,数码管显示温度值,温度值精度为0.1度。
*开发工具:WSF-51DB开发板* MCU型号:AT89S52-24PU*时钟频率:11.0592-12MHZ*程序作者:吴师傅*版权说明:吴师傅版权所有,转载请注明来源和作者。
*****************************************************************/#i nclude <reg52.h>#i nclude <intrins.h>unsigned char tempflag,fraction,tempr;unsigned char code segmcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0 x7f,0x6f};//共阴极数码管段码0-9 unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//8位共阴极数码管位码unsigned char code fractioncode[]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};//将DS18B20的小数部分的0-f刻度转换为0-9刻度的查找表,将精度化为0. 1度sbit ser=P2^0;//74HC595串行数据输入sbit oe=P2^1;//74HC595使能sbit rclk=P2^2; //74HC595数据锁存sbit srclk=P2^3;// 74HC595串行时钟sbit DQ=P1^1; //温度总线//延时函数(12MHZ晶振):void Delayus(unsigned char t){ //此函数精确计算:18+6*(t-1)=延时时间(us)while(t--);}//延时ms延时函数:void Delayms(unsigned int t){unsigned int i,j;for(i=t;i>0;i--)for(j=0;j<120;j++);}//任意位数码管显示一个字符函数:void DTDisplayChar(unsigned char segmd,unsigned char bitd )//数码管段码和数码管位码{unsigned char i;unsigned int dat;oe=1;//输出为高阻dat=bitd;dat=dat<<8|segmd; //位码段码合并为一个int型数据for(i=0;i<16;i++)//16位数据从高位依次移入74HC595{ser=(dat&0x8000)?1:0; //判断最高位,为真取1,为假取0srclk=1; //上升沿送数据srclk=0;dat<<=1; //左移取下一位}rclk=1;//74HC595锁存数据rclk=0;oe=0;//输出数据}//DS18B20复位函数:void Reset18B20(void){DQ=0;//拉低,开始复位操作Delayus(100);//延时至少480usDQ=1;//拉高,释放总线控制权while(DQ);//等待器件应答(器件拉低),约15-60us后while(!DQ);//应答脉冲出现后,等待器件拉高,约60-240us后}//DS18B20写命令函数:void Write18B20(unsigned char com){unsigned char i;for(i=0;i<8;i++){DQ=0;//开始写操作_nop_(); _nop_();//至少延时1usDQ=com&0x01;//写数据Delayus(2);//延时,器件在45us内采样DQ=1;//释放总线控制权com>>=1; //右移1位,写下一位}}//DS18B20读数据函数:unsigned char Read18B20(){unsigned char i,rdata=0;for(i=0;i<8;i++){DQ=0;//开始读操作_nop_();_nop_();//至少延时1usDQ=1;//释放总线控制权,15us内要读取数据if(DQ==1) rdata|=0x01<<i;Delayus(10);//延时要大于45us.读0时,45us后器件才拉高总线}return rdata;}//读出温度函数:void Read18B20Temperature(){unsigned char templ,temph,temp;unsigned int tempv;Reset18B20();//复位Write18B20(0xcc);//写命令,跳过ROM编码命令Write18B20(0x44);//转换命令while(!DQ);//等待转换完成Reset18B20();//复位Write18B20(0xcc);//写命令,跳过ROM编码命令Write18B20(0xbe);//读取暂存器字节命令templ=Read18B20();//读低字节temph=Read18B20();//读高字节Reset18B20();//复位tempv=temph;tempv=tempv<<8|templ;//两个字节合并为一个int型数据temp=(unsigned char)(tempv>>4);//去掉小数部分,化成char型数据if((temph&0x80)==0x80)//如果是负温度{tempflag=1; //负号显示tempr=~temp+1; //实际温度值为读取值的补码fraction=fractioncode[(~templ+1)&0x0f];//取小数部分补码,将16刻度转换为10刻度,精度为0.1度}else//如果是正温度{tempflag=0;//正温度,负号不显示tempr=temp;//fraction=fractioncode[templ&0x0f];//取小数部分,将16刻度转换为10刻度,精度为0.1度}}//主函数:int main(void){tempflag=0;while(1){Read18B20Temperature();//读取温度值DTDisplayChar(segmcode[fraction],0x7f);//显示小数部分Delayms(1);DTDisplayChar(segmcode[tempr%10]|0x80,0xbf);//显示个位和小数点Delayms(1);DTDisplayChar(segmcode[tempr%100/10],0xdf);//显示十位Delayms(1);if(tempflag==1) DTDisplayChar(0x40,0xef);//如果是负温度就显示“-”else DTDisplayChar(segmcode[tempr/100],0xef);//显示百位Delayms(1);DTDisplayChar(0xff,0xff);//均衡数码管亮度}return 0;}。
温度传感器DS18B20的驱动方法
温度传感器DS18B20的驱动方法在这一小节中将对DS18B20温度传感器进行介绍,包括其功能、结构、驱动方法等内容。
(1)DS18B20温度传感器简介DS18B20数字温度计提供9位到12位(可配置)的温度读取,指示设备上的温度。
数据信息是通过一线接口(1Wire Interface ),即只需要一条线就可以把很多DS18B20连接到中央处理器上。
同时,用以读取数据和温度转换的电源也可以通过数据线来提供,而无需外部电源。
由于每一个DS18B20内部都有一个唯一的序列号,所以多个DS18B20可以同时存在于一线总线上。
这样就可以把多个温度传感器放置于不同的位置。
可以广泛应用于环境控制,建筑物、设备或机器内部温度的测量及进程监控与控制。
DS18B20的引脚定义:引脚功能详细描述:(在表中没有提到的引脚可以不接。
)(2)DS18B20的硬件结构及功能详述DS18B20的硬件结构请看如下框图:通过对配置寄存器进行配置,可以使其工作在9位~12位四种模式下。
以下是配置寄存器的功能介绍:D4~D0总为1,D7总为0。
R1,R0:工作模式选择。
各位工作模式下,温度测量所需时间不同。
如下表所示:配置寄存器位于SCRATCHPAD 寄存器组中,此寄存器组的定义如下:其中第一个与第二个字节就是测量所得的温度的数量,乘以相应工作模式下的分辨率就是所要求的温度值。
以12位模式为例,予以说明:上电后默认值为+85摄氏度。
(3)DS18B20的驱动方法:这里将对一线接口时序进行介绍,一线接口对时间比较敏感,下面的例程运行于22.1184的外部振荡频率下。
其中使用的延时函数在此振荡频率下的实测延时时间约为:(参数×5+8)us。
1)初始化初始化时序图如下://初始化函数Init_DS18B20(void){unsigned char x=0;DQ=1;//DQ复位Ldelay(8);//稍做延时DQ=0;//单片机将DQ拉低Ldelay(100);//精确延时大于480usDQ=1;//拉高总线Ldelay(14);x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败Ldelay(20);}2)写一个字节写1:写0://写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i){DQ=0;DQ=dat&0x01;Ldelay(5);DQ=1;dat>>=1;}}3)读取一个字节//读一个字节unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat=0;for(i=8;i>0;i){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;Ldelay(4);}return(dat);}4)读取温度测量所得的温度位于SCRATCHPAD寄存器组前两个字节,读取过程中涉及到三个命令。
手把手教你做DS18B20与SPCE061A的驱动程序——Mz出品
手把手教你做DS18B20与SPCE061A的驱动程序——Mz出品1 DS18B20简介DS18B20 是DALLAS 公司生产的一线制数字温度传感器,具有3 引脚TO-92 小体积封装形式;温度测量范围为-55℃~+125,电源供电范围为3V~5.5V ;℃可编程为9 位~12 位数字表示,测温分辨率可达0.0625℃,被测温度用符号扩展的16 位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20 可以并联到 3 根(VDD、DQ和GND)或2 根(利用DQ线供电、GND)线上,CPU 只需一根端口线就能与总线上的多个串联的DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20 非常适用于远距离多点温度检测系统。
1.1 DS18B20内部结构DS18B20 的管脚排列及封装形式如图 2.1所示,DQ 为数字信号输入/输出端;GND 为电源地;VDD 为外接供电电源输入端(在寄生电源接线方式时接地,见),NC表示无连接。
DS18B20 内部结构如图 2.2所示,主要由4 部分组成:64 位ROM、温度传感器、非易失性存储的温度报警触发器TH 和TL、配置寄存器。
此主题相关图片如下:主控制MCU与DS18B20 的通信需要经过一线制的接口DQ;DS18B20内部有一个64位的ROM,在出芯片出厂前已用激光在ROM当中刻录上唯一的一个序列号(包含产品型号、ID号以及CRC 校验数值)。
在一线制接口情况下在ROM 操作未定建立之前不能使用存储器和控制操作,MCU 必须首先提供五种ROM 操作命令之一:1、Read ROM(读ROM); 2、Match ROM(匹配ROM);3、Search ROM(搜索ROM);4、Skip ROM(跳过ROM); 5、Alarm Search(告警搜索)。
这些命令对每一器件的64 位ROM 部分进行操作,如果在总线上有许多器件,那么可以挑选出一个特定的器件或者给总线上的主控MCU指示存在多少器件及其类型;在成功地执行了ROM 操作序列之后可使用存储器和控制操作,然后主机可以提供六种存储器和控制操作命令之一,以此对总线上的某一个DS18B20进行操作,如启动测温转换、读取数据等。
基于51单片机的DS18B20温度传感器驱动程序加详解
基于51单片机的DS18B20温度传感器驱动程序加详解//此部分为18B20的驱动程序//本程序验证通过,晶振为12MHz#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7; //DQ接P3^7#define NOP() _nop_()#define _Nop() _nop_()void TempDelay (unsigned char idata us); //延时函数定义void Init18b20 (void); //初始化函数定义void WriteByte (unsigned char idata wr); //单字节写入void read_bytes (unsigned char idata j); //定义多字节数据读取unsigned char CRC (unsigned char j);//定义校验码数组void GemTemp (void); //数据处理void Config18b20 (void); //配置上下限即处理位数(9/10/11) void ReadID (void); //读取器件ID,即ROM中的数据void TemperatuerResult(void); //最终数据输出//bit flag;unsigned int idata Temperature,D[10]; //定义温度数组unsigned char idata temp_buff[9]; //定义RAM数据暂存数组//存储读取的字节,read scratchpad为9字节,read rom ID为8字节unsigned char idata id_buff[8]; //定义ROM数据暂存数组unsigned char idata *p,TIM; //指针变量unsigned char idata crc_data; //CRC计算变量定义unsigned char code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62 , 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 12 8, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29 , 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 2 05,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 2 38,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 1 45, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 2 44, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 2 15, 137, 107, 53};//CRC数据表//Function:延时处理void TempDelay (unsigned char idata us){while(us--);}//Function:18B20初始化void Init18b20 (void){D18B20=1; //侦测到下跳沿,初始化_nop_();D18B20=0;TempDelay(160); //delay480 us (480)_nop_();D18B20=1; //释放总线TempDelay(30); //delay 96 us (60-112)_nop_();_nop_();_nop_(); //18B20侦测到此上升沿,会自动应答//发送presence信号//if(D18B20==0)// flag = 1; //detect 1820 success!//else// flag = 0; //detect 1820 fail!TempDelay(30); //delay 96 us(60-240)_nop_(); //发送应答脉冲_nop_();D18B20 = 1; //释放总线}//Function:向18B20写入一个字节void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 1;_nop_();D18B20 = 0; //侦测到下跳沿,初始化_nop_();D18B20=wr&0x01; //写数据在(60-120)us内TempDelay(30); //delay 96(60-120)us_nop_();_nop_(); //至少大于1us恢复时间D18B20=1; //释放总线wr >>= 1; //一个字节8位,总共写8次}}//Function:读18B20的一个字节unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 1;_nop_();D18B20 = 0; //负跳沿,初始化u >>= 1;D18B20 = 1; //释放总线if(D18B20==1)u |= 0x80;TempDelay (3); //15us内采样_nop_();}return(u);}//Function:读18B20void read_bytes (unsigned char idata j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}//Function:CRC校验unsigned char CRC (unsigned char j){unsigned char idata i,crc_data=0;for(i=0;i<j;i++) //查表校验crc_data = CrcTable[crc_data^temp_buff[i]]; return (crc_data);//返回i=8时的crc_data}//若为0,校验正确,即此时的temp_buff[8]=0x00; //Function:读取温度void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{ //暂存器第0字节低8位,第一字节为高8位。
有关于iic以及ds18b20驱动的解读
有关于iic以及ds18b20驱动的解读对于任何一个芯片的使用都离不开对芯片手册的解读,手册中的时序图以及协议必须完全的知晓,才能将芯片正确的使用起来:首先来了解一下使用iic协议的比较常见的AT24C02 这款芯片:通过手册我们可以知道:这款芯片有A0、A1、A2着三个地址管脚,将这三个管脚任意的接上VCC或者是GND都可以构成这款芯片的序列号、在实际的使用中就能够通过总线来进行寻址,然后发送地址,就能对应某一个芯片,并且由此可知,总线上最多可以连接8个这样的芯片,只要改变管脚的三个地址位,就能轻松实现对不同的芯片的控制。
芯片上除了这三个地址管脚之外还有一个WP,是用来写保护的,当这个管脚上是高电平的时候,是没有办法将我们所要的数据写进这款芯片中的,只有当它为低电平的时候才能对这款芯片进行操作。
正常情况下,在使用的时候都是通过硬件电路直接将这个管脚连在GND上。
还有就是Vcc跟Vss分别接上+5V和地,SDA和SCL分别是我们这款芯片的数据位和时钟位,也是我们操作这款芯片的重点。
根据手册的解读,我们可以了解到在时钟线为高电平的时候,数据线要保持不变,如果数据线在时钟线高电平期间,由高电平变为低电平,说明了iic总线协议的开始,如果由低电平变为高电平时,说明了总线协议的结束。
在时钟线为低电平的时候才允许数据线进行跳变并进行传输数据。
在解读时序图的时候底下着两张图很重要。
因为这两张图包含了在写时序图当中的一点细节。
如果这些细节没有处理好的话就会出现芯片不会正常工作的状况。
接下类介绍各个驱动的书写和处理:1、起始信号:由上面的时间表查出来的时间显示,起始信号建立的时间至少是4.7us。
因为时序图是完全按照现实的时间走向画出来的,所以从左向右可以想象成是一个时间轴。
然后看上面这张起始信号的图有可以知道,显示SCL由低电平变为高电平然后保持至少4us的时间。
SDA才开始由高电平变为低电平,在低电平的这段时间查表就可知,这个起始信号保持的时间至少是4us。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char cs;
WRBYTE(0XBE); //读暂存器 命令
tplsb=RDBYTE(); //温度值低位字节(其中低四位为二进制小数部分)
tpmsb=RDBYTE(); //温度值高位部分(其中高五位为符号位)
}
DQ=1;
i++; //延时15us以上,读时隙下降延后15us,ds18b20输出数据才有效
i++;
b=DQ;
i=8;
while(i>0) i--; //读时隙不低于60us
return (b);
}
/*读取数据的一个字节*/
/*读取温度值*/
void RDTEMP(void)
{
TXRESET(); //产生复位脉冲,初始化ds18b20
RXWAIT(); //等待应带脉冲
delay(1); //延时
WRBYTE(0XCC); //skip Rom命令
#include<reg51.h>
#include<intrins.h>
unsigned char dispram[4];
unsigned long int buf=0;
unsigned char i=0;
unsigned char code temp_float[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
else cs++;
if(cs==2)
writesegdata(dispram[cs]+10);/*在小时的末位显示一个点*/
else
writesegdata(dispram[cs]);
writecsdate(1<<cs);
}
void writesegdata(unsigned char seg) /*数码管段选驱动*/
{
cs=0;
TMOD=0x90;
TH1=0XEF;
TL11=1;
}
void timer13ST(void) interrupt 3 /*数码管点亮中断*/
{
TH1=0XEF;
TL1=0XFF;
TF1=0;
if(cs>=3) cs=0;
d[4]=tplsb&0x10;
d[5]=tplsb&0x20;
d[6]=tplsb&0x40;
d[7]=tplsb&0x80;
d[8]=tpmsb&0x01;
d[9]=tpmsb&0x02;
d[10]=tpmsb&0x40;
disper=d[10]*64+d[9]*32+d[8]*16+d[7]*8+d[6]*4+d[5]*2+d[4]*1+d[3]/2+d[2]/4+d[1]/8+d[0]/16;
}
}
void trf(void)
{
unsigned long int current_temp;
/*unsigned char ng=0; // 负温度标志
if((tpmsb)&0xf8==0xf8)
{
tpmsb=~tpmsb;
tplsb=~tplsb+1;
void WRBYTE(unsigned char b)
{
unsigned int i;
unsigned char j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1; //取下一位
if(btmp)
{
/*写1*/
DQ=0;
i++;
i++; //延时,使得15us以内拉高
DQ=1;
i=8;
while(i>0) i--; //整个写1时隙不低于60us
}
else
{
DQ=0;
/*拉低约900us*/
i=100;
while(i>0) i--;
/*产生上升延*/
DQ=1;
i=4;
while(i>0) i--;
}
/*等待应答脉冲*/
void RXWAIT(void)
{
unsigned int i;
while(DQ);
void writecsdate(unsigned char );
void TXRESET(void);
void RXWAIT(void);
bit RDBIT(void);
unsigned char RDBYTE(void);
void WRBYTE(unsigned char b);
void CONVERT();
/*检测到应答脉冲*/
while(~DQ);
i=4;
while(i>0) i--;
}
/*读取数据的一位,满足读时隙要求*/
bit RDBIT(void)
{
unsigned int i;
bit b;
DQ=0;
i++; //保持低至少1us
while(1)
{
delay(1); //延时1ms
CONVERT(); //启动温度转换
delay(1000); //延时1s
RDTEMP(); //读取温度
trf();
/********************************************/
unsigned char RDBYTE(void)
{
unsigned char i,j,b;
b=0;
for(i=1;i<=8;i++)
{
j=RDBIT();
b=(j<<7)|(b>>1);
}
return(b);
}
/*写数据的一个字节,满足写1和写0的时隙要求*/
{
cs&=0x0f;
P0=~cs;
_nop_();
_nop_();
P2&=0x3f;
_nop_();
_nop_();
P2|=0xe0;
}
/*产生复位脉冲初始化ds18b20*/
void TXRESET(void)
{
unsigned int i;
{
if(seg>20)
seg=0;
seg=seg_code[seg];
P0=seg;
_nop_();
_nop_();
P2&=0x1f;
_nop_();
_nop_();
P2|=0xe0;
}
void writecsdate(unsigned char cs)/*数码管位选驱动*/
unsigned char tplsb,tpmsb; //温度值地位,高位字节
sbit DQ=P3^5; //数据通讯线
void trf(void); //温度数据转换到显示函数
void writesegdata(unsigned char );
/*写0*/
DQ=0;
i=8;
while(i>0) i--; //保持在60~120us之间
DQ=1;
i++;
i++;
}
}
}
/*启动温度转换*/
void CONVERT(void)
{
TXRESET(); //产生复位脉冲,初始化ds18b20
disper=disper*10;
dispram[0]=disper/100;
dispram[1]=disper%100/10;
dispram[2]=disper/10;
dispram[3]=
disper=0;*/
}
void inittimer1( void) /*数码管点亮中断初始化*/
void RDTEMP(void);
void inittimer1(void);
void delay(unsigned int t) /*延时*/
{
unsigned int i;
while(t--)
{
for(i=0;i<125;i++);
}
}
void main(void)
if(tplsb=0x00) tplsb++;
ng=1;
} */
dispram[3]=temp_float[tplsb&0x0f];
current_temp=((tplsb&0xf0)>>4)|((tpmsb&0x07)<<4);
dispram[0]=current_temp/100;