音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

關(guān)于18b20的讀寫

作者:buou 欄目:ARM技術(shù)
關(guān)于18B20的讀寫
請教大家,為什么我讀出來的值總是0xFFFF啊,初始化返回0,是不是就說明是成功啊,我是用lpc2214+ds18B20、晶振11.0592代碼如下


#define Fosc            11059200                   
#define Fcclk           (Fosc * 4)                  
#define Fcco            (Fcclk * 4)          
#define Fpclk           (Fcclk / 4) * 1     



#define FAIL 1
#define SUCC 0

#define  DQ_18B20       (1 << 24   )                // PD3
#define  DQ_TO_0()      (IO0CLR=  DQ_18B20)   // p0.24='0'    
#define  DQ_TO_1()      (IO0SET = DQ_18B20)   // p0.24='1'
#define  DQ_status()    (IO0PIN& DQ_18B20)     // read p0.24 pin

//延時t×1u秒程序
void wait_us(uint32 t)    
{    
    T1TC   = 0;                    
    T1PR   = 0;             
    T1MCR  = 0x05;
    T1MR0  =t*(Fpclk/1000000);    /* 1u秒鐘定時                        */       
    T1TCR  = 0x01;        
    while((T1IR & 0x01) == 0);
    T1IR = 0x01;
}  
uint8 ds18B20_reset(void)
{
    uint8 bus_flag;
    PINSEL1 &= 0xFFFCFFFF; //設(shè)置P0.18為通用IO
    IO0DIR |= DQ_18B20;
    DQ_TO_1();      // 設(shè)置1-wire總線為高電平(釋放總線)
    wait_us(480);
    DQ_TO_0();      // 設(shè)置1-wire總線為低電平(占領(lǐng)總線)...
    wait_us(490);   // 490us
    OS_ENTER_CRITICAL();  
    DQ_TO_1();      // 設(shè)置1-wire總線為高電平(釋放總線)
    IO0DIR = IO0DIR&(~DQ_18B20);    //拉高總線輸入
    wait_us(67.5);  // 最佳時間: 60us+7.5us!(忙延時,只是一種策略)
    // 探測總線上是否有器件    
    if(DQ_status()) bus_flag=FAIL;   // 復(fù)位單總線但沒有發(fā)現(xiàn)有器件在線
    else bus_flag=SUCC;              // 復(fù)位單總線并發(fā)現(xiàn)有器件在線    
    OS_EXIT_CRITICAL();           // (開中斷)
    wait_us(490-67.5);   // 490-67.5us
    return(bus_flag);
}
void ds18B20_write(uint8 dat)
{
    uint8 count;
    IO0DIR |= DQ_18B20;   //改回輸出
    OS_ENTER_CRITICAL();              
    // 每個字節(jié)共8位,一次發(fā)一位
    for(count=0; count<8; count++)
    {
        DQ_TO_0();               // 設(shè)置1-wire總線為低電平
        wait_us(2);              // about 2us
         DQ_TO_1();       
        if(dat&0x01) DQ_TO_1();  // 并串轉(zhuǎn)換,先低位后高位
        else DQ_TO_0();
        dat >>= 1;               // 下一位做好準(zhǔn)備
        wait_us(62);             // 62US        
        DQ_TO_1();
        wait_us(2);              // 2us
    }
            OS_EXIT_CRITICAL();                  // 恢復(fù)系統(tǒng)中斷
}
uint8 ds18B20_read(void)
{
    uint8 count,dat;

    dat = 0x00;       // 數(shù)據(jù)接收準(zhǔn)備
           OS_ENTER_CRITICAL();
    // 每個字節(jié)共8位,一次收一位
    for(count=0; count<8; count++)
        {
         IO0DIR |= DQ_18B20;    //改回輸出
        DQ_TO_0();    // 設(shè)置1-wire總線為低電平(拉低總線以同步)
        wait_us(2);   // 2us
        DQ_TO_1();    // 設(shè)置1-wire總線為高電平(釋放總線)
        wait_us(4);   // 4us
        IO0DIR = IO0DIR&(~DQ_18B20);
        //wait_us(4);   // 4us        
        dat >>= 1;        
        if(DQ_status()) dat|=0x80;   // 讀取總線電平,先收低位再收高位
        wait_us(62);  // 必須大于60us
    }
            OS_EXIT_CRITICAL();       // 恢復(fù)系統(tǒng)中斷
    return(dat);
}
void convert_T(void)
{
    if(ds18B20_reset()==SUCC) {  // 如果復(fù)位成功
        ds18B20_write(0xcc);     // 跳過多器件識別
        ds18B20_write(0x44);     // 啟動溫度轉(zhuǎn)換
  &nb
2樓: >>參與討論
daxia7203
我用定時器定時,并且關(guān)中斷的
 
3樓: >>參與討論
zlgarm
re:
建議用示波器觀察波形,或用邏輯分析儀分析(http://www.embedtools.com/pro_analyser/analyser/LA1024.asp)。如果程序是在內(nèi)部FLASH運(yùn)行,較短的延時可以不定時器,直接用循環(huán)實(shí)現(xiàn)(延時的時間通過實(shí)測波形來確定)。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
2148USB ucos下函數(shù)的擴(kuò)展
請ZLG的工程師回答有關(guān)ZLG/GUI的問題!
zlgarm, 你好!上午打電話問過啦,公司的人沒有需要的解答。
請教各位一個問題:;快速中斷壓棧哪些東西啊?
串口中斷問題
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號