基于WinAVR的DS18B20源程序

发布者:逍遥游侠最新更新时间:2016-01-06 来源: eefocus关键字:WinAVR  DS18B20  源程序 手机看文章 扫描二维码
随时随地手机看文章
#ifndef _DS18B20_C_

#define _DS18B20_C_


#define DQ_18B20 (1<<3) // PD3
#define DQ_TO_0() (DDRD |= DQ_18B20) // PD3=’0′
#define DQ_TO_1() (DDRD &= ~DQ_18B20) // PD3=’float’
#define DQ_status() (PIND & DQ_18B20) // read PD3 pin


#ifndef CPU_CRYSTAL
#define CPU_CRYSTAL (11.0592)
#endif


#define wait_us(us)
_delay_loop_2((INT16U)((us)*CPU_CRYSTAL/4))


// 1个初始化模块
void ds18b20_config(void); // 配置端口

// 3个基本模块
BOOL ds18b20_reset(void); // 复位DS18B20
void ds18b20_write(INT8U dat); // 写字节到DS18B20
INT8U ds18b20_read(void); // 读字节从DS18B20

// 2个应用模块
void convert_T(void); // 启动温度转换
INT16U read_T(void); // 读取转换值


void ds18b20_config(void)
{
DDRD &= ~DQ_18B20; // 输入模式(上电时为高电平)
PORTD &= ~DQ_18B20; // 输出锁存器写0,以后不再更改
}


BOOL ds18b20_reset(void)
{
BOOL bus_flag;

DQ_TO_0(); // 设置1-wire总线为低电平(占领总线)…


wait_us(490); // 490us

cli(); // 下面这段时间要求比较严格,为保险起见,关中断
DQ_TO_1(); // 设置1-wire总线为高电平(释放总线)


wait_us(67.5); // 最佳时间: 60us+7.5us!(忙延时,只是一种策略)

// 探测总线上是否有器件
if(DQ_status()) bus_flag=FAIL; // 复位单总线但没有发现有器件在线
else bus_flag=SUCC; // 复位单总线并发现有器件在线

sei(); // 退出临界代码区(开中断)


wait_us(490-67.5); // 490-67.5us

return(bus_flag);
}


void ds18b20_write(INT8U dat)
{
INT8U count;

// 每个字节共8位,一次发一位
for(count=0; count<8; count++) {
cli(); // 保证绝对不会发生中断!
DQ_TO_0(); // 设置1-wire总线为低电平
wait_us(2); // about 2us

if(dat&0×01) DQ_TO_1(); // 并串转换,先低位后高位
else DQ_TO_0();
dat >>= 1; // 下一位做好准备

// 60us~120us(实际不能到120us, 因为其它语句也用时间了!)
wait_us(62); // 62us

DQ_TO_1();
sei(); // 恢复系统中断
wait_us(2); // 2us
}
}


INT8U ds18b20_read(void)
{
INT8U count,dat;

dat = 0×00; // 数据接收准备

// 每个字节共8位,一次收一位
for(count=0; count<8; count++) {
cli(); // 保证绝对不会发生中断!

// 从总线拉低到读总线状态,不能大于15us!
DQ_TO_0(); // 设置1-wire总线为低电平(拉低总线以同步)
wait_us(2); // 2us
DQ_TO_1(); // 设置1-wire总线为高电平(释放总线)
wait_us(4); // 4us
dat >>= 1;
if(DQ_status()) dat|=0×80; // 读取总线电平,先收低位再收高位

sei(); // 恢复系统中断
wait_us(62); // 必须大于60us
}
return(dat);
}


void convert_T(void)
{
if(ds18b20_reset()==SUCC) { // 如果复位成功
ds18b20_write(0xcc); // 跳过多器件识别
ds18b20_write(0×44); // 启动温度转换
}
}


INT16U read_T(void)
{
INT16U value=0;

if(ds18b20_reset()==SUCC) { // 如果复位成功
ds18b20_write(0xcc); // 跳过多器件识别
ds18b20_write(0xbe); // 读暂存器
value = (INT16U)ds18b20_read(); // 低字节
value += (INT16U)(ds18b20_read())<<8; // 高字节
}
return(value);
}

#endif

关键字:WinAVR  DS18B20  源程序 引用地址:基于WinAVR的DS18B20源程序

上一篇:mega8的熔丝位设置
下一篇:ATMega8 PWM 功能(T/C 1)测试程序

推荐阅读最新更新时间:2024-03-16 14:42

