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

📄 18b20control.c

📁 2005年吉林省电子大赛一等奖的全部代码
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include "DS18B20.h"
//#include "7279.h"

int value=0; 

/***************************************
        检查DS1820是否存在;
   如果存在返回1;否则返回0
***************************************/
unsigned char DS18B20_reset(void)  
 {
    unsigned char bus_flag;

	PORTB|=(1<<5);

    PORTB&=~(1<<5);      // 设置1-wire总线为低电平(占领总线)... 

     /* 现在延迟480us~960us, 与硬件密切相关,但应尽可能选小值(480us), 
       把抖动留给系统(比如在延迟期间发生中断导致延迟变长)。 
     */ 
    delay(327);   // 490us 

    CLI();          // 下面这段时间要求比较严格,为保险起见,关中断 
    PORTB|=(1<<5);;      // 设置1-wire总线为高电平(释放总线) 
     
    /* 这个浮点数是由编译器计算好的,而不是由你的MCU在运行时临时计算的, 
       所以不会占用用户MCU的时间,不必担心(看看前面的宏你就可以确定了) 
     */ 
    //delay_nus(12);  // 最佳时间: 60us+7.5us!(忙延时,只是一种策略) 
     
    // 探测总线上是否有器件   
	DDRB&=~(1<<5);
	delay(40);  
    if(DQ_status()) bus_flag=0;   // 复位单总线但没有发现有器件在线 
    else bus_flag=1;              // 复位单总线并发现有器件在线 
     
    SEI();          // 退出临界代码区(开中断) 

    /* 保证Master释放总线的时间(不是说总线处于高电平的时间)不小于 
       480us即可,这一时间从读总线状态之前就开始了,所以这里把这个 
       时间计算在内。在Master释放总线的前半段,也是被动器件声明它 
       们在线之时。 
     */ 
	DDRB|=(1<<5);
	NOP();
	PORTB|=(1<<5);;
    delay(150);   // 490-67.5us 
 
    return(bus_flag); 

 }
  
/***************************************
       从DS18B20读取1字节数据
***************************************/  
unsigned char DS18B20_read(void)
 {
  unsigned char i,Read_Byte=0;

  for(i=0;i<8;i++)
   {
   
    CLI();
	PORTB&=~(1<<5);               // 设置1-wire总线为低电平(拉低总线以同步) 
    //delay_nus(2);
	PORTB|=(1<<5);;               // 设置1-wire总线为高电平(释放总线) 
    //delay_nus(4);            // 4us 
	DDRB&=~(1<<5);
	       
    Read_Byte>>=1;           //右移一位
    
	if(PINB&(1<<5)) Read_Byte|=0x80;   // 读取总线电平,先收低位再收高位 
         
    SEI();        // 恢复系统中断 
    delay(50);  // 必须大于60us
	SEI(); 
	DDRB|=(1<<5);
	NOP();

   }
  
   return(Read_Byte);
 }

 
/***************************************
         写命令到DS18B20
***************************************/  
void DS18B20_write(unsigned char cmd)
 {
  unsigned char Write_Temp,j;

  for(j=0;j<=7;j++)
   {
    
    CLI();

	PORTB&=~(1<<5);               // 设置1-wire总线为低电平
	//delay_nus(2);
	
	if(cmd&0x01) PORTB|=(1<<5);  // 并串转换,先低位后高位 
    else PORTB&=~(1<<5); 
	cmd>>=1;
	
	delay(40); 
	PORTB|=(1<<5);;
	SEI();
	//delay_nus(2);

   } 
 }
 
void Write_Init(void)
{       
     
        DS18B20_reset();
	
        DS18B20_write(0xcc);
	  
        DS18B20_write(0x4E);

		DS18B20_write(0x10);
		
		DS18B20_write(0x80);
		
		DS18B20_write(0x7F);
		  
}

void convert_T(void) 
{ 
    //if(DS18B20_reset()==1)       // 如果复位成功 
	//{ 
	   
	    DS18B20_reset();
	
        DS18B20_write(0xcc);     // 跳过多器件识别
		  
        DS18B20_write(0x44);     // 启动温度转换
		
	    //PORTA|=(1<<1);
		//delay(400); 
    //} 
} 


int Read_T(void) 
{ 
    
     
    //if(DS18B20_reset()==1) {     // 如果复位成功
	
	    DS18B20_reset();
	
        DS18B20_write(0xcc);       // 跳过多器件识别
	    
        DS18B20_write(0xbe);     // 读暂存器 
	 
        value  = (int)DS18B20_read();       // 低字节
	
        value += (int)((DS18B20_read())<<8);  // 高字节 
    //} 
    return(value); 
} 

/****内部CRC较验****/

unsigned char CRCcheck(unsigned char *ValuePoint,unsigned char len)
{
 unsigned char bit0,cbit,r,temp,i,j,byte;
 temp=0;
 for(j=0;j<len;j++)
 {
  byte=ValuePoint[j];
  for(i=0;i<8;i++)
  {
   cbit=temp&0x01;
   bit0=byte&0x01;
   temp=temp>>1;
   r=cbit^bit0;
   if(r==1)
   temp=temp^0x8c;
   byte=byte>>1;
  }
 }
 return temp;
}

/***************************
 将十六进制转ASCII码,并显示
***************************/
/*void asc2con(unsigned char *p,unsigned char len)
{
 unsigned char i,temp;
 for(i=0;i<len;i++)
 {
  temp=p[len-1-i]&0xf0;
  temp=temp>>4;
  LCD_write_string(0,1,table[temp]);
  temp=p[len-1-i]&0x0f;
  LCD_write_string(1,1,table[temp]);
 }
}*/
 /************************************
        匹配DS18B0
*************************************/
void DS18B20_match(unsigned char *p)
{
 unsigned char i;
 DS18B20_reset();
 DS18B20_write(0x55);
 for(i=0;i<8;i++)
  DS18B20_write(p[i]);
}

⌨️ 快捷键说明

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