利用AVR单片机设计的DS18B20测温程序

发布者:清新家园最新更新时间:2019-11-25 来源: 51hei关键字:AVR单片机  DS18B20  测温程序 手机看文章 扫描二维码
随时随地手机看文章

/********************************

  DS18B20测温程序

  文件名:main.c

  编译:WinAVR-20070122


  硬件环境:CA-M8X   打开的开关如下

            S6(1,2,5,6,7)   - 外部4MHz晶振和595接口

            J8(EN-SEG)      - 数码管显示允许

            S7(4)          - 连接PC1 与DS18B20数据口

            (在CA-M8X 上DS18B20为非总线供电)

*******************************/

#include

#include

#include


#include "seg.h"  //声明数码管显示接口函数


#define CLR_1WIRE_BUS DDRC|=_BV(PC1) //设置为输出,此时由于PORTC1是低所以输出低

#define SET_1WIRE_BUS DDRC&=~_BV(PC1)//设置为输入,此时由于PORTC1是低所以程高阻,又因为外部有上拉电阻所以相当于设置总线为高

#define GET_1WIRE_BUS PINC&_BV(PC1) 


#define DS18B20_READ_ROM 0x33

#define DS18B20_MATCH_ROM 0X55

#define DS18B20_SKIP_ROM 0XCC

#define DS18B20_SEARCH_ROM 0XF0

#define DS18B20_ALARM_SEARCH_ROM 0XEC

#define DS18B20_WRITE_RAM 0X40

#define DS18B20_READ_RAM 0XBE

#define DS18B20_COPY_RAM 0X48 

#define DS18B20_CONVERT_TEM 0X44

#define DS18B20_EECALL_EEPROM 0XB8

#define DS18B20_READ_POWER_SUPPLY 0XB4


//总线端口初始化

void BusInit(void)

{

  PORTC&=~_BV(PC1);//此口总保持低

  DDRC&=~_BV(PC1); //初始化为输入,用外部上拉电阻保持总线的高电平

}


//由于系统时钟为4MHz,一个_delay_loop_2正好延时一us

#define DelayUs(x) _delay_loop_2(x)


void DelayMs(uint16_t t)

{

  uint16_t i;

  for(i=0;i    _delay_loop_2(250 * 4);

}


//单总线复位

uint8_t ds18b20_reset(void) 

  uint8_t ret=0;

  CLR_1WIRE_BUS; 

  DelayUs(500);  //拉低总线至少480us

  SET_1WIRE_BUS; 

  DelayUs(100);//释放总线后等待15-60us

  if((GET_1WIRE_BUS)==0)//检测到DS18B20把总线拉低

    ret=1;        //复位成功

  DelayUs(1000);//等待器件释放总线

  return ret;


//单总线读一字节

uint8_t ds18b20_read(void) 

  uint8_t data=0; 

  uint8_t i=0; 

  for(i=0;i<8;i++) 

  { 

    data>>=1; 

    CLR_1WIRE_BUS; 

    DelayUs(2);//此时>1us 

    SET_1WIRE_BUS; 

    DelayUs(4);//此时<15us 

    if(GET_1WIRE_BUS) 

      data|=0x80; 

    DelayUs(60);//此时>60us 

  } 

  return(data); 

}

//单总线写一字节

void ds18b20_write(uint8_t data) 

  uint8_t i=0; 

  for(i=0;i<8;i++) 

  { 

    if(data&0x01)

    { 

      CLR_1WIRE_BUS; 

      DelayUs(8);//8us 

      SET_1WIRE_BUS; 

      DelayUs(55);//55us 

    } 

    else 

    { 

      CLR_1WIRE_BUS; 

      DelayUs(55);//55us 

      SET_1WIRE_BUS; 

      DelayUs(20);//8us 

    } 

    data>>=1; 

  } 


//执行转换

uint8_t Ds18b20Convert(uint8_t *t) 

  //发送转换命令

  if(ds18b20_reset()==0)

    return 0;

  ds18b20_write(DS18B20_SKIP_ROM); //忽略地址匹配,总线上只有一个器件时,或对总线所有器件操作

  ds18b20_write(DS18B20_CONVERT_TEM);//开始转换命令

  

  //等待转换完成,ds18b20默认转换精度为12位,此时最大转换时间为750ms

  DelayMs(1000);

  

  //读温度字节

  if(ds18b20_reset()==0)

    return 0; 

  ds18b20_write(DS18B20_SKIP_ROM); //忽略地址匹配

  ds18b20_write(DS18B20_READ_RAM); //读RAM命令

  t[0]=ds18b20_read(); 

  t[1]=ds18b20_read();

  

  return 1;

}


//根据DS18B20中读的温度字节,计算实际温度值

int8_t GetTemperature(uint8_t *t)