能够实现单片机计算器与LCD1602字幕滚动的源程序
当你按计算器部分时,自动切换到计算器,按字幕滚动方式时,自动切换到字幕滚动 单片机源程序如下: /* 接盘按键说明: -------------------------------------------------- | 7 | 8 | 9 | / | - - - - - - - - - - - - - | 4 | 5 | 6 | * | - - - - - - - - - - - - - | 1 | 2 | 3 | - | - - - - - - - - - - - - - | C | 0 | = | + | --
[单片机]
能够实现单片机计算器与LCD1602字幕滚动的<font color='red'>源程序</font>
DS18B20-64位序列码读取程序
/*******************************************************************/ /* */ /*51hei单片机开发系统演示程序 - DS18B20-64位序列码读取程序 */ /* * * LCD1602显示 * * * * 工作芯片:STC89C516 晶振频率:11.0592MHz * *
[单片机]
基于DS18B20的室内智能温度控制系统设计
    温度在工农业生产中起着举足轻重的作用,在冶金、医药、食品制造和化学制造业等行业尤其显得重要。在适当的温度下生产的产品质量、产量和合格率会大大的提高。有些药品的生产和存储要在很低的温度下进行;石油分馏的过程中在不同的温度下才能分离出汽油、柴油、煤油、硫化物;食品的制造和存储也要在特定的温度下才能保证质量。在农业大棚蔬菜和室内圈养牲畜对于环境温度的要求也很高,大棚蔬菜的温度基本上要保证在20~30℃。鸡舍的育雏期温度要控制在36℃左右。随着社会生产力和科学技术的发展,工农业生产对于温度的要求会越来越高,这样就需要系统不但可以测出室内的实际温度,还可以通过上位机来进行实时的控制,调整环境的温度。 1 系统的整体想路     本系统
[嵌入式]
FPGA与DS18B20型温度传感器通信的实现
DS18B20是DALLAS公司生产的一线式数字温度传感器,采用3引脚TO-92型小体积封装;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。   一线式(1-WIRE)串行总线是利用1条信号线就可以与总线上若干器件进行通信。具体应用中可以利用微处理器的I/O端口对DS18B20直接进行通信,也可以通过现场可编程门阵列(FPGA)等可编程逻辑器件(PLD)实现对1-WIRE器件的通信。     本文介绍利用ACTEL公司的ProASICplus系列FPGA实现与DS18B20的通信功能。FPGA可以将读出DS18B2
[嵌入式]
7脚12864spi单片机源程序,直接函数调用
单片机源程序如下: #include yejin.h const uchar num ={ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/* 0 ,0*/ 0X00,0X00,0X08,0X08,0X1F,0X00,0X00,0X00,0X00,0X00,0X04,0X04,0XFC,0X04,0X04,0X00,/* 1 ,1*/ 0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/* 2 ,
[单片机]
基于AVR单片机的温度测量系统
1 引言   传统温度测量系统中,一般选用模拟式温度传感器。常用的模拟式温度传感器,其中一个共同特点是输出为模拟量,因此在测量电路中必须经过A/D转换才能成为计算机所能处理的数字量。数字式温度传感器将非电模拟量转换到数字信号这一处理过程的多个环节集成在单芯片上,实现了在测量点将温度值数字化,有效解决了传统温度传感器外围电路复杂,抗干扰能力差的弊病,降低了对系统的要求。   该系统以Atmel公司的ATmega8L单片机为控制中心,温度测量使用DS18B20单总线数字温度传感器,采用1602字符型液晶显示器作为温度值的显示输出。编程使用CodeVision AVR C Compiler编译器,该编译软件自带了使用器件库函数文件
[单片机]
基于AVR单片机的温度测量系统
单片机经典实验实例精华详解(附源程序) (七)
七、红外线遥控器解码程序   这里我们以红外线遥控编码芯片为LC7461等芯片为例来说明用单片机实现红外遥控解码的详细过程,站长琢磨这个解码程序花了相当多的精力,期间几经修改逐步完善,后来还用它开发了几个小产品,希望能对网友学习单片机有所帮助。   红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。   1 红外遥控系统   通用红外遥控系统由发射和接收两大
[模拟电子]
温度传感器DS18B20原理,附STM32例程代码
DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 DS18B20原理 传感器参数 测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4° 返回16位二进制温度数值 主机和从机通信使用单总线,即使用单线进行数据的发送和接收 在使用中不需要任何外围元件,独立芯片即可完成工作 掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值 每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应D
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved