ATmega128(DS18B20)

发布者:DelightfulWish最新更新时间:2016-09-29 来源: eefocus关键字:ATmega128  DS18B20 手机看文章 扫描二维码
随时随地手机看文章
//ATmega28的温度传感器DS18B20控制程序,显示环境温度,编译优化等级-01

//DS18b20的C语言驱动程序,三位数码管显示,读取当前环境温度,精度达0.1度,温度范围0-99度
//DS18B20 详细引脚功能描述1、GND 地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下
//也可以向器件提供电源;3、VDD可选择的VDD 引脚。当工作于寄生电源时,此引脚必须接地。
//DS18B20 的使用方法。DS18B20 采用的是1-Wire 总线协议方式
//即在一根数据线实现数据的双向传输
//编译环境 AVR Studio 4.17/AVR GCC
//系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
 
//***********************************************************************
//   包含文件
//***********************************************************************

#include
#include
#define  F_CPU 7372800  /* 单片机主频为7.3728MHz,用于延时子程序 */
#include
#include
#include

//***********************************************************************
//   定义变量区
//***********************************************************************

#define delay_us(x)     _delay_us(x)         //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)         //AVR GCC延时函数 x(ms)

#define uchar           unsigned char
#define uint            unsigned int

#define Data_IO         PORTA                //数码管数据口
#define Data_DDR        DDRA                 //数码管数据口方向寄存器
#define D_LE0         PORTD &= ~(1 << PD4) //数码管段控制位为0,锁存端口数据
#define D_LE1           PORTD |= (1 << PD4)  //数码管段控制位为1,锁存器输出与端口一致
#define W_LE0         PORTD &= ~(1 << PD5) //数码管位控制位为0
#define W_LE1           PORTD |= (1 << PD5)  //数码管位控制位为1

#define DQ_IN         DDRE &= ~(1 << PE4)  //设置输入,DS18B20接单片机PE4口
#define DQ_OUT         DDRE |= (1 << PE4)  //设置输出
#define DQ_CLR         PORTE &= ~(1 << PE4) //置低电平
#define DQ_SET         PORTE |= (1 << PE4)  //置高电平
#define DQ_R         PINE & (1 << PE4)  //读电平

uchar key;
uint temp_value;
uint temp,A1,A2,A3;                     //定义的变量,显示数据处理
uchar flag1;

//***********************************************************************
//   共阴数码管显示的断码表0~F
//***********************************************************************

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

//***********************************************************************
//   IO端口初始化
//***********************************************************************

void system_init()
{
    Data_IO=0xFF;             //数据口为输出
    Data_DDR=0xFF;

    PORTD=0xFF;               //74HC573的控制口,设置为输出
    DDRD=0xFF;
}

//*************************************************************************
//   74HC573控制数码管动态扫描显示函数,显示采集到的温度
//*************************************************************************

void Display_DS18B20(uint data_b,uint data_s,uint data_g)
{
  uchar i,j;
  system_init();
     j=0x01;                    //此数据用来控制位选
 for(i=0;i<5;i++)               //用后3位数码管来显示
  {
     D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=0x00;           
     D_LE0;                      
     delay_ms(1);                
  }
     D_LE1;                    
     W_LE1;                    
     Data_IO=~j;               
     W_LE0;                    
  j=(j<<1);
     Data_IO=table[A1];         
     D_LE0;                    
     delay_ms(1);             

     D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=table[A2]|0x80;         //显示小数点    
     D_LE0;                      
     delay_ms(1);               

  D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=table[A3];           
     D_LE0;                      
     delay_ms(1);               

  D_LE1;                     
     W_LE1;                     
     Data_IO=0xff;                
     W_LE0;                     

}


//************************************************************************* 
//   DS18B20初始化
//*************************************************************************

unsigned char DS18B20_Reset(void)                 //初始化和复位

{
unsigned char i;
    DQ_OUT;
 DQ_CLR;
 delay_us(500);    //延时500uS(480-960)
 DQ_SET;
 DQ_IN;
 delay_us(80);    //延时80uS
 i = DQ_R;
 delay_us(500);    //延时500uS(保持>480uS)
 
 if (i) 
        {
  return 0x00;
  
        }
 else 
        {
  return 0x01;
  
        }

}


