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

📄 ds1820drv.c

📁 dallas单总线温度传感器驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                               DS1820温度传感器驱动程序  
//
//       说明:
//           所有函数名都以 DS1820_  开头, 例如: DS1820_Main_Run();   
//           所有变量都包括 TempeSen , 例如 chTempeSenState   
//           所有常量名都以 TEMPESEN  开头, 例如 TEMPESENChannelPort
//           所有的宏定义都以 TEMPESEN_  开头, 例如 TEMPESEN_FAMILY_CODE
//
//           温度传感器的序号按先列后排的顺序排列, 001列01排, 001列02排, 001列03排...... 001列12排, 002列01排, 002列02排
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from debug.c
extern void InsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************

#define Mark_FF 255
#define Mark_00 0
//////////////////////////////////////////////////常量定义//////////////////////////////////////////////////////////////////////
//2003-1-4 13:07 cyh
//通道 01--12 与 物理口的关系!
//TTL7--TTL19 DB62的12--21 。。。 TTL7 为 特通道
//各个通道端口地址   ---不会改变!           
const unsigned int MCUPortDIR[] = {0, P1DIR_, P2DIR_, P3DIR_, P4DIR_, P5DIR_, P6DIR_};
const unsigned int MCUPortOUT[] = {0, P1OUT_, P2OUT_, P3OUT_, P4OUT_, P5OUT_, P6OUT_};
const unsigned int MCUPortIN[]  = {0, P1IN_,  P2IN_,  P3IN_,  P4IN_,  P5IN_,  P6IN_};

//////////////////////////////////////变量定义/////////////////////////////////////////////////////////

////////////////////////////////////函数声明////////////////////////////////////////////////////////////////
unsigned char  DS1820_Read_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void DS1820_Write_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit, unsigned char val);
unsigned char  DS1820_Reset_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void DS1820_Write_Reg_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void DS1820_StartConvert_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
//读 板上温度  
unsigned char DS1820_Read_Temperature_Board(unsigned char chMCUPort, unsigned int DataBit);
////////////////////////////////////供外部调用的函数/////////////////////////////////////////////////////////////////////
void DS1820_Init(void);
void DS1820_Read_ID_MultiChannel(unsigned char chMCUPort, unsigned char DataBit, unsigned char *pDS1820ID);
void DS1820_Read_ID_MultiChannel(unsigned char chMCUPort, unsigned char DataBit, unsigned char *pDS1820ID);
///////////////////////////////////内部使用的功能型性函数////////////////////////////////////////////////////////////////////////////////////////////////
//功能: 延时, DS1820_Delay(1000)<--->2500us, DS1820_Delay(400)<--->800us, DS1820_Delay(10)<--->25us  => DS1820_Delay(1)<--->2.5us
//参数: useconds : 延时记数
//返回: 无
void DS1820_Delay(long int useconds)
{
    for( ; useconds > 0; useconds--);    
}

//功能: 温度传感器初始化,将所有温度传感器的ID写入Flash Memory
//参数: 无
//返回: 无
void DS1820_Init(void)
{
    //门的ID 号的 初始化
    if(*(unsigned char *)(FLASHMEM_Seg_DoorAddr + 511) == 0xFF)
    {
        unsigned int i;
//      //写段之前先关闭看门狗和中断-------目前在 开中断之前 调用
//      WDTCTL = WDTPW + WDTHOLD;      
//      _DINT();
        FCTL1 = FWKEY + ERASE;          // Set Erase bit
        FCTL3 = FWKEY;                  // Clear Lock bit
        *(unsigned char *)(FLASHMEM_Seg_DoorAddr) = 0;                  // Dummy write to erase Flash segment B
        FCTL1 = FWKEY + WRT;            // Set WRT bit for write operation    
        for (i = 0; i < 512; i++)
        {
            *(unsigned char *)(FLASHMEM_Seg_DoorAddr + i) = '0';
        }
        FCTL1 = FWKEY;                  // Clear WRT bit
        FCTL3 = FWKEY + LOCK;           // Reset LOCK bit       
        
//      //恢复看门狗和中断 
//      _EINT();
//      WDTCTL = WDT_ARST_1000; 
    }
    
}

////////////////////////////////////DS1820温度传感器驱动函数模块----用于多通道//////////////////////////////////////////////////////////////////
//功能: 读一个字节
//参数: chMCUPort : 通道所在MCU上的端口号
//      DataBit : 数据位线
//返回: 读取到的字节
unsigned char DS1820_Read_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit)
{
    unsigned int  *PXDIR;
    unsigned int  *PXOUT;
    unsigned int  *PXIN;
    unsigned char i, value = 0x01;
    
    PXDIR = (unsigned int *)MCUPortDIR[chMCUPort];
    PXOUT = (unsigned int *)MCUPortOUT[chMCUPort];
    PXIN = (unsigned int *)MCUPortIN[chMCUPort];
    
    _DINT();
    WDTCTL = WDTPW + WDTHOLD;   // 停止看门狗定时器    
    
    //读取字节数据的各个位, 先读低位, 再读高位
    for (i = 0; i < 8; i++)
    {
        value >>= 1;
        //先将数据线至少拉 "低" 1us
        (*PXOUT) &= ~DataBit;   
        (*PXDIR) |= DataBit;
        _NOP();     _NOP();     _NOP();    //拉低5us
        _NOP();     _NOP();     _NOP();         
        _NOP();     _NOP();     _NOP();  
        _NOP();     _NOP();     _NOP(); 
        _NOP();     _NOP();     _NOP();        
        //读取数据位,延时 60us--120us
        (*PXDIR) &= ~DataBit;
        _NOP();   _NOP();   _NOP();   //再等待5us后再读
        _NOP();     _NOP();     _NOP();         
        _NOP();     _NOP();     _NOP();             
        _NOP();     _NOP();     _NOP();         
        _NOP();     _NOP();     _NOP();             
                    
        if ( (*PXIN) & DataBit )        
        {
            value |= 0x80;                
        }     
        _NOP();   _NOP();  _NOP();  //持续位状态

        //恢复数据线, 正常时为 "高"
        (*PXDIR) |= DataBit;
        (*PXOUT) |= DataBit;     
        DS1820_Delay(36);     //90us
   }
   _EINT();
   WDTCTL = WDT_ARST_1000;
   DS1820_Delay(36);   // 90us
   return(value);
}

   
//功能: 写一个字节
//参数: chMCUPort : 通道所在MCU上的端口号
//      DataBit : 数据位线
//      val : 要写的字节, 0--255
//返回: 无    
void DS1820_Write_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit, unsigned char val)
{
    unsigned int  *PXDIR;
    unsigned int  *PXOUT;
    unsigned int  *PXIN;
    unsigned char i;
    
    PXDIR = (unsigned int *)MCUPortDIR[chMCUPort];
    PXOUT = (unsigned int *)MCUPortOUT[chMCUPort];
    PXIN = (unsigned int *)MCUPortIN[chMCUPort];
    
    _DINT();
    WDTCTL = WDTPW + WDTHOLD;   // 停止看门狗定时器       
    //写字节数据各个位, 先写低位,再写高位
    for (i = 0; i < 8; i++)
    {
        //先将数据线至少拉 "低" 1us
        (*PXOUT) &= ~DataBit;
        (*PXDIR) |= DataBit;
        _NOP();     _NOP();     _NOP();   //拉低10us, 3个_NOP() 占1us
        _NOP();     _NOP();     _NOP();   
        _NOP();     _NOP();     _NOP();   
        _NOP();     _NOP();     _NOP();   
        _NOP();     _NOP();     _NOP();  
                
        _NOP();     _NOP();     _NOP();         
        _NOP();     _NOP();     _NOP();   
        _NOP();     _NOP();     _NOP();   
        _NOP();     _NOP();     _NOP();         
        _NOP();     _NOP();     _NOP();  
                  
        //写取数据位,延时 60us--120us      
        if(val & 0x01)
        {
            (*PXOUT) |= DataBit;
            DS1820_Delay(10); //持续30us            
        }             
        else
        {
            (*PXOUT) &= ~DataBit;           
        }  
        DS1820_Delay(38);  //写持续100us
    
        //恢复数据线, 正常时为 "高"    
        (*PXOUT) |= DataBit;     
        DS1820_Delay(10); //恢复持续30us
        
        val >>= 1;  
    }
    
    _EINT();
    WDTCTL = WDT_ARST_1000;
}




//功能: 对某个通道上的所有温度传感器复位, 总计大约 833us
//参数: chMCUPort : 通道所在MCU上的端口号
//      DataBit : 数据位线
//返回: 0 : 复位成功;   否则 : 复位失败 
unsigned char  DS1820_Reset_MultiChannel(unsigned char chMCUPort, unsigned int DataBit)
{
    unsigned int  *PXDIR;
    unsigned int  *PXOUT;
    unsigned int  *PXIN;
    unsigned char chRslt,chValue = 255;

    PXDIR = (unsigned int *)MCUPortDIR[chMCUPort];
    PXOUT = (unsigned int *)MCUPortOUT[chMCUPort];
    PXIN = (unsigned int *)MCUPortIN[chMCUPort];
        
    DS1820_Delay(300);  //about delay 750 us    

    _DINT();
    WDTCTL = WDTPW + WDTHOLD;   // 停止看门狗定时器  
    
    //将数据线拉 "低", 480--960us       
    (*PXOUT) &= ~DataBit;
    (*PXDIR) |= DataBit;   

⌨️ 快捷键说明

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