找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3444|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

18b20顯示亂碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:89258 發(fā)表于 2015-9-2 12:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

ORG   0000H
A_BIT   EQU  20H       ;存放個位數(shù)變量
B_BIT   EQU   21H       ;存放十位數(shù)變量
FLAG    EQU   38H       ;DS18B20是否存在標志
DQ      EQU  P2.0      
MAIN:    ACALL   RE_TEMP        ;對傳感器設(shè)置及讀取   
ACALL   TURN       ;轉(zhuǎn)化溫度子程序         
         ACALL  DISPLAY         ;顯示子程序
         JMP  MAIN            ;循環(huán)                    
RE_TEMP:             ;對DS18B20初始化及讀取   
SETB    DQ            
ACALL   RESET_1820   ;  調(diào)用復(fù)位子程序   
JB    FLAG,ST         ;判斷DS1820是否存在?   
RET                                            
ST:                         ; DS18B20存在
         MOV    A,#0CCH         ;跳過ROM匹配
ACALL  WRITE_1820      ;寫入數(shù)據(jù)   
MOV   A,#44H          ;發(fā)出溫度轉(zhuǎn)換命令   
ACALL  WRITE_1820      ;寫入數(shù)據(jù)   
ACALL   RESET_1820  ;   準備讀溫度前先復(fù)位   
MOV   A,#0CCH         ;跳過ROM匹配   
ACALL  WRITE_1820      ;寫入數(shù)據(jù)   
MOV   A,#0BEH         ;發(fā)出讀溫度命令   
ACALL  WRITE_1820      ;寫入數(shù)據(jù)
ACALL  READ_1820       ;讀出溫度數(shù)據(jù)            
RET                                          
RESET_1820:      SETB   DQ            ;復(fù)位(有具體的時序要求)      
NOP
         CLR    DQ        ;――――――――――――;主機發(fā)出延時537微秒的復(fù)位低脈沖   
MOV   R1,#3
DLY:    MOV   R0,#107   
DJNZ  R0,$
DJNZ  R1,DLY ;―――――――――――― ;然后拉高數(shù)據(jù)線   SETB   DQ           
NOP   
NOP   
NOP ;――――――――――――     
MOV   R0,#25H         
T2:  JNB    DQ,T3      ;  等待DS18B20回應(yīng)   
DJNZ   R0,T2   
JMP   T4           ;――――――――――――
T3:  SETB   FLAG        ;置標志位,表示DS1820存在   
JMP   T5 ;――――――――――――
T4:   CLR    FLAG       ;清標志位,表示DS1820不存在        
JMP   T7 ;――――――――――――
T5:  MOV   R0,#117
T6:  DJNZ  R0,T6           ;時序要求延時一段時間
;――――――――――――
T7:  SETB    DQ         
          RET                                            ;――――――――――――  
WRITE_1820:      MOV   R2,#8           ;寫入DS18B20(有具體的時序要求)   一共8位數(shù)據(jù)   
CLR   C
WR1: CLR   DQ             ;總線低位,開始寫入     
MOV   R3,#7
         DJNZ  R3,$            ;保持16微秒以上   
RRC   A    ;把字節(jié)DATA分成8個BIT環(huán)移給C   
MOV   DQ,  C         ;寫入一個BIT   
MOV   R3,#23
         DJNZ  R3,$            ;等待   SETB  DQ            ;重新釋放總線   NOP
         DJNZ  R2,WR1          ;寫入下一個BIT
SETB   DQ           
         RET                                             
READ_1820:       MOV   R4,#2      ;將溫度高位和低位DS18B20中讀出  讀出兩個字節(jié)的據(jù)   
MOV   R1,#29H      ;低位存入29H,高位存入28h
RE0: MOV  R2,#8           ;數(shù)據(jù)一共有8位
RE1:    CLR  C   
SETB  DQ            
NOP
         NOP                                 
         CLR    DQ           ;讀前總線保持為低                  
NOP  
  NOP   
NOP
        SETB   DQ           ;開始讀總線釋放                     
        MOV    R3,#9
RE2:  DJNZ   R3,RE2         ;延時18微妙   
MOV  C,DQ          ;從總線讀到一個BIT
MOV  R3,#23
RE3: DJNZ  R3,RE3    ;      等待100秒   
RRC   A             ;  把讀得的位價值環(huán)移給A  
         DJNZ  R2,RE1         ;讀下一個BIT  
         MOV   @R1,A   
DEC   R1   
DJNZ  R4,RE0
         RET                                          
TURN:  MOV   A,29H      
         MOV   C,40H ;將28中的最低位移入C     
RRC   A     
MOV   C,41H   
RRC   A   
MOV   C,42H   
RRC   A   
MOV   C,43H
RRC   A  
        MOV   29H,A
         RET                                            
DISPLAY:        MOV   A,29H           ;將29H中的十六進制數(shù)成10進制
        MOV   B,#10           ;10進制/10=10進制   DIV   AB
        MOV   B_BIT, A        ;十位在A  
  MOV   A_BIT, B        ;個位在B
        MOV   DPTR,#TABLE     ;指定查表啟始地址   
MOV   R0,#4
DP1:   MOV  R1, #250        ;顯示1000次
LOOP:   MOV  A,A_BIT         ;取個位數(shù)
       MOVC  A,@A+DPTR       ;查個位數(shù)的7段代碼   
ACALL SEND            ;送出個位的7段代碼   
CLR   P0.6            ;開個位顯示
ACALL  DELAY           ;   
SETB   P0.6
         MOV  A,B_BIT         ;取十位數(shù)   
MOVC   A,@A+DPTR       ;查十位數(shù)的7段代碼   
ACALL SEND            ;送出個十位的7段代碼   
CLR   P0.7            ;開十位顯示   
ACALL  DELAY         ;顯示1MS   SETB   P0.7
         DJNZ   R1,LOOP         ;250次沒完循環(huán)   
DJNZ   R0,DP1         ; 4個250次沒完循環(huán)   
RET                                          
DELAY:        MOV   R7, #80     ;1ms延時
DJNZ  R7,$  
        RET
DELAY10ms:   MOV  R5,#50
DLY1: MOV  R6,#100
DLY2: MOV  R7,#100
DJNZ R7,$   
DJNZ R6,DLY2  
        DJNZ R5,DLY1   
RET
SEND:   MOV     R2,#8
LOOPS:  CLR     P0.0   
RLC     A
         MOV     P0.1,C  
SETB    P0.0   
DJNZ    R2,LOOPS
RET                                          
TABLE:        DB   0C0H,0F9H,0A4H,0B0H,99H     ;數(shù)碼管共陽極0~9代碼   
DB   92H,82H,0F8H,80H,90H                        
END


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

使用道具 舉報

沙發(fā)
ID:89258 發(fā)表于 2015-9-2 12:33 | 只看該作者
哪里出問題了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表