//************************************************************************* 
//   DS18B20读一个字节函数
//************************************************************************* 
   
unsigned char ds1820_read_byte(void) 
{

 unsigned char i;
 unsigned char value = 0;
 for (i = 8; i != 0; i--) 
        {
  value >>= 1;
  DQ_OUT;
  DQ_CLR;
        delay_us(4);    //*延时4uS
  
  DQ_SET;
  DQ_IN;
        delay_us(10);    //*延时10uS
  
  if (DQ_R) 
                {
   value|=0x80;
   
                }
  delay_us(60);          //*延时60uS
  
        }
 
 return(value);
}

//************************************************************************* 
//   向18B20写一个字节函数
//************************************************************************* 

/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) 
{

 unsigned char i;
 for (i = 8; i != 0; i--) 
        {
  DQ_OUT;
  DQ_CLR;
        delay_us(4);   //延时4uS
  if (value & 0x01) 
                {
   DQ_SET;
   
                }
  delay_us(80);   //延时80uS
  DQ_SET;           //位结束
  value >>= 1;
  
        }
 
}
//*************************************************************************
//    发送温度转换命令
//*************************************************************************

/*启动ds1820转换*/
void ds1820_start(void) {

 DS18B20_Reset();
 ds1820_write_byte(0xCC); //勿略地址
 ds1820_write_byte(0x44); //启动转换
}

//*************************************************************************
//    DS8B20读取温度信息
//*************************************************************************

unsigned int ds1820_read_temp(void) 
{

 unsigned int i;
 unsigned char buf[9];

 DS18B20_Reset();
 ds1820_write_byte(0xCC); //勿略地址
 ds1820_write_byte(0xBE); //读取温度
 for (i = 0; i < 9; i++) 
     {
    buf[i] = ds1820_read_byte(); 
     }
 i = buf[1];
 i <<= 8;
 i |= buf[0];
 temp_value=i;
    temp_value=temp_value*0.625;    //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据
                          //比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275
                                        //然后在显示的时候确定小数点的位置即可,就能显示出27.5度了
 return i;
}

 

//*************************************************************************
//  温度数据处理函数
//*************************************************************************
 void data_do(uint temp_d)
 {
     uint A2t;
     A1=temp_d/100;                       //分出百,十,和个位
     A2t=temp_d%100;
     A2=A2t/10;
     A3=A2t%10;
}

//*************************************************************************
//   主程序
//*************************************************************************

void main(void)
{
    uint j;
 DS18B20_Reset();       //复位D18B20
while (1)
    {
  ds1820_start();         //启动一次转换
  ds1820_read_temp();     //读取温度数值
        data_do(temp_value);       //处理数据,得到要显示的值
for(j=0;j<200;j++)
    {     
  Display_DS18B20(A1,A2,A3); //显示温度值
 }

  
    }
}

关键字:ATmega128  DS18B20 引用地址:ATmega128(DS18B20)

上一篇:ATmega128(lcd1602)
下一篇:ATmega128(EEPROM)

推荐阅读最新更新时间:2024-03-16 15:12

