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

📄 18b20.c

📁 将模拟温度传感器与数字转换接口电路集成在一起
💻 C
字号:
/*********************************************************************************************
* File:	led.c
* Author:	embest
* Desc:	control board's LEDs
* History:	
*********************************************************************************************/
#include "44b.h"
#include "44blib.h"

/*------------------------------------------------------------------------------------ -*/
/*										constant define									*/
/*--------------------------------------------------------------------------------- ----*/
#define SET_BIT 		rPDATG|=0x80
#define CLR_BIT 		rPDATG&=~(0x80)
#define PORT_IN 		rPCONG=0x3fff
#define PORT_OUT 	rPCONG=0x7fff
#define BIT_VALUE	(unsigned char *)((rPDATG&0x80)>>7)
/*------------------------------------------------------------------------------------------*/
/*                                     global variables                                     */
/*------------------------------------------------------------------------------------------*/

            
/*------------------------------------------------------------------------------------------*/
/*                                     function declare                                     */
/*------------------------------------------------------------------------------------------*/
unsigned char test_18b20(void);                                               /* LED test	*/
void convert_T(void) ;
unsigned char read_T(void);  
unsigned char init_1820(void); 
void config_18b20(void);
void write_1820(unsigned char x); 
unsigned char read_1820(void);

/*********************************************************************************************
* name:		test_18b20
* func:		leds test funciton
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
unsigned char test_18b20(void)
{   	
	unsigned char temp;
	convert_T();
	if(temp!=read_T()) temp=read_T();
	uart_printf("\n temp= %d",temp);
	delay(10000);
	return(temp);
}


/******************************************************************************
*name:config_1820()
*func:配置18b20
*part:none						
*ret:none
*******************************************************************************/
void config_18b20(void)
{
	PORT_IN;	/*设置为输入模式,(上电时为高电平) 	*/
	CLR_BIT;	/*输出锁存器写0,以后不再更改 	 	*/
}
/******************************************************************************
*name:init_1820()
*func:初始化18b20
*part:none						
*ret:none
*******************************************************************************/
unsigned char  init_1820(void)
{
    unsigned char  bus_flag;   		/*用来返回的标志位 */
	config_18b20();
	PORT_OUT;      					/*设置1-wire总线为低电平(占领总线)  */
	CLR_BIT;         				/*P7=0 */
	delay_10us(50);        			/*延时490us */
	SET_BIT;         				/*PD3=1 */
	PORT_IN;      					/*设置1-wire总线为高电平(释放总线)  */
	delay_10us(7);
	   
		if(BIT_VALUE)  				/* 探测总线上是否有器件*/
			bus_flag=0;       		/*没有发现有器件在线  */     
			else bus_flag=1;  		/* 发现有器件  */
	delay_10us(20);  
    return(bus_flag);   				/*60~240us */
} 


/******************************************************************************
*name:read_1820()
*func:读18b20
*part:none						
*ret:none
*******************************************************************************/
unsigned char read_1820(void)
{
    unsigned char  count,temp;  
    temp = 0x00;                /* 数据接收准备  */
    for(count=0; count<8; count++) {           
		PORT_OUT;
		CLR_BIT;                  
		delay_1us(4);                    
		SET_BIT; 
        PORT_IN;    			/* 设置1-wire总线为高电平(释放总线)  */
            delay_1us(4);   	/* 延时4us*/
         	if(BIT_VALUE) 
         			temp|=(1<<count);   /* 读取总线电平,先收低位再收高位  */
            else 	temp&=~(1<<count);              							
        delay_1us(62);  		/* 必须大于60us  */
		PORT_OUT;
		SET_BIT; 
    }  
    return temp;  
}

/******************************************************************************
*name:init_1820()
*func:初始化18b20
*part:none						
*ret:none
*******************************************************************************/
void write_1820(unsigned char dat)
 {  
    unsigned char  count;  
        PORT_OUT;               /* 设置1-wire总线为低电平 */         
    for(count=0; count<8; count++) {
		if(dat&0x01){     
              		delay_1us(3);
					CLR_BIT; 
					delay_1us(10);                  
					SET_BIT; 
					delay_1us(65);            /* 并串转换,先低位后高位  */  
       	} else {  
				delay_1us(3);
				CLR_BIT; 
				delay_1us(65);
				SET_BIT; 
          		} 
      dat >>= 1;
    }  
}  

/**************温度转换函数****************************/ 
void convert_T(void)  
{  
    if(init_1820()==1) {     /* 如果复位成功  */
        write_1820(0xcc);     /* 跳过多器件识别  */
        write_1820(0x44);     /* 启动温度转换  */
    }  
} 

/************读取转换后的温度值 **************************/ 
unsigned char read_T(void)  
{  
    unsigned char a,b,temp; 
    volatile unsigned char t=0;
          
    if(init_1820()==1) {		/* 如果复位成功  */
        write_1820(0xcc);		/* 跳过多器件识别  */
        write_1820(0xbe);		/* 读暂存器  */
        a = read_1820();		/*读取温度值低位 */
        b = read_1820();		/*读取温度值高位 */

        temp = b & 0x80;		/*前5位符号,温度大于0,这5位为0,值乘0.0625即得实际温度 */
           						/*温度小于0,这5位为1,数值取反加1再乘0.0625即得实际温度*/
    if(temp == 0) 
        {	t = b << 4; 
			a=a>>4;
            t = t + a;} 
        else 
        { b = b & 0x07; 
          t = b << 8; 
          t = t + a; 
          t = ~t + 1;} 
     t = t * 0.625;      
     return(t); 
     } 
} 

⌨️ 快捷键说明

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