⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsi8b20._c

📁 AVR ds18b20 源代码 对学习温度控制的人很有帮助
💻 _C
字号:
/******************************************/
/*             北京MCU学习之家            */
/*             ADC通信演示程序            */
/*             作者:白如冰                */
/*             2005年10月1日              */
/*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
/******************************************/
//  1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
//  2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
#include <iom8v.h>
#include <macros.h>
extern void delay_us(unsigned int n);
extern void delay_ms(unsigned int n);
extern void uart_init(void);
extern void putchar(unsigned char c);
extern void puts(char *s);
extern void puts_hh(char *s);

#define ds1820_data_s PORTD|=BIT(PORTD6)
#define ds1820_data_c PORTD&=~BIT(PORTD6)
 							

unsigned char reset_ov(void)      //18b20 复位函数
{ 
 char c=0; 
 ds1820_data_s;
 delay_us(1);//6
 ds1820_data_c;
 delay_us(660);//500
 ds1820_data_s;
 delay_us(73);//60us
 c=(PIND&=0x40);//dq_in;
 if(c==0x40)
 return (0);
 else 
 {
 delay_us(326);//250
  return (1);
 }  
}  

void write_data(unsigned char data)    //DS18B20写函数
{
    unsigned char i,temp;
    temp=data;
   
    for (i=0; i<8; i++) 
    {
      if((temp&0x01)&&0x01)
      {
	  ds1820_data_c;
      delay_us(6);//10
      ds1820_data_s;
      delay_us(73);//60
      }
      else
      {
	   ds1820_data_c;
       delay_us(80);//70
       ds1820_data_s;
       delay_us(1);//6
      }
      data>>=1;   
      temp=data;
    }
      
}

unsigned char read_data(void)   //DS18B20	读函数
{
unsigned char i;

char value = 0;
for (i=0;i<8;i++)
{
value>>=1;
ds1820_data_c;
delay_us(1);//6
ds1820_data_s;
delay_us(1); //6


if((PIND&=0x40)==0x40)
value|=0x80;
delay_us(73);//60 
}


return(value);
}

void init_ds1820(void)
{
   unsigned char i;
   for(i=0;i<40;i++)
   {if(reset_ov())
    break;
   }
  
  write_data(0xcc);  //跳过ROM
  write_data(0x4e);  //写配置寄存器指令
  write_data(0x00);
  write_data(0x00);
  write_data(0x7f);  //配置转换位数为12位,转换时间为750ms
   for(i=0;i<40;i++)
   {if(reset_ov())
    break;
   }
   write_data(0xcc);
   write_data(0x44); //转换命令   开始第一次转换
 }
 
 //读温度值
unsigned int read_temper(void)
{  
   unsigned int x;
   unsigned char templ,temph,i;
   for(i=0;i<40;i++)
   {if(reset_ov())
    break;
   }
  
  
  write_data(0xcc);  //跳过ROM
  write_data(0xbe); //读温度命令
  templ=read_data();
  temph=read_data();
  for(i=0;i<40;i++)
   {if(reset_ov())
    break;
   }
   write_data(0xcc);
   write_data(0x44); //转换命令
   x=temph;
   x<<=8;
   x+=templ;
   return x;
 }  
 void main(void)
 {
  unsigned char temp[5];
  unsigned int temper_data;
  DDRD=0XFF;
  PORTD=0Xff;
  uart_init();
  init_ds1820();
  
  while(1)
  {
  delay_ms(1000);
  
  temper_data=read_temper();
  temper_data*=0.625;
  temp[0]=temper_data%10+0x30;
  temp[1]=(temper_data/10)%10+0x30;
  temp[2]=(temper_data/100)%10+0x30;
  puts("当前温度是:");
  putchar(temp[2]);
  putchar(temp[1]);
  putchar('.');
  putchar(temp[0]);
  putchar('`');
  putchar('C');
  puts_hh("  ");
  
 
  }
  
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -