51 단편기 학습 노트: DS18B20 온도 측정 프로그램

9625 단어 ds18b20
#include "my51.h"
#include "smg.h"
#include "ds18b20.h"

void main()			  //   ,6         
{
    u8 i=0;
    u16 temp=0;
    while(1)
    {	
		temp=ds18b20_readTemperaData();
		for(i=0;i<100;i++)
		{
			displaySMG(ds18b20_processTempData(temp)); 	
		}		    
    }
}


 
#ifndef		_DS18B20_H   
#define		_DS18B20_H
#include   "my51.h"
#include   "smg.h"

extern u8 smgWela[7];			  //       
sbit DQ=P2^2;					  //    
bool ds18b20_init();              //     
u8*  ds18b20_processTempData(u16 temp);// temp             
u16  ds18b20_readTemperaData();   //   
u8 	 ds18b20_readByte() ;         //     
void ds18b20_writeByte(u8 dat);   //mcu 18b20     

#endif

 
#include "ds18b20.h"

/******************************************************************
     t0                 
 to      1us  ,15us             
DSl820  t0  15-60us               0 ,         1 
   2           1us 
 1,     60us, t0    1us    1,15us  ic   ,      45us
 0,    60~120us,15~60us ic   ,120       ,mcu       
   1   0,  60us  ,ic         , mcu      
*******************************************************************/
void ds18b20_writeByte(u8 dat)  //mcu ic     
{
    u8 i;
	u8 tmep=dat;
    for(i=0;i<8;i++)
    {
        DQ=0;           //           
        _nop_();        //    1us   
        DQ=dat & 0x01; //     ,        
        delayXus(10);//  74us, 0 60~120us    , 1    60us    
        DQ=1;          //    ,    mcu      ,       
		dat>>=1;	   //          ,2         1us
    }
}

/**************************************************************************
        
          60us     ,             1us     
DS18B20      1us         ,      2~3   ,     
                   15μs   ,   mcu       
        5~13us  , 15~60us     18b20     ,     
            ,     ,     mcu           
*******************************************************/
u8 ds18b20_readByte()    //mcu     
{
    u8 i,value=0;
    for(i=0;i<8;i++)
    {
        DQ=0;                       //    
        value>>=1;                  //    3~4     
        DQ=1;                       //mcu    
        _nop_();_nop_();_nop_();	//   3.3us 
        if(DQ)          
        {
            value|=0x80;//       ,         ,      0
        } 
        delayXus(8); //  60.76us  
    }
    return value;
}

u16 ds18b20_readTemperaData()  //     
{
    u16 temp=0;
    if(ds18b20_init())
    {
        ds18b20_writeByte(0xcc);      //   :  rom  
        ds18b20_writeByte(0x44);     //   :    
        //delayms(750);//       750ms  ,     
		//        ,         85 ,        
		//            ,          
        if(ds18b20_init())
        {
            ds18b20_writeByte(0xcc);  //   :    rom
            ds18b20_writeByte(0xbe);  //   :     
            temp=ds18b20_readByte();  //   8   
			temp|=(u16)ds18b20_readByte()<<8; //   8   ,    
			temp&= 0x0FFF;	// 4        ,         
        }
		else
		{
			led5=0;		 //    
			temp=0x2000; //   ,     
		}
    }
	else
	{
		led6=0;			//    
		temp=0x1000;   	//   ,     ,      
	}
    return temp;
}

bool ds18b20_init()   //   
{
    u8 checkState=0;
    DQ=1;             //      
    _nop_();_nop_();
    DQ=0;             //mcu      
    delayXus(80);     //  530us,  480us~960us      
                      // ic                  
                      //mcu                , ic     
                      // mcu      15~60us  ,ic            
                      //        60~240us
    DQ=1;             //mcu    
    delayXus(10);     //mcu  15~60us  ,(8+6*10)*1.085=73us,
                      //  DS18B20      ,  60~240us      ,
    checkState=DQ;    //   60~240us   ,mcu         ,0     
    delayXus(70);     //  464us,     73us, 537us
                      //  ic     60~240us  ,     ,       480us
                      //      537us,                                 
    if(checkState)    //checkstate 0       , 1     
    {
        return FALSE;
    }
    return TRUE;	  //     
}

