?? wds1620.asm
字號(hào):
;參考程序B:WDS1620.ASM 數(shù)字式溫度傳感器DS1620實(shí)驗(yàn)DALLAS( 串行三線接口)
; WDS1620.ASM 數(shù)字溫度傳感器DS1620測(cè)溫實(shí)驗(yàn):P0.2接DQ位 P0.3接 CLK位,P0.4接RST位
;數(shù)字式溫度傳感器DS1620配有DALLAS( 串行三線接口)
;用DS1620測(cè)量溫度,用SAA1064驅(qū)動(dòng)四位數(shù)碼管顯示溫度值:012.5℃
;設(shè)定DS1620的上限溫度值(THIGH)為30度,下限溫度值(TLOW)為20度.
;用DS1620測(cè)量溫度,用SAA1064驅(qū)動(dòng)四位數(shù)碼管顯示溫度值:012.5℃
;顯示器位置: 第一位 第二位 第三位 第四位
;顯示數(shù)值 0 1` 2 . 5
;數(shù)值存儲(chǔ)單元地址 72H 73H 74H 75H
;設(shè)定DS1620的上限溫度值(THIGH)為30度,下限溫度值(TLOW)為20度.
$include (c8051f020.inc)
RST EQU P0.4 ;復(fù)位線
CLK EQU P0.3 ;時(shí)鐘線
DQ EQU P0.2 ;數(shù)據(jù)線
WR_CONFIG EQU 0CH ;寫(xiě)DS1620 CONFIGUARATION 命令
RD_TEMP EQU 0AAH ;讀DS1620 溫度值命令命令
RD_CONFIG EQU 0ACH ;讀DS1620 CONFIGURATION命令
STOP_CONVERT EQU 22H ;停止轉(zhuǎn)換命令
START_CONV EQU 0EEH ; 開(kāi)始轉(zhuǎn)換命令
WR_TH EQU 01H ;寫(xiě)溫度上限命令
WR_TL EQU 02H ; 寫(xiě)溫度下限命令
RD_TH EQU 0A1H ; 讀溫度上限命令
RD_TL EQU 0A2H ; 讀溫度下限命令
SLAW EQU 060H ;存放SAA1064 寫(xiě)的尋址字節(jié)在60H中
SLAR EQU 061H ;存放SAA1064 讀的尋址字節(jié)在61H中
SLA EQU 68H
NUMBYT EQU 6BH ;被傳送的字節(jié)數(shù)存放單元
MTD EQU 20H ;發(fā)送數(shù)據(jù)緩沖區(qū)首地址
MRD EQU 30H ;接收字節(jié)緩沖區(qū)首地址
VSCL EQU P0.1 ;IIC時(shí)鐘信號(hào)
VSDA EQU P0.0 ;LLC數(shù)據(jù)輸入/輸出線
COM EQU 17H ;SAA1064 的設(shè)置。
SAA1064ADR EQU 070H ; SAA1064芯片的寫(xiě)地址
;SMBus狀態(tài):
SMB_BUS_ERROR EQU 00H ;(所有方式)總線錯(cuò)誤
SMB_START EQU 08H ;(MT&MR)主收發(fā)器發(fā)送起始位成功.再將從機(jī)寫(xiě)地址送SMB0DAT
SMB_RP_START EQU 10H ;(MT&MR)主收發(fā)器重復(fù)發(fā)送起始位成功,再將從機(jī)讀地址送SMB0DAT
SMB_MTADDACK EQU 18H ;(MT)主收發(fā)器發(fā)送從地址+W成功;收到 ACK(從機(jī)應(yīng)答)
;再將從器件的子地址送入SMB0DAT
SMB_MTADDNACK EQU 20H ;(MT)主收發(fā)器發(fā)送從地址+W成功;收到 NACK(從機(jī)無(wú)應(yīng)答)
SMB_MTDBACK EQU 28H ;(MT)主收發(fā)器發(fā)送數(shù)據(jù)字節(jié)成功;收到ACK(從機(jī)應(yīng)答)
SMB_MTDBNACK EQU 30H ;(MT)主發(fā)送器發(fā)送數(shù)據(jù)成功;收到NACK(從機(jī)無(wú)應(yīng)答).
SMB_MTARBLOST EQU 38H ;(MT)總線競(jìng)爭(zhēng)失敗
SMB_MRADDACK EQU 40H ;(MR)主收發(fā)器發(fā)送從地址+R成功;收到 ACK(從機(jī)應(yīng)答)
SMB_MRADDNACK EQU 48H ;(MR)主收發(fā)器發(fā)送從地址+R成功;收到NACK(從機(jī)無(wú)應(yīng)答)
SMB_MRDBACK EQU 50H ;(MR)主收發(fā)器接收數(shù)據(jù)成功;主機(jī)發(fā)送ACK
SMB_MRDBNACK EQU 58H ;(MR)主收發(fā)器接收數(shù)據(jù)成功;主機(jī)發(fā)送NACK
DSEG ; 數(shù)據(jù)段;
ORG 30H;
TRANSMIT_BYTE: DS 1 ;保存SMBus待發(fā)送的字節(jié)
RECEIVE_BYTE: DS 1 ; 保存SMBus剛收到的字節(jié)
SLA_ADD: DS 1 ;保存從地址
WRI_ADD: DS 1 ; 保存從地址+ WRITE
READ_ADD: DS 1 ; 保存從地址+ READ
SUBADDR: DS 1 ;要訪問(wèn)器件的子地址
; 用于暫存數(shù)據(jù)的單元
DATA_COUNT: DS 1 ;測(cè)試計(jì)數(shù)器變量
DATA_BYTE: DS 1 ; 測(cè)試數(shù)據(jù)
DATA_ADDR: DS 1 ; 測(cè)試存儲(chǔ)器地址
BSEG ; 數(shù)據(jù)段;
ORG 00H
RW: DBIT 1 ;R/W命令位。l=READ,0=WRITE
SM_BUSY: DBIT 1 ;SMBus忙標(biāo)志(軟件保存)
BYTE_SENT : DBIT 1
CSEG ;代碼段
ORG 00H ;復(fù)位
LJMP MAIN
ORG 03BH ;SMBus中斷向量
LJMP SMBus_ISR
ORG 100H
MAIN: MOV WDTCN,#0deH ;關(guān)看門(mén)狗
MOV WDTCN,#0adH
LCALL PORT_Init
MOV XBR2,#40H
LCALL DS1620INT ;DS1620初始化:設(shè)定上/下限溫度值
ACALL RDS1620 ;讀出DS1620采集的溫度值,并轉(zhuǎn)化為十進(jìn)制數(shù)據(jù)
LCALL DELY ;延時(shí)一秒
LCALL DISPLAY ;顯示溫度值(四位)
AJMP MAIN
RDS1620: SETB RST
MOV A,#START_CONV ;DS1620命令 開(kāi)始轉(zhuǎn)換
CALL OUT_1620
CLR RST
NOP
NOP
SETB RST
MOV A,#RD_TEMP ; DS1620命令 讀出溫度值
ACALL OUT_1620
ACALL IN_1620 ;輸入溫度值的低8位,存入20H中.
MOV 20H,A
ACALL IN_1620 ;輸入溫度值的高8位,存入A中.
MOV 72H,#0 ;71H存符號(hào)位"+"("0"為正,"1"為`負(fù)")
ANL A,#01
CJNE A,#1,SV ;判符號(hào)位.,(A)=0 溫度為正,(A)=1,溫度為負(fù)
MOV 72H,#10H ;71H存符號(hào)位"-" ("-"的字形碼為"40H")查表地址為10H
MOV A,20H ;溫度為負(fù)值,數(shù)據(jù)為補(bǔ)碼,應(yīng)求反加1
CPL A
INC A
MOV 75H,A
SV: MOV A,20H
ACALL EXCH ;子程序EXCH將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制數(shù)據(jù)
RET
EXCH : CLR C ;子程序EXCH將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制數(shù)據(jù)
MOV B,A
ANL A,#01
MOV 75H,A
MOV A,B
RRC A ;存放在72H(百為),73H(十位),74H(個(gè)位),75H(小數(shù)位)中
MOV B,#10
DIV AB
PUSH ACC
MOV 74H,B
POP ACC
MOV B,#10
DIV AB
MOV 72H,A ;存放在72H(百位),73H(十位),74H(個(gè)位),75H(小數(shù)位)中
MOV 73H,B
MOV A,B
MOV A,75H
MOV 75H,#0
CJNE A,#1,VS
MOV 75H,#5
VS: RET
OUT_1620: MOV R0,#8H ;串行輸出一個(gè)字節(jié)(8 BIT),輸出數(shù)據(jù)在A中。
WLP: RRC A
CLR CLK
MOV DQ,C
SETB CLK
DJNZ R0,WLP
RET
IN_1620: MOV R0,#8 ;串行輸入一個(gè)字節(jié)(8 BIT),結(jié)果在R2中.
SETB DQ
MOV R2,#0
RLP: CLR CLK
MOV C,DQ
SETB CLK
MOV A,R2
RRC A
MOV R2,A
DJNZ R0,RLP
RET
DELY: MOV R5,#8 ;延時(shí)子程序(延時(shí)一秒)
TM2: MOV R6,#0H
TM1: MOV R7,#0H
DJNZ R7,$
DJNZ R6,TM1
DJNZ R5,TM2
RET
DISPLAY:CLR SM_BUSY ;為第一次傳輸清除SM_Busy標(biāo)志
MOV R1,#50H ;從50H--5EH 看中斷過(guò)程
; SAA1064W: 依次連續(xù)寫(xiě)入6個(gè)數(shù)到SAA1064中去:17H,3FH,06H,5BH,4FH
MOV SUBADDR,#00H ; 裝入SAA1064的子地址(SUBADR=00H)
MOV DATA_COUNT,#6H ; 裝入待寫(xiě)數(shù)據(jù)塊的長(zhǎng)度
MOV SLA_ADD,#SAA1064ADR ; 裝入從器件的寫(xiě)地址
MOV 71H,#0AH ;(TAB+0AH)=17H=COM
MOV R0,#71H ; R0做計(jì)數(shù)器用
LCALL SEND
CLR EA ; 調(diào)用數(shù)據(jù)發(fā)送子程序
RET ; SAA1064顯示結(jié)束結(jié)束,返回主程序
TAB: DB 3fH,06H,5bH,4FH,66H,6DH,7DH,07H,7FH,6FH,17H,40H
;發(fā)送子程序SEND;
;SEND子程序執(zhí)行一次向SAA1064寫(xiě)入六位數(shù)據(jù)(0,17H,4FH,5BH,06H,3FH)的過(guò)程。
;該子程序管理SM_BUSY位,設(shè)置 RW=WRITE,裝載 SLAW,啟動(dòng)寫(xiě)操作。
SEND:
PUSH ACC ;保存累加器
JB SM_BUSY,$ ;等待SMBus空閑
CLR RW ; RW= 0(寫(xiě))
MOV A,SLA_ADD ; 取SLA_ADD到A
MOV WRI_ADD,A ;將SLA_ADD+ WRITE保存到SLAW
SETB SM_BUSY ; 占用SMBus
SETB STA ; 啟動(dòng)發(fā)送過(guò)程
JB SM_BUSY,$ ;等待發(fā)送結(jié)束(在中斷中處理)
POP ACC
RET
;SMBus 中斷程序 ,處理SMBUS 中斷
SMBus_ISR:
PUSH PSW ; 保護(hù)現(xiàn)場(chǎng)
PUSH ACC ;
PUSH DPH ;
PUSH DPL ;
MOV A,SMB0STA ; 將當(dāng)前SMBus狀態(tài)(SMB0STA)裝入累加器
; 每個(gè)狀態(tài)對(duì)應(yīng)一個(gè)地址偏移量
MOV @R1,A ;在50H---60H中存放SMB0STA和SMB0DAT,可查看中斷路徑
INC R1
MOV @R1,SMB0DAT;
INC R1
MOV DPTR,#SMB_STATE_TABLE ; DPTR指向狀態(tài)表的起始地址
JMP @A+DPTR ;轉(zhuǎn)移到當(dāng)前狀態(tài)
;SMBuS狀態(tài)表 ;(SMB0STA =00H)
SMB_STATE_TABLE: ; SMB_BUS_ERROR總線錯(cuò)誤(對(duì)所有方式)
ORG SMB_STATE_TABLE+SMB_BUS_ERROR
SETB STO ; 停止位置1,使硬件復(fù)位
JMP SMB_ISR_END ; 中斷返回
;SMB_START ; (SMB0STA =08H)
;主發(fā)送器/接收器發(fā)送起始位成功.再將從機(jī)寫(xiě)地址送SMB0DAT并清除START位.
ORG SMB_STATE_TABLE+SMB_START
MOV SMB0DAT,WRI_ADD ; 裝載從地址+ W````
CLR STA ; 清除START位
JMP SMB_ISR_END ; 中斷返回
;SMB_RP_START ;(SMB0STA =10H)
;主發(fā)送器/接收器發(fā)送重復(fù)起始位成功.
;再將從機(jī)讀地址送SMB0DAT并清除START位.
ORG SMB_STATE_TABLE+SMB_RP_START
MOV SMB0DAT,READ_ADD ;裝載從地址+ R
CLR STA ; 清除START位
JMP SMB_ISR_END
;SMB_MTADDACK (SMB0STA =18H)
;主發(fā)送器(MT)發(fā)送從地址+W成功;收到 ACK(從機(jī)應(yīng)答)
;再將要發(fā)的子地址送入SMB0DAT.
ORG SMB_STATE_TABLE+SMB_MTADDACK
MOV SMB0DAT,SUBADDR ;裝載從器件的子地址到SMB0DAT.
SETB BYTE_SENT ;BYTE_SENT=1.在下一次中斷調(diào)用時(shí)存儲(chǔ)器地址剛被發(fā)送
JMP SMB_ISR_END
;SMB_MTADDNACK (SMB0STA =20H)
;主發(fā)送器(MT)發(fā)送從地址+W成功;收到 NACK(從機(jī)無(wú)應(yīng)答)
;用確認(rèn)查詢重試。發(fā)送 STOP+START
ORG SMB_STATE_TABLE + SMB_MTADDNACK
SETB STO
SETB STA
JMP SMB_ISR_END
;SMB_MTDBACK (SMB0STA =28H)
;主發(fā)送器(MT)發(fā)送數(shù)據(jù)字節(jié)成功;收到ACK(從機(jī)應(yīng)答)
;檢查BYTE_SENT:如果為1,說(shuō)明剛發(fā)出的是存儲(chǔ)器地址;為0,剛發(fā)出的是數(shù)據(jù)字節(jié)
ORG SMB_STATE_TABLE+SMB_MTDBACK
DJNZ DATA_COUNT,ADDRESS_SENT
; JBC BYTE_SENT,ADDRESS_SENT ;如果BYTE_SENT=1,清除該位并轉(zhuǎn)到
;ADDRESS_SENT去執(zhí)行狀態(tài)表以外的處理程序
JMP DATA_SENT ; 如果BYTE_SENT=0,數(shù)據(jù)剛被發(fā)出,
; 傳輸過(guò)程完成,轉(zhuǎn)到傳輸結(jié)束
;SMB_MTDBNACK ;(SMB0STA =30H)
;主發(fā)送器(MT)發(fā)送數(shù)據(jù)成功;收到NACK,從機(jī)無(wú)應(yīng)答.
;用確認(rèn)查詢重試。發(fā)送STOP+START重試
ORG SMB_STATE_TABLE+SMB_MTDBNACK
SETB STO
SETB STA
JMP SMB_ISR_END
; SMB_MTARBLOST ;(SMB0STA =38H);競(jìng)爭(zhēng)失敗.重新啟動(dòng)傳輸.
ORG SMB_STATE_TABLE+SMB_MTARBLOST
SETB STO
SETB STA
JMP SMB_ISR_END
; SMB_MRADDACK ;(SMB0STA =40H)
;(MR)主收發(fā)器發(fā)送從地址+R成功;收到 ACK(從機(jī)應(yīng)答).主機(jī)發(fā)送ACK.
ORG SMB_STATE_TABLE+SMB_MRADDACK
SETB AA ;主機(jī)發(fā)送ACK,轉(zhuǎn)入SMB_MRDBACK
JMP SMB_ISR_END
; SMB_MRADDNACK ;(SMB0STA =48H)
;(MR)主收發(fā)器發(fā)送從地址+R成功;收到NACK(從機(jī)無(wú)應(yīng)答),發(fā)送重復(fù)起始位重試
ORG SMB_STATE_TABLE+SMB_MRADDNACK
SETB STA
JMP SMB_ISR_END
;SMB_MRDBACK (SMB0STA =50H)
;(MR)主收發(fā)器接收數(shù)據(jù)成功;主機(jī)發(fā)送ACK .
ORG SMB_STATE_TABLE+SMB_MRDBACK
MOV RECEIVE_BYTE, SMB0DAT
CLR AA ;主機(jī)發(fā)NACK(清除AA),下一次中斷來(lái)時(shí)轉(zhuǎn)入;SMB_MRDBNACK(58H)
CLR SM_BUSY;
JMP SMB_ISR_END
;SMB_MRDBNACK ;(SMB0STA =58H)
;(MR)主收發(fā)器接收數(shù)據(jù)成功;主機(jī)發(fā)送NACK
;讀操作完成。讀數(shù)據(jù)寄存器并發(fā)送STOP
ORG SMB_STATE_TABLE+SMB_MRDBNACK
MOV RECEIVE_BYTE, SMB0DAT
SETB STO
SETB AA ;主機(jī)發(fā)ACK,為下一次傳輸置位AA
CLR SM_BUSY;
JMP SMB_ISR_END
;狀態(tài)表結(jié)束,處理"SMB_MTDBACK"狀態(tài)碼的程序段。
;對(duì)于地址字節(jié)剛發(fā)出的狀態(tài)。通過(guò)檢查RW位確定處理方法。
;如果為讀,則轉(zhuǎn)到RW_READ,如果為寫(xiě),則將待發(fā)送數(shù)據(jù)裝入SMBODAT。
ADDRESS_SENT:
MOV DPTR,#TAB ;查表,找到顯示的數(shù)據(jù)(字型碼)
MOV A,@R0
MOVC A,@A+DPTR
MOV DATA_BYTE ,A
CJNE R0,#74H,VV
ADD A,#80H ;加小數(shù)點(diǎn)
MOV DATA_BYTE ,A
VV: MOV SMB0DAT,DATA_BYTE ;將要顯示的數(shù)據(jù)(字型碼)送SAA1064
INC R0
JMP SMB_ISR_END ; 中斷返回
;對(duì)于地址字節(jié)剛發(fā)出的狀態(tài)。重復(fù)發(fā)送START,啟動(dòng)存儲(chǔ)器讀操作
RW_READ:
SETB STA ;重復(fù)發(fā)送START
JMP SMB_ISR_END ;中斷返回
;這是一個(gè)寫(xiě)操作,數(shù)據(jù)字節(jié)已發(fā)出。傳輸過(guò)程結(jié)束。發(fā)送STOP,釋放總線,中斷返回
DATA_SENT:
SETB STO ;發(fā)送STOP后中斷返回
CLR SM_BUSY ; 釋放 SMBus
JMP SMB_ISR_END ; 中斷返回
;SMBus ISR exit
;恢復(fù)現(xiàn)場(chǎng),清除SI位,從中斷返回
SMB_ISR_END:
CLR SI
POP DPL
POP DPH
POP ACC
POP PSW
RETI
PORT_Init :
MOV OSCICN,#14H ;內(nèi)部晶振設(shè)定為2MHZ
MOV P0MDOUT,#0H ;P0口為開(kāi)漏方式
MOV XBR0,#01H ;通過(guò)功能選擇開(kāi)關(guān)將將SDA接P0.0引腳,SCL接P0.1引腳
MOV XBR2 ,#40H; 允許功能選擇開(kāi)關(guān)和弱上拉
; 初始化SMBus程序段
MOV SMB0CN,#04H ; 配置 SMBus在確認(rèn)周期發(fā)送 ACK
MOV SMB0CR,#0F6H ; 設(shè)置時(shí)鐘速率=100 kHz (系統(tǒng)時(shí)鐘為2MHZ)
ORL SMB0CN,#40H ; 允許SMBus
ORL EIE1,#02H ; 允許SMBus中斷
SETB EA
RET
DS1620INT:
SETB RST
MOV A,#WR_TH
ACALL OUT_1620
MOV A,#3CH ;設(shè)定上限溫度:30度
LCALL OUT_1620
CLR RST
NOP
NOP
SETB RST
MOV A,#WR_TL
ACALL OUT_1620
MOV A,#28H ;設(shè)定下限溫度:20度
LCALL OUT_1620
CLR RST
RET
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -