电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

MSP430与DS18B20驱动程序

来源:-- 作者:-- 浏览:335

标签:

摘要: **文 件 名: ds18b20.c **创 建 人:**最后修改日期: 2005年12月12日 **描 述: 利用但总线DS18B20测温

**文   件   名: ds18b20.c
**创   建   人:
**最后修改日期: 2005年12月12日
**描        述: 利用但总线DS18B20测温程序,并在LCD显示,取三位有效小数位。整数部分两位。共5位显示
 
#include <MSP430x44x.h> #define SEGE 0X80
#define SEGH 0X40
#define SEGF 0X20
#define SEGC 0X10
#define SEGG 0X08
#define SEGD 0X04
#define SEGB 0X02
#define SEGA 0X01
const unsigned char digit[10] =
{
    SEGA|SEGB|SEGC|SEGD|SEGE|SEGF,  /* "0" LCD segments a+b+c+d+e+f */
    0x12,  /* "1" */
    0x8F,  /* "2" */
    0x1F,  /* "3" */
    0x3A,  /* "4" */
    0x3D,  /* "5" */
    0xBD,  /* "6" */
    0x13,  /* "7" */
    0xBF,  /* "8" */
    0x3F   /* "9" */ };
#define DQ1 P4OUT|=BIT4
#define DQ0 P4OUT&=~BIT4 float   Temper=0.0;
int     temperature=0;
unsigned char Error = 0;
//----------------------------------
//功能:us 级别延时
// n=10,则延时10*5+6=56uS
//----------------------------------
void DelayNus(unsigned int n)
{
    while(n--){};
}
//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ0;
        DelayNus(1);//延时13us 左右
        if((n&0X01)==0X01)
            DQ1;
        else
            DQ0;
        
        n=n>>1;
        DelayNus(9);//延时50us 以上
        DQ1;
    }
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void)
{
    unsigned char i;
    unsigned char temp;
    for(i=0;i<8;i++)
    {
        temp=temp>>1;
        DQ0;
        _NOP();//延时1us
        DQ1;
        _NOP();_NOP();//延时5us
        _NOP();_NOP();_NOP();
        P4DIR&=~BIT4;
        
        if((P4IN&BIT4)==0)
        {
            temp=temp&0x7F;
        }
        else
        {
            temp=temp|0x80;
        }
        
        DelayNus(7);//延时40us
        P4DIR|=BIT4;
        DQ1;
    }
    
    return    temp;
}
//-----------------------------------
void Init (void)
{
    DQ0;
    DelayNus(50);//延时500us
    DQ1;
    DelayNus(17);//延时90us
    P4DIR&=~BIT4;
    
    if((P4IN&BIT4)==BIT4)        //0001 1111b=1f
    {
        Error =1;    //失败1
        P4DIR|=BIT4;
    }
    else
    {
        Error = 0;//初始化成功
        P4DIR|=BIT4;
        DQ1;
    }
}
//----------------------------------
void Skip(void)
{
    Write_18B20(0xCC);
}
//----------------------------------
void Convert (void)
{
    Write_18B20(0x44);
} //----------------------------------
void ReadDo (void)
{
    Write_18B20(0xbe);
}
//---------------------------------- void ReadTemp (void)
{
    char temp_low,temp_high; //温度值
    temp_low=Read_18B20(); //读低位
    temp_high=Read_18B20(); //读高位
    temperature=(temp_high&0x0f);
    temperature<<=8;
    temperature|=temp_low;
    Temper=temperature*0.0625;
} void GetTemp(void)
{
    Init();
    Skip();
    Convert();
    DelayNus(60000);
    DelayNus(60000);
    DelayNus(60000);//延时1s以上
    Init();
    Skip();
    ReadDo();
    ReadTemp();
} void InitLcd(void)
{
    LCDCTL = LCDON + LCD4MUX + LCDSG0_1;      // LCD on, 4-Mux, segments S0-S15
    BTCTL = BT_fLCD_DIV128;                   // LCD cLOCk freq is ACLK/128
    P5SEL = 0xFC;                             // Select P5.2-7 as Com and Rxx
} void display_number(unsigned long value, int start, int width)
{
    int i;
    for (i = 0;  i < width;  i++)
    {
        LCDMEM[7 + i - start] = digit[value%10]; // remainder = character in table to display
        value /= 10;
    }
} void Lcd_Clr(void)
{
    volatile unsigned char i;
    for (i=0; i<7; i++)
    {
        LCDMEM = 0;
    }
} void main(void)
{
    WDTCTL = WDTPW + WDTHOLD; // 停狗
    P4DIR |=BIT4;
    DQ1;
    InitLcd();
    Lcd_Clr();     while(1)
    {
        GetTemp();
        display_number((unsigned long int)(Temper*1000),7,5);
        LCDMEM[3] |= SEGH;
    }
型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67