{

  int8_t ret;

  uint32_t  val;

  uint16_t tmp=(t[1]*256)+t[0];

  uint8_t sflag=0;


  if((t[1]&0xf8)==0xf8) //若负温度,从补码转换(取反加一)

  {

    sflag=1;

    tmp=~tmp;

    tmp++;

  }

  tmp&=0x07ff;    //确保前5位为0

  

  //乘0.0625操作,为此本函数只适用于DS18B20 12位转换(默认)时

  val=((uint32_t)tmp)*625;

  val/=10000;

  

  ret=(int8_t)val;

  

  if(sflag)

    ret|=0x80;//变负数

    

  return ret;

}


//测试主函数

int main(void)

{

  uint8_t tmp[2];//保存温度字节

  int8_t tval;    //保存温度值

  

  SegInit();//数码管初始化

  SegNumberOut(0,0);//显示 0

  BusInit();  //单总线I/O口初始化


  while(1)

  {

    if(Ds18b20Convert(tmp))//如果转换成功

    {

      tval=GetTemperature(tmp);//计算实际温度值

      if(tval>=0)

        SegNumberOut(tval,0);//十进制显示温度值

      else

        SegNumberOut(0,0);//数码管无法显示负数,只能显示0

    }

  }

  return 0;

}



seg.c文件:



/********************************

  74HC95驱动的数码管显示模块

  文件名:seg.c

  编译:WinAVR-20070122


  硬件环境:CA-M8X   打开的开关如下

            S6(1,2,5,6,7)   - 外部4MHz晶振和595接口

            J8(EN-SEG)      - 数码管显示允许

  

  芯艺设计室 2004-2007  版权所有 

  转载请保留本注释在内的全部内容

  WEB: http://www.chipart.cn

  Email: changfutong@sina.com

*******************************/


#include

#include

#include


#include "seg.h"


#define SER_PORT  PORTD

#define SER_DAT  PD4

#define SER_RCK  PD5

#define SER_SCK  PD6


//显示码(可从chipart.cn下载生成工具)

static uint8_t g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


//向595 写一字节

static void ser_out(uint8_t dat)

{

  uint8_t i;


  for(i=0;i<8;i++)

  {

    if(dat&0x80)

      SER_PORT|=_BV(SER_DAT);

    else

      SER_PORT&=~_BV(SER_DAT);

      

    //产生移位脉冲    

    SER_PORT|=_BV(SER_SCK);

    SER_PORT&=~_BV(SER_SCK);

    dat<<=1;

  }

}

//数码管显示数(0~255)

//num :显示的数   hex:是否用十六进制显示

void SegNumberOut(uint8_t num,uint8_t hex)

{

  uint8_t buf[2];//发送显示码缓冲区

  uint8_t temp;

  

  if(hex) //十六进制

  {

    buf[0]=g_aDisplayBuf[num>>4];//高位

    buf[1]=g_aDisplayBuf[num&0x0f];//低位

  }

  else//十进制

  {

    buf[1]=g_aDisplayBuf[num%10];

    temp=num%100;

    buf[0]=g_aDisplayBuf[temp/10];

    temp=num/100;

    

    if(temp>0)

      buf[1]|=0x80; //第一个数码管小数点表示百位1

    if(temp>1)

      buf[0]|=0x80;//两个数码管小数点表示百位2

  }

  

  //串行发送数据

  ser_out(buf[0]);

  ser_out(buf[1]);


  //产生锁存脉冲

  SER_PORT|=_BV(SER_RCK);

  SER_PORT&=~_BV(SER_RCK);

}


void SegInit(void)

{

  //595控制I/O初始化

  DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);  

  SER_PORT&=~_BV(SER_SCK);

  SER_PORT&=~_BV(SER_RCK);

}


关键字:AVR单片机  DS18B20  测温程序 引用地址:利用AVR单片机设计的DS18B20测温程序

上一篇:读/写atmega8515内部EEPROM的例子
下一篇:开关稳压芯片LM2576ADJ做数控电源程序

推荐阅读最新更新时间:2024-11-08 18:03

