新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 1-wire總線匯編程序

        1-wire總線匯編程序

        作者: 時間:2013-01-07 來源:網絡 收藏

        ;**************匯編程**************************
        ;文件:1-wire.asm
        ;功能:接口程序
        ;器件:AT90S2313,DS1821
        ;時鐘:4.0MHz
        ;****************************************

        ;過程名:w1_init
        ;功能:1_wire總線
        ;入口參數:無
        ;出口參數:R30 1:有器件應答 0:無器件應答
        ;影響資源:R24,R25
        ;***************匯編程**************************
        w1_init:
        clr R30
        cbi w1_port, w1_bit ;輸出清零
        sbi w1_portd, w1_bit ;設置為輸出,將總線置為低電平
        ldi R24, 0xE0 ;延時480us
        ldi R25, 0x01
        d1:
        sbiw R24, 0x01
        brne d1
        cbi w1_portd, w1_bit ;設置為輸入,放開總線
        ldi R24, 0x5D ;延時70us
        d2:
        dec R24
        brne d2
        sbis w1_pin, w1_bit ;總線為高電平,沒有器件應答
        inc R30 ;總線為低電平,有器件應答,置輸出R30=1
        ldi R24, 0xC2 ;延時450us,等待復位周期完成
        ldi R25, 0x01
        d3:
        sbiw R24, 0x01
        brne d3
        ret
        ;****************1-wire總線匯編程*************************
        ;過程名:w1_write
        ;功能:寫入一個字節數據
        ;入口參數:R23
        ;出口參數:無
        ;影響資源:R22,R24,R25
        ;*****************1-wire總線匯編程************************
        w1_write:
        ldi R22, 0x08 ;置計數器
        write_next:
        rcall w1_write_bit ;寫入一位
        ror R23 ;要寫入的數據位移入最低位
        dec R22
        brne write_next ;8位未完,繼續下一位
        ret
        ;*****************************************
        ;過程名:w1_read
        ;功能:讀取一個字節數據
        ;入口參數:無
        ;出口參數:R30 讀取的8位數據存在R30中
        ;影響資源:R22,R24,R25
        ;*****************************************
        w1_read:
        ldi R22, 0x08 ;置計數器
        read_next:
        rcall w1_read_bit ;從總線上讀取一位
        dec R22
        brne read_next ;8位未完,繼續讀取下一位
        ret
        ;***************1-wire總線匯編程**************************
        ;過程名:w1_write_bit
        ;功能:寫入一位數據
        ;入口參數:R23.0
        ;出口參數:無
        ;影響資源:R24
        ;*****************************************
        w1_write_bit:
        sbi w1_portd, w1_bit ;設置為輸出,將總線置為0
        ldi R24, 0x11
        d4:
        dec R24 ;延時12us
        brne d4
        sbrc R23, 0 ;要輸出0,則跳過下一行,總線保持為0
        cbi w1_portd, w1_bit ;設置為輸入,釋放總線,輸出1
        ldi R24, 0x64
        d5:
        dec R24 ;延時75us
        brne d5
        cbi w1_portd, w1_bit ;寫入結束,設置為輸入,釋放總線
        ldi R24, 0x03 ;延時2us
        d6:
        dec R24
        brne d6
        ret
        ;*****************************************
        ;過程名:w1_read_bit
        ;功能:讀取一位數據
        ;入口參數:無
        ;出口參數:R30 讀取的1位數據存在R30中最高位,同時R30種原有的數據右移1位
        ;影響資源:C,R24
        ;*****************************************
        w1_read_bit:
        sbi w1_portd, w1_bit ;輸出0,把總線拉低
        ldi R24, 0x03 ;延時2us
        d7:
        dec R24
        brne d7
        cbi w1_portd, w1_bit ;設置為輸入,釋放總線
        ldi R24, 0x0F ;延時10us
        d8:
        dec R24
        brne d8
        clc
        sbic w1_pin, w1_bit ;總線為低電平,跳過下一行,C保持為0
        sec ;總線為高電平,C置1
        ror R30 ;C移入R30最高位
        ldi R24, 0x6B ;延時80us,等待周期結束
        d9:
        dec R24
        brne d9
        ret
        ;****************1-wire總線匯編程*************************
        ;This is the end



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 防城港市| 瓦房店市| 上饶县| 金门县| 台北县| 稻城县| 宁安市| 吉安县| 出国| 萝北县| 黔西| 镶黄旗| 江永县| 富源县| 博兴县| 东海县| 晋宁县| 武冈市| 皋兰县| 灵台县| 卓资县| 博客| 丰原市| 沈丘县| 大方县| 灵山县| 黄梅县| 浦县| 大理市| 孝义市| 拉萨市| 泉州市| 同德县| 宿松县| 焉耆| 绵阳市| 宜君县| 屯门区| 邳州市| 建湖县| 永吉县|