用51单片同时测温度(DS18B20)和频率(外部中断测)
void main()//主函数 { delay1ms(1000); lcd_init();//液晶显示初始化 init_play(); while(1) { EA=0; //因DS18B20对时序要求高且受中断影响,故先关闭总中断 read_temp();//读取温度 ds1820disp();//显示 CT_init();//定时计数器初始化 EA=1;//开总中断 EX0=1;//允许外部中断 IT0=1;//设置外部中断方式为下降沿触发 P3=0xff; t0=(u
[单片机]
壹拾玖:DS18B20的温度读取
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1.DS18B20产品的特点 (1)只要求一个端口即可实现通信。 (2)在DS18B20中的每个器件都有独一无二的序列号。 (3)实际应用中不需要外部任何元器件即可实现测温。 (4)测量温度范围在-55℃到+125℃之间。 (5)数字温度计的分辨率用户可以从9位到12位选择。 (6)内部有温度上、下限告警设置。 由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。 DS18B20有严格的通信
[单片机]
壹拾玖:<font color='red'>DS18B20</font>的温度读取
ATmega128单片机音节显示仿真与源码
ATmega128单片机源程序如下: //ICC-AVR application builder : 2018/2/23 22:40:20 // Target : M128 // Crystal: 8.0000Mhz #include iom128v.h #include macros.h //#include delay.h //本程序通过按键生成1-7共7个音阶,音阶对应的频率分别为523hz、587hz、698hz。。。 // tone_freq ={523,587,659,698,784,880,987} //tone_cnt 中成员值是生成不同频率的定时器寄存器OCR1A的设置值,例如523hz对应的定时
[单片机]
<font color='red'>ATmega128</font>单片机音节显示仿真与源码
ATmega128 定时器测试
功能说明/*全部定时1S*/ #define F_CPU 16000000UL #include DS12864.h #include avr/io.h #include avr/interrupt.h volatile unsigned int count0=0,flag0=0; volatile unsigned int count1=0,flag1=0; volatile unsigned int count2=0,flag2=0; volatile unsigned int count3=0,flag3=0; /**************************************
[单片机]
AVR ATMega128自引导IAP(boot load)的应用设计
ATmega128具备引导加载支持的用户程序自编程功能(In-Sysytem Programming by On-chip Boot Program),它提供了一个真正的由MCU本身自动下载和更新(采用读/写同时 Read-While-Write 进行的方式)程序代码的系统程序自编程更新的机制。利用AVR的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。 IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loader Program),实现对用户应用程序的在线自编程更新。引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取
[单片机]
如何辨别ATmega128芯片真假
简介:有时候周末花上几个小时为了做点东西而工作的感觉不错。刻蚀PCB板不仅趣味十足,而且让人充满成就感,这也是为什么电子领域能赢得如此多的业余爱好者,让他们沉醉在自己电路设计的世界里乐此不疲。 但发现你手里中国制造的atmega128是赝品,那又是什么滋味呢? 我们将atmega128用所剩不多的排针连接器插在刻蚀分接母板上(上图中未焊接的引脚并不影响芯片正常工作)并用usbtiny程序编译。 AVRDudess接口发回的报告让人感到些许安慰。 查找MCU失败。 这样的结果与上午我们在pcb板上焊接芯片的报告相符。而有趣的是,如果我们强制将16进制文档写入芯片,报告却返回另外一个设备地址: 确
[单片机]
如何辨别<font color='red'>ATmega128</font>芯片真假
基于NRF24L01的DS18B20温度无线传输单片机源码
单片机型号为stc12c5a60s2 温度传感器为DS18B20 无线传输为NRF24L01 温度显示LCD1602 单片机源程序如下: #include STC12C5A60S2.H #include stdio.h #include DELAY.h #include NRF24L01.h #include LCD1602.h #include DS18B20.h void main(void) { int temp,intt,dect; unsigned char temp_buf ={0}; EA=1; LCD_Init(); //LCD160
[单片机]
数字化和网络化传感器在工程中的应用
传感器是将各种参量送入计算机系统,进行智能监测、控制的最前端。随着科技的发展,数字化、网络化传感器应用益广泛,以其传统方式不可比拟的优势渐渐成为技术的趋势和主流。下面,我们结合实际应用中的要求,浅谈一下数字化、网络化传感器的特点,供大家选型时参考。 一、应用数字化、网络化温度传感器实现电缆沟在线监测 1.为什么要在线监测电缆沟 电缆在日常生产、生活中随处可见,在电场、工厂、实验室通常将大量的电缆集中在电缆沟中,以方便布线、维护、美观。随着人们对电的依赖的增长,电缆沟里的电缆越来越多,其火灾事故的发生几率也相应增加。 以电场为例,随着机组容量的增大,自动化水平相应提高,电缆用量越来越多。一台200MW机组,各类电
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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