本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
ORG 0000H
AJMP MAIN
ORG 0040H
COUNT EQU 30H ;地址计数常数
WENDU EQU 32H ;实际温度地址
WENDUD EQU 33H ;温度低位地址
WENDUG EQU 34H ;温度高位地址
SDWDG EQU 35H ;设定高温度地址
SDWDD EQU 36H ;设定低温度地址
;---------------------------------------------------------------------
RS EQU P2.0 ;
RW EQU P2.1 ;
E EQU P2.2 ;
PSB EQU P2.3 ;
RST EQU P2.5 ;
SHUJU EQU P3.3 ;
K1 EQU P1.4 ;按键1,设定温度值减1
K2 EQU P1.5 ;按键2,设定温度值加1
K3 EQU P1.6 ;按键3,确定修改和确定退出
;-----------这部分暂时还没有写出,用不到----------
MAIN:LCALL ROM
LCALL RESET
LCALL DU18B20 ;读取温度
LCALL RESET
MOV A,#55H ;ROM匹配命令
LCALL XIEB20
MOV A,40H
LCALL XIEB20
MOV A,41H
LCALL XIEB20
MOV A,42H
LCALL XIEB20
MOV A,43H
LCALL XIEB20
MOV A,44H
LCALL XIEB20
MOV A,45H
LCALL XIEB20
MOV A,46H
LCALL XIEB20
MOV A,47H
LCALL XIEB20
MOV A,#0BEH
LCALL XIEB20
LCALL WDSJ
;-----------初始化DS18B20程序----------------------
RESET:CLR EA ;初始化DS18B20程序
L0:CLR SHUJU ;DS18B20总线为低电平复位
MOV R2,#200 ;?????????????????
L1:CLR SHUJU
DJNZ R2,L1 ;保持总线复位电平400us
SETB SHUJU ;释放总线
MOV R2,#30 ;
L4:DJNZ R2,L4 ;释放总线,保持60us
CLR C ;清除存在的信号
ORL C,SHUJU ;
JC L0 ;判断是否存在,不存在则重新再来
MOV R6,#80
L5:ORL C,SHUJU
JC L3
DJNZ R6,L5
SJMP L0
L3:MOV R2,#240
L2:DJNZ R2,L2
RET
ROM:CLR EA ;EA中断标志位,置零,禁止任何中断(DS18B20的要
LCALL RESET ;初始化DS18B20 ---------------
MOV A,#33H
LCALL XIEB20 ;读DS18B20ROM命令
LCALL READ ;读当前DS18B20序列号
MOV 40,A
LCALL READ
MOV 41H,A
LCALL READ
MOV 42H,A
LCALL READ
MOV 43H,A
LCALL READ
MOV 44H,A
LCALL READ
MOV 45H,A
LCALL READ
MOV 46H,A
LCALL READ
MOV 47H,A
SETB EA ;EA置1,开
RET
;-----------
READ:CLR EA
MOV R6,#8 ;连续8个bits
RE1:CLR SHUJU ;读前总线保持为低
MOV R4,#4
NOP
SETB SHUJU
RE2:DJNZ R2,RE2 ;持续8us
MOV C,SHUJU ;从总线读得一个bits
RRC A ;SHUJU不是被clr了吗?
MOV R5,#30
RE3:DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一位
SETB SHUJU
RET
;--------------
;写入18B20指令
;===========================================================
XIEB20: MOV R2,#8 ;一共8位数据
CLR CY
XIE: CLR SHUJU ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#09
DJNZ R3,$ ;总线复位保持18微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV SHUJU,C ;写入一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
SETB SHUJU ;重新释放总线
NOP
DJNZ R2,XIE ;写入下一个BIT
SETB SHUJU
RET
;----------------------------
;--------------------------------------------------------------
; 读18B20温度
;***********************************************************
DU18B20:
MOV A,#0CCH ;
LCALL XIEB20
MOV A,#44H ;发出温度转换命令
LCALL XIEB20 ;
LCALL RESET ;
MOV A,#0CCH ;
LCALL XIEB20 ;写18B20指令
MOV A,#0BEH ;发出读温度命令
LCALL XIEB20 ;
LCALL WDSJ ;温度数据
RET
;------------------------------
;读温度子程序
;从DS18B20中读出温度低位、高位,
;存入33H,34H,35H,36H
;****************************************************
WDSJ: MOV R4,#04H
MOV R1,#33H ; 存入33H,34H
RE00: MOV R2,#8
RE01: CLR C
SETB SHUJU
NOP
NOP
CLR SHUJU ;读前总线保持为低
NOP
NOP
NOP
SETB SHUJU ;开始读总线释放
MOV R3,#07 ;延时15微妙
DJNZ R3,$
MOV C,SHUJU ;从DS18B20总线读得一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
LCALL WDCZ
RET
;==============================================================
;处理实际温度 BCD 码子程序(未考虑百位和负温度值)
;整数部分:取出 WENDUD 高四位和 WENDUG 低四位进行重新组合
;小数部分:取出 TEMPL1 低四位,查小数码表
;小数部分:73H;个位:74H;十位:75H
;==============================================================
WDCZ:
MOV A,WENDUD
ANL A,#0FH ;取出小数部分
MOV B,#10 ;将TEMP_L的低四位X10/16得小数后一位数.
MUL AB
MOV B,#16
DIV AB
MOV 73H,A ;小数部分 BCD
MOV A,WENDUD ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV WENDUD,A
MOV A,WENDUG ;取出低四位
ANL A,#0FH
SWAP A
ORL A,WENDUD ;重新组合温度数据
MOV WENDU,A ;重新组合的温度数据存入WENDU
LCALL HEX2BCD1
MOV WENDUD,A ;(A)=十位数和个位数
ANL A,#0F0H
SWAP A
MOV 75H,A ;十位数 BCD
MOV A,WENDUD
ANL A,#0FH
MOV 74H,A ;个位数 BCD
RET
;==============================================================
;单字节十六进制转BCD
;入口:(A)=单字节十六进制的温度值
;出口:(A)=十位数和个位数
;==============================================================
HEX2BCD1:
MOV B,#0AH
DIV AB
SWAP A
ORL A,B ;(A)=个位数和十位数
RET
END
需要高手指点一下是否可行哈,先谢了 |
|