找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3086|回复: 1
打印 上一主题 下一主题
收起左侧

18b20显示乱码

[复制链接]
跳转到指定楼层
楼主

ORG   0000H
A_BIT   EQU  20H       ;存放个位数变量
B_BIT   EQU   21H       ;存放十位数变量
FLAG    EQU   38H       ;DS18B20是否存在标志
DQ      EQU  P2.0      
MAIN:    ACALL   RE_TEMP        ;对传感器设置及读取   
ACALL   TURN       ;转化温度子程序         
         ACALL  DISPLAY         ;显示子程序
         JMP  MAIN            ;循环                    
RE_TEMP:             ;对DS18B20初始化及读取   
SETB    DQ            
ACALL   RESET_1820   ;  调用复位子程序   
JB    FLAG,ST         ;判断DS1820是否存在?   
RET                                            
ST:                         ; DS18B20存在
         MOV    A,#0CCH         ;跳过ROM匹配
ACALL  WRITE_1820      ;写入数据   
MOV   A,#44H          ;发出温度转换命令   
ACALL  WRITE_1820      ;写入数据   
ACALL   RESET_1820  ;   准备读温度前先复位   
MOV   A,#0CCH         ;跳过ROM匹配   
ACALL  WRITE_1820      ;写入数据   
MOV   A,#0BEH         ;发出读温度命令   
ACALL  WRITE_1820      ;写入数据
ACALL  READ_1820       ;读出温度数据            
RET                                          
RESET_1820:      SETB   DQ            ;复位(有具体的时序要求)      
NOP
         CLR    DQ        ;――――――――――――;主机发出延时537微秒的复位低脉冲   
MOV   R1,#3
DLY:    MOV   R0,#107   
DJNZ  R0,$
DJNZ  R1,DLY ;―――――――――――― ;然后拉高数据线   SETB   DQ           
NOP   
NOP   
NOP ;――――――――――――     
MOV   R0,#25H         
T2:  JNB    DQ,T3      ;  等待DS18B20回应   
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位数据   
CLR   C
WR1: CLR   DQ             ;总线低位,开始写入     
MOV   R3,#7
         DJNZ  R3,$            ;保持16微秒以上   
RRC   A    ;把字节DATA分成8个BIT环移给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中读出  读出两个字节的据   
MOV   R1,#29H      ;低位存入29H,高位存入28h
RE0: MOV  R2,#8           ;数据一共有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             ;  把读得的位价值环移给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中的十六进制数成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         ;取个位数
       MOVC  A,@A+DPTR       ;查个位数的7段代码   
ACALL SEND            ;送出个位的7段代码   
CLR   P0.6            ;开个位显示
ACALL  DELAY           ;   
SETB   P0.6
         MOV  A,B_BIT         ;取十位数   
MOVC   A,@A+DPTR       ;查十位数的7段代码   
ACALL SEND            ;送出个十位的7段代码   
CLR   P0.7            ;开十位显示   
ACALL  DELAY         ;显示1MS   SETB   P0.7
         DJNZ   R1,LOOP         ;250次没完循环   
DJNZ   R0,DP1         ; 4个250次没完循环   
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     ;数码管共阳极0~9代码   
DB   92H,82H,0F8H,80H,90H                        
END


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89258 发表于 2015-9-2 12:33 | 只看该作者
哪里出问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表