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