久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2146|回復: 4
打印 上一主題 下一主題
收起左側

可否幫小白解讀一下這個單片機程序,明天上課要講解

[復制鏈接]
跳轉到指定樓層
樓主
ID:426409 發表于 2018-11-14 20:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>
#include <intrins.h>

sbit IO_18B20 = P3^2;  //DS18B20通信引腳

/* 軟件延時函數,延時時間(t*10)us */
void DelayX10us(unsigned char t)
{
    do {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    } while (--t);
}
/* 復位總線,獲取存在脈沖,以啟動一次讀寫操作 */
bit Get18B20Ack()
{
    bit ack;

    EA = 0;   //禁止總中斷
    IO_18B20 = 0;     //產生500us復位脈沖
    DelayX10us(50);
    IO_18B20 = 1;
    DelayX10us(6);    //延時60us
    ack = IO_18B20;   //讀取存在脈沖
    while(!IO_18B20); //等待存在脈沖結束
    EA = 1;   //重新使能總中斷

    return ack;
}
/* 向DS18B20寫入一個字節,dat-待寫入字節 */
void Write18B20(unsigned char dat)
{
    unsigned char mask;

    EA = 0;   //禁止總中斷
    for (mask=0x01; mask!=0; mask<<=1)  //低位在先,依次移出8個bit
    {
        IO_18B20 = 0;         //產生2us低電平脈沖
        _nop_();
        _nop_();
        if ((mask&dat) == 0)  //輸出該bit值
            IO_18B20 = 0;
        else
            IO_18B20 = 1;
        DelayX10us(6);        //延時60us
        IO_18B20 = 1;         //拉高通信引腳
    }
    EA = 1;   //重新使能總中斷
}
/* 從DS18B20讀取一個字節,返回值-讀到的字節 */
unsigned char Read18B20()
{
    unsigned char dat;
    unsigned char mask;

    EA = 0;   //禁止總中斷
    for (mask=0x01; mask!=0; mask<<=1)  //低位在先,依次采集8個bit
    {
        IO_18B20 = 0;         //產生2us低電平脈沖
        _nop_();
        _nop_();
        IO_18B20 = 1;         //結束低電平脈沖,等待18B20輸出數據
        _nop_();              //延時2us
        _nop_();
        if (!IO_18B20)        //讀取通信引腳上的值
            dat &= ~mask;
        else
            dat |= mask;
        DelayX10us(6);        //再延時60us
    }
    EA = 1;   //重新使能總中斷

    return dat;
}
/* 啟動一次18B20溫度轉換,返回值-表示是否啟動成功 */
bit Start18B20()
{
    bit ack;

    ack = Get18B20Ack();   //執行總線復位,并獲取18B20應答
    if (ack == 0)          //如18B20正確應答,則啟動一次轉換
    {
        Write18B20(0xCC);  //跳過ROM操作
        Write18B20(0x44);  //啟動一次溫度轉換
    }
    return ~ack;   //ack==0表示操作成功,所以返回值對其取反
}
/* 讀取DS18B20轉換的溫度值,返回值-表示是否讀取成功 */
bit Get18B20Temp(int *temp)
{
    bit ack;
    unsigned char LSB, MSB; //16bit溫度值的低字節和高字節

    ack = Get18B20Ack();    //執行總線復位,并獲取18B20應答
    if (ack == 0)           //如18B20正確應答,則讀取溫度值
    {
        Write18B20(0xCC);   //跳過ROM操作
        Write18B20(0xBE);   //發送讀命令
        LSB = Read18B20();  //讀溫度值的低字節
        MSB = Read18B20();  //讀溫度值的高字節
        *temp = ((int)MSB << 8) + LSB;  //合成為16bit整型數
    }
    return ~ack;  //ack==0表示操作應答,所以返回值為其取反值
}


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

使用道具 舉報

沙發
ID:111634 發表于 2018-11-15 08:24 | 只看該作者
一看do那么多nop,就知道這是一段很差的程序。
回復

使用道具 舉報

板凳
ID:94031 發表于 2018-11-15 10:36 | 只看該作者
就幾個子程序,連mian函數都沒有,不知道要解讀什么。
回復

使用道具 舉報

地板
ID:425222 發表于 2018-11-15 11:13 | 只看該作者
這就18B20的初始配置,上網搜一下18B20的數據手冊不就能看的懂了么?
回復

使用道具 舉報

5#
ID:427162 發表于 2018-11-15 16:38 | 只看該作者
ack = Get18B20Ack();   //執行總線復位,并獲取18B20應答     if (ack == 0)          //如18B20正確應答,則啟動一次轉換     {         Write18B20(0xCC);  //跳過ROM操作         Write18B20(0x44);  //啟動一次溫度轉換
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜久久久久久久久久一区二区 | 五月天婷婷丁香 | 久久9精品 | 亚洲欧美日韩国产综合 | 天天综合成人网 | 欧美成人h版在线观看 | 蜜桃精品在线 | 亚洲午夜精品在线观看 | 精品国产不卡一区二区三区 | 91最新在线视频 | 午夜成人免费视频 | 精品久久久久一区二区国产 | 国产精品亚洲成在人线 | 成人午夜精品一区二区三区 | 欧美精品在线播放 | 亚洲欧洲色视频 | 日韩伦理电影免费在线观看 | 99re国产 | 欧美激情久久久 | 欧美日韩国产精品激情在线播放 | 欧美一区二区三区在线视频 | 亚洲毛片在线观看 | 精品国产高清一区二区三区 | 日日摸天天添天天添破 | 日韩视频在线一区二区 | 久操伊人 | 亚洲三区视频 | 国产精品国产三级国产a | 欧美在线观看网站 | 99国内精品久久久久久久 | 亚洲精品一区二区 | 日韩第1页| 日日射影院 | 激情五月婷婷在线 | 成人欧美一区二区三区在线观看 | 在线视频 欧美日韩 | 一本一道久久a久久精品蜜桃 | 一区二区三区四区不卡 | 欧美国产精品 | 午夜视频一区 | 国产精品视频一区二区三区不卡 |