文档库 最新最全的文档下载
当前位置:文档库 › 汇编ds18b20

汇编ds18b20

/****实验现象:数码管显示当前温度值,当温度超过30摄氏度时LED5点亮并且蜂鸣器响起******/

A_BIT EQU 20H ;存放个位数变量
B_BIT EQU 21H ;存放十位数变量
FLAG EQU 38H ;DS18B20是否存在标志
DQ EQU P2.7 ;DQ引脚由P0.7控制

ORG 0000H
LJMP MAIN
ORG 0030H ;跳过异常向量区
;-----------主程序-------------
MAIN:
LCALL RE_TEMP ;调用读取温度子程序
LCALL TURN ;数据转化子程序
LCALL DISPLAY ;显示子程序
LJMP MAIN
;------------------------------
;---初始化及读取温度值子程序---
RE_TEMP:
SETB DQ
LCALL RESET_1820 ;调用复位子程序
JB FLAG,ST ;判断DS18B20是否存在
HOME:
RET
ST: ;DS18B20存在
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写入数据子程序
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820 ;调用写入数据子程序
LCALL RESET_1820 ;调用读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写入数据子程序
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820 ;调用写入数据子程序
LCALL READ_1820 ;调用读取数据子程序
LJMP HOME
;------------------------------
;---------复位子程序-----------
RESET_1820:
SETB DQ
NOP
CLR DQ
;-----主机发出复位低脉冲-------
MOV R1,#3
DLY:
MOV R0,#107
DJNZ R0,$
DJNZ R1,DLY
;-------然后拉高数据线---------
SETB DQ
NOP
NOP
NOP
;------等待DS18B20回应---------
MOV R0,#25H
T2:
JNB DQ,T3
DJNZ R0,T2
LJMP T4
;-标志位FLAG=1,表示DS18B20存在-
T3:
SETB FLAG
LJMP T5
;-标志位FLAG=0,表示DS18B20不存在-
T4:
CLR FLAG
LJMP T7
;-----时序要求延时一段时间-----
T5:
MOV R0,#110
T6:
DJNZ R0,T6
T7:
SETB DQ
RET
;---------写入子程序-----------
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;C=0
WR1:
CLR DQ ;总线低位,开始写入
MOV R3,#7
DJNZ R3,$ ;保持16us以上
RRC A ;把字节DATA分成8个位,环移给C
MOV DQ,C ;写入一个位
MOV R3,#23
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个位
SETB DQ
RET
;----------读子程序------------
READ_1820:
MOV R4,#2 ;读出两个字节的数据
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 ;延时18us
MOV C,DQ ;从总线读到一个位
MOV R3,#23
RE3:
DJNZ R3,RE3 ;等待50us
RRC A ;把读得的位值环移给A
DJNZ R2,RE1 ;读下一个位
MOV @R1,A
DEC R1
DJNZ R4,RE0
RET
;--------数据转化子程序--------
TURN:
MOV A,29H
MOV C,40H ;将28中的最低位移入C(40~43H对应的是28H的位地址,也可以改用2

8H.0~28H.3)
RRC A ;将A中内容和进位位一起循环右移一位
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
RET
;--------温度显示子程序--------
DISPLAY:MOV P2,#0F9H
CLR WR
MOV P0,#0FFH
SETB WR
MOV P2,#0F8H
CLR WR
MOV P0,#0FDH
SETB WR
LCALL DEL2MS
MOV P2,#0F9H
CLR WR
MOV P0,#0FFH
SETB WR
MOV P2,#0F8H
CLR WR
MOV P0,#0FBH
SETB WR
LCALL DEL2MS
/* MOV P2,#0F9H
CLR WR
MOV P0,#0FFH
SETB WR
LCALL DELAY */
/* MOV A,29H ;上限报警处理部分(比较的方法做)
SUBB A,#30 ;设置上限温度是30摄氏度
JC NO_ALARM
CLR P3.2 ;蜂鸣器报警
LJMP GONEXT
NO_ALARM:
SETB P3.2*/
GONEXT:
MOV A,29H
MOV B,#10
DIV AB ;十位在A中,个位在B中
MOV B_BIT,A
MOV A_BIT,B
MOV A,B_BIT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,#0F9H
CLR WR
MOV P0,A
SETB WR
MOV P2,#0F8H
CLR WR
MOV P0,#0FBH
SETB WR
LCALL DEL2MS

MOV A,A_BIT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,#0F9H
CLR WR
MOV P0,A
SETB WR
MOV P2,#0F8H
CLR WR
MOV P0,#0FDH
SETB WR
LCALL DEL2MS

MOV A,#10
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,#0F9H
CLR WR
MOV P0,A
SETB WR
MOV P2,#0F8H
CLR WR
MOV P0,#0FEH
SETB WR
LCALL DEL2MS
RET
;---------延时子程序----------
DEL2MS:
MOV R6,#28H ;2MS延时,用作数码管动态扫描
DS1:
MOV R7,#19H
DS2:
DJNZ R7,DS2
DJNZ R6,DS1
RET
DELAY:MOV R3,#03H
DL1: MOV R1,#0FFH
DL2:MOV R2,#0FFH
DL3:DJNZ R2,$
DJNZ R1,DL2
DJNZ R3,DL1
RET

;---------显示段码表----------
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,46H
END

相关文档