找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3846|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

430驅(qū)動(dòng)DS18b20驅(qū)動(dòng)不了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:64384 發(fā)表于 2014-7-25 17:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
板子就接了個(gè)32K的晶振,設(shè)置DS18B20DE 的信號(hào)口選擇在P1.6調(diào)試了三個(gè)程序,debug都讀不到數(shù)據(jù),附上程序,下面一個(gè)是被我屏蔽的程序。望大神指教。
#include<msp430x14x.h>
#define  delay_10uS()  ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define  delay_6uS()   ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define  delay_9uS()   ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define  delay_15uS()   ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define     uchar   unsigned char
#define     uint    unsigned    int
#define DQ_OUT P1DIR|=BIT6
#define DQ_IN P1DIR&=~BIT6
#define DQ_LOW P1OUT&=~BIT6
#define DQ_HIGH P1OUT|=BIT6
#define DQ_DATA P1IN&BIT6
uint j=0;
uint l=0;
uchar MSB; //溫度高字節(jié)
uchar LSB; //溫度低字節(jié)
int t1=0; //溫度整數(shù)部分?jǐn)?shù)值
uint t2=0; //溫度小數(shù)部分?jǐn)?shù)值
uchar flag; //負(fù)溫度標(biāo)志
void Delayus(uint us)
{
    while(us--)
    {
        _NOP();_NOP();_NOP();_NOP();
        _NOP();_NOP();_NOP();_NOP();
        
    }
}
//初始化DS18B20
void DS18B20Init(void)
{
    DQ_OUT;//設(shè)置為輸出方向
    DQ_LOW;//拉低總線
    Delayus(50);
    DQ_HIGH;//釋放總線
    Delayus(3);
    DQ_IN;//設(shè)置為輸入方向
    while(DQ_DATA);//等待應(yīng)答信號(hào)
    while(~DQ_DATA);//等待釋放總線
    delay_10uS();
    delay_15uS();
}
//讀一個(gè)字節(jié)
uchar ReadByte(void)
{
    uchar i;
    uchar ReadData=0;
    for(i=0;i<8;i++)
    {
        ReadData>>=1;
        DQ_LOW;
        delay_6uS();
        DQ_HIGH;
        delay_9uS();
        DQ_IN;
        _NOP();
        if(DQ_DATA) ReadData|=0x80;
        delay_10uS();
        delay_10uS();
        delay_10uS();
        delay_10uS();
        DQ_OUT;
        DQ_HIGH;
        delay_10uS();
    }
    return ReadData;
}
//寫一個(gè)字節(jié)
void WriteByte(uchar WriteData)
{
    uchar i;
    uchar tmpData;
    for(i=0;i<8;i++)
    {
        DQ_OUT;
        DQ_LOW;
        tmpData=WriteData&0x80;
        delay_6uS();
            if(tmpData)
            {
                 DQ_HIGH;
            }
        else
        {
             DQ_LOW;
        }
        delay_10uS();
        delay_10uS();
        delay_10uS();
        delay_10uS();
        delay_10uS();
      DQ_HIGH;
        WriteData<<=1;
        }
    delay_10uS();
}
//溫度計(jì)算程序
void GetT()
{
    if((MSB&0xF0)>0)
    { //判斷是否為負(fù)溫度
        flag=1;
    }
    else
    {
         flag=0;
    }
    if(flag)
    { //如果為負(fù)溫度取反加1
        MSB=~MSB;
        LSB=~LSB+1;
    }
    t1=MSB<<4; //得到溫度整數(shù)部分
    t1|=(LSB>>4);
    t2=(uint)((LSB&0x0F)*0.0625*10000); //得到溫度小數(shù)部分并擴(kuò)大10000 倍
}
void main()
{
    WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗
        
    while(1)
    {
        DS18B20Init();
        WriteByte(0xCC); //跳過ROM 配置
        WriteByte(0x44);//啟動(dòng)溫度轉(zhuǎn)換
        
        Delayus(1000);
        
        DS18B20Init();
        WriteByte(0xCC); //跳過ROM 配置
        WriteByte(0xBE); //跳過ROM 配置
        LSB=ReadByte(); //讀溫度數(shù)據(jù)低字節(jié)
        MSB=ReadByte(); //讀溫度數(shù)據(jù)高字節(jié)
        GetT(); //計(jì)算溫度
   
    }
}











/*
uchar init_18b20(void)
{
    uchar Error;
    DQ_out;
    _DINT();
    DQ0;
    DelayNus(50);
    DQ1;
    DelayNus(6);
    DQ_in;
    _NOP();
    if(DQ_val)      
    {
        Error = 1;          //初始化失敗
    }
    else
    {
        Error = 0;          //初始化成功
    }
    DQ_out;
    DQ1;
    DelayNus(40);  
    return Error;
}
void Write_18B20(uchar wdata)
{
    uchar i;
    for(i = 0; i < 8;i++)
    {
        DQ0;
        delay_6uS();            //延時(shí)6us
        if(wdata & 0X01)    DQ1;
        else                DQ0;
        wdata >>= 1;
        DelayNus(5);           //延時(shí)50us
        DQ1;
        delay_10uS();           //延時(shí)10us
    }
  
}
uchar Read_18B20(void)
{
    uchar i;
    uchar temp = 0;
    for(i = 0;i < 8;i++)
    {
        temp >>= 1;
        DQ0;
         delay_6uS();            //延時(shí)6us
        DQ1;
         delay_9uS();            //延時(shí)9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        DelayNus(5);           //延時(shí)45us
        DQ_out;
        DQ1;
         delay_10uS(); ;           //延時(shí)10us
    }
    return  temp;
}
void Convert(void)
{
    Write_18B20(0x44);
}
void Read_SP(void)
{
    Write_18B20(0xbe);
}
void Skip(void)
{
    Write_18B20(0xcc);
}
uint ReadTemp(void)
{
    uchar temp_low;
    uint  temp;
   
    temp_low = Read_18B20();      //讀低位
    temp = Read_18B20();     //讀高位
    temp = (temp<<8) | temp_low;
   
    return  temp;
}
uint Do1Convert(void)
{
    uchar i;
   
    do
    {
        i = init_18b20();
    }
    while(i);
    Skip();
    Convert();
    for(i = 20;i > 0;i--)  
        DelayNus(60000); //延時(shí)800ms以上
    do
    {
        i = init_18b20();
    }
    while(i);
    Skip();
    Read_SP();
    return ReadTemp();
}
void main(void)
{
    WDTCTL=WDTPW+WDTHOLD;
    P1DIR=0x00;
    P1SEL=0x00;
   
    while(1)
    {
       Do1Convert();  
    }
}
*/

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表