AVR单片机在工业控制系统中的应用
1. 引言 单片机在工业控制领域应用时不同于民用、商用领域中的应用,工业控制所处的环境相对比较恶劣,干扰源多,其常见干扰源来自现场工业电气在投入、运行、切断等工况下产生的静电感应、尖峰电压、浪涌电流等干扰。实践表明,在工作室中按用户要求设计的小型工业采暖控制系统,尽管各项逻辑功能及技术指标的测试都正常,但该系统拿到现场上却不能使用,检测失灵,操作失控,显示花屏等现象接踵而来。经分析,其干扰是从现场不同路径传入单片机控制系统的。切断干扰源,提高单片机抗干扰能力是解决控制系统正常工作的前提。 2 抗干扰措施 2.1 测温信号的抗干扰 测温电路采用的是单总线芯片DS18B20,该芯片具有测温精度高,连接线路简单等优点,其测温范围为-
[单片机]
<font color='red'>AVR单片机</font>在工业控制系统中的应用
嵌入式学习笔记18——AVR单片机之熔丝位设置
1.熔丝位简介: 熔丝位状态为 1 表示未编程,熔丝位状态为 0 表示编程,因为在AVR的器件手册中是使用已编程和未编程定义熔丝位的。 AVR单片机的熔丝位是可以多次编程的。 AVR单片机芯片加密锁定之后(LB2/LB1=1/0,0/0)不能通过任何方式读取芯片内部的Flash和EEPROM的数据。 下载编程的正确步骤是:下载运行代码和数据,配置相关的熔丝位,最后配置芯片的加密位。 2. AVR单片机加密熔丝位的设置 3. 功能熔丝位的设置 4. Bootloader熔丝位简介 5. 系统时钟源选择熔丝位 6. 使用外部晶体时的工作模式设置 7.
[单片机]
嵌入式学习笔记18——<font color='red'>AVR单片机</font>之熔丝位设置
基于avr单片机I/O口输出SPWM程序
基于ATmega16单片机输出SPWM程序,PWM频率为25KHZ,输出正弦波为50HZ,输出电压波形光滑,失真度小,只需要硬件和软件相结合。电路简单,只修改程序就可以调整功能,成本低,可靠性主高。 #include avr/io.h #include avr/interrupt.h #define BIT(x) (1 x) //周期为20ms,产生50HZ的交流电,spwm频率为20k const unsigned char list ={1,4,7,10,13,16,19,22,25,28,31,34,37,39,42,45,48,51,54,57,60,62, 65,68,71,74,76,79,82,84,8
[单片机]
DS18B20的驱动程序
/******************************************************************** 程序名称:DS18B20演示实验 时钟频率:内部RC 8M 芯片 :DS18B20 引脚 :**PA0 DATA** **PD0--PD7接数码管扫描端1--8** **PC0--PC7接数码管扫描端。.A--G** ********************************************************************/ #include iom16v.h #include macros.h #define DQ_H PORTA|=BIT
[单片机]
DALLAS公司DS18B20基本参数
  DALLAS公司生产的单线数字温度传感器DS18B20、 DS1822,外形如图5.8所示,支持 一线总线 接口,测量温度范围为 -55 C~+125 C,在-10~+85 C范围内,精度为 0.5 C。DS1822的精度较差为 2 C 。现场温度直接以 一线总线 的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,新的产品支持3V~5.5V的电压范围, DS18B20可以程序设定9~12位的分辨率,精度为 0.5 C。用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为 2
[单片机]
avr单片机流水灯和按键抗干扰
第一次做。都是用的avr单片机ATMEGA16仿真。。有3个按键控制流水灯程序 和1个单片机按键抗干扰,左右按键要松开才行. 单片机源码: #include iom16v.h void delay(unsigned int x) { int i,j; for(i=0;i x;i++) for(j=0;j 1141;j++); } void button(int i) { if((PINC&(1 PC0))==0) { delay(20); if((PINC&(1 PC0))==0) { up(i); } while((PINC&(1 PC0))==0); } if((PINC&(1 PC1))==0) { del
[单片机]
<font color='red'>avr单片机</font>流水灯和按键抗干扰
AVR单片机学习(二)硬件电路的设计教程
1、ATmega 16简介 高速(16MHZ) 、RISC AVR 内核 1KB SRAM,16KB Flash ROM 512字节EEPROM ,方便数据存储 4个8位并行IO口,驱动能力强 具有Jtag 仿真接口与ISP下载接口 低功耗、宽电压(2.7V~5.5V) 丰富的片上外设:3个外部中断,3个定时器,USART,SPI ,IIC,ADC 片内上电复位电路 片内RC振荡器,可以省去外部晶振 由片内RC振荡器如果始终要求不是很高可以省掉一个晶振。片内有上电复位电路省了复位电路,如需要手动复位还是必须设计外部的手动复位电路。 2、构建ATmega16最小系统 电源
[单片机]
<font color='red'>AVR单片机</font>学习(二)硬件电路的设计教程
基于AVR单片机射频卡多协议读写器的设计
  引言   射频识别(RFID)是利用无线方式对电子数据载体(电子标签)进行识别的一种新兴技术。与接触式IC卡和条形码识别等系统比较,它有着巨大的优势。利用射频识别技术,能有效实现对数量大、分布区域广的信息进行智能化管理,达到高效快捷运作的目的,特别是在第二代身份证、物流、交通航运、自动收费、超市、门禁系统管理、服务领域等方面有着广泛的应用前景。随着我国国民经济的快速发展,国内RFID行业也正经历着深刻的变革。   RFID系统一般是由读写器、射频卡、应用软件来组成。其中读写器的设计是至关重要的,它决定了系统的稳定性和准确性。   除了要求其能支持一系列协议、标准和收发器外,对读写器可能还有其它功能性方面的要求,如高性能、
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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