u8* ds18b20_processTempData(u16 temp) //               
{
	u8 i=0;	
	if(0x0550==temp)	  //          85   
	{
		led7=0;		   	  //    ,   
		smgWela[5]=18;	  //    85 , 6        
		return 	smgWela;  //             
	}

	if(1==(temp&0x0800))  //   11    1, 1    
	{
		temp&=0x07ff;	  //   0~10 11  
		temp=(~temp+1) & 0x07ff;//     
		smgWela[0]=18;	 //        18   ,   
	}
	else
	{
		smgWela[0]=dark;  	 //                
	}
    temp=(u16)(temp*6.25);	 //   1000 ,            
	if(temp>=10000)
	{
		 smgWela[1]=1;   	 //        1,    ,100    
	}
	else
	{
		smgWela[1]=dark;     //    0        0
	}
    smgWela[2]=temp%10000/1000;	   //         
    smgWela[3]=temp%1000/100;	   //              
    smgWela[4]=temp%100/10;		   //       
    smgWela[5]=temp%10;			   //      
	smgWela[6]=0xf7;			   // 4         
	return smgWela;				   //    
}


 
#ifndef _51SMG_H_
#define _51SMG_H_

#include <reg52.h>
#include "mytype.h"
sbit dula =P2^6;  		//             
sbit wela =P2^7;  		//             

#define dark	0x11//   ,0x11  17   ,0x00    ,     , table[17]
#define dotDark 0xff//     

void displaySMG(u8* pWela); //       ,       

#endif

 
#include "smg.h"
#include "my51.h"

static u8 code table[]= { 		//0~F               
	0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
	0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
	0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
	0x39 , 0x5e , 0x79 , 0x71 , // C D E F
	0x80 , 0x00 ,0x40           // .            17   
 };

/*                 ,     ,    
	                     ,
	    pWela->dot = 0xfe & 0xdf    
	u8 code dotTable[]={   //     ,    0 ,    
	0xff ,                 //  
	0xfe , 0xfd , 0xfb ,   //1 2 3
	0xf7 , 0xef , 0xdf     //4 5 6                    
};*/

u8 data smgWela[7]={0,0,0,0,0,0,0}; //       ,            

//P0                6 ,     2    ,    
void displaySMG(u8* pWela)
{
	u8 i=0;	
    //  6        ,        dark
    u8 preState=P0|0x3f;  //   2   ,      ADC0804     
	wela=0;dula=0;_nop_();//     ,           2      
		
	P0=0;  		 	      //          ,      ,   
    dula=1;_nop_();
    dula=0;	  	 	      //         

    P0=preState;  		  //             , 6  1, 2   	
    wela=1;_nop_();		  // :wela dula     1		 
    wela=0;		  		  //    ,     2    , 6     

	for(i=0;i<6;i++)	  //  6    
	{
		P0=table[pWela[i]]|(((1<<i) & pWela[6])?0x00:0x80);
	    dula=1;_nop_();	     //    ,        ,0x00     
	    dula=0;
	    
	   	P0=preState&~(1<<i); //    2   , 6       ,     
	    wela=1;	_nop_();	 //    
	    wela=0;	
	    delayms(1);			 //    ,      			
		{  //       ,   1  , 6  1, 2      
	        P0=preState;
	        wela=1;	_nop_();			
	        wela=0;	
	    }
	}
}


 
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include "mytype.h"


#define high	1   //   
#define low		0   //   

#define led P1    //     

sbit led0=P1^0;     //8 led ,        
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;	
sbit ledLock=P2^5;	//led     ,0   ,1   
   
sbit beep=P2^3;     //   

void delayms(u16 ms);
void delayXus(u8 us); //    (8+6x)     ,  t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////


#endif

 
#include "MY51.h"

void delayms(u16 ms)     //        
{	
	u16 i,j;
	for(i=ms;i>0;i--)
	{
        for(j=113;j>0;j--)
        {}
	}
}

/****************************************************************
   12     mcu,     11059200Hz
         12/11059200=1.085  
keil4  ,    8      
  us=0 ,    9     , t=9*1.085=9.77 us
  us!=0 ,    (8+6x)     ,  t=(8+6x)*1.085 us
*****************************************************************/
void delayXus(u8 us)	//        
{
	while(us)           //         us=0      
	{
		us--;
	}
}


좋은 웹페이지 즐겨찾기