基于低功耗单片机温度计设计(电路图+原理图+流程图) 第11页
;程序名称:INIT_TEMP
;功能:初始化DS18B20,确定DS18B20是否是存在的
;入口参数:无
;出口参数:FLAG
INIT_TEMP:
SETB P_DS18B20
NOP
CLR P_DS18B20 ;主机发出延时537微秒的复位低脉冲
MOV R0,#6BH
MOV R1,#04H
TSR1: DJNZ R0,$
MOV 40,#6BH
DJNZ R1,TSR1
SETB P_DS18B20 ;然后拉高数据线,释放总线进入接受状态
NOP
NOP
NOP
MOV R0,#32H
TSR2: JNB P_DS18B20,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3: SETB FLAG ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB P_DS18B20
RET
;程序名称:READ_TEMP
;功能:读取DS18B20的数据
;入口参数:TEMPERATURE_L,TEMPERATURE_H
;出口参数:无
READ_TEMP:
SETB P_DS18B20
LCALL INIT_TEMP ;先复位DS18B20
JB FLAG,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#44H ;发出温度转换命令
LCALL WRITE_18B20
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_TEMP ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_18B20
LCALL READ_18B20 ;将读出的温度数据保存到35H/36H
RET
程序名称:WRITE_18B20
;功能:将A保存的数值写入DS1820中,
;入口参数:A 寄存器
;出口参数:无
WRITE_18B20:
MOV R2,#8 ;一共8位数据,串行通信
CLR C
WR1: CLR P_DS18B20
MOV R3,#07
DJNZ R3,$
RRC A ;循环右移
MOV P_DS18B20,C
MOV R3,#3CH
DJNZ R3,$ ;23*2 = 46微妙
SETB P_DS18B20
NOP
DJNZ R2,WR1 ;A里面一共是8位,所以要送8次
SETB P_DS18B20 ;释放总线
RET
;程序名称:READ_18B20
;功能:读取18B20中的数据,由于是串行通信,每次读取一个,循环8次读取
;入口参数:TEMPRATURE_L
;出口参数:无
READ_18B20:
MOV R4,#4 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPERATURE_L
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB P_DS18B20
NOP
NOP
CLR P_DS18B20
NOP
NOP
NOP
SETB P_DS18B20
MOV R3,#09
RE10: DJNZ R3,RE10
MOV C,P_DS18B20
MOV R3,#3CH
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
www.751com.cn
;程序名称:SCAN_KEY
;功能:扫描键盘
;入口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
;出口参数:KEY_BUF_G,KEY_BUF_S,kEY_BUF_B
SCAN_KEY:
JB K_ENTER,QUIT ;如果又Enter键入,则开始键盘输入
LCALL K_DELAY
JB K_ENTER,QUIT
CLR ENTER_FLAG ;每次进来都赋值输入标志,设置为0
MOV KEY_BUF_G,DIS_BUF_G ;将当前的温度赋值给KEY_BUF
MOV KEY_BUF_S,DIS_BUF_S
MOV KEY_BUF_B,DIS_BUF_B
K_LOOP:
JB ENTER_FLAG,QUIT ;如果输入完成,ENTER_FLAG则为1,退出键盘程
;序
JB K_ENTER,KUP
CALL PRO_ENTER
KUP: JB K_UP,KDOWN
CALL PRO_UP
KDOWN: JB K_DOWN,LOOPA
CALL PRO_DOWN
LOOPA: LCALL DISPLAY
SJMP K_LOOP
QUIT: RET
;程序名称:PRO_ENTER
;功能:确认键盘输入和退出键盘输入
;入口参数:ENTER_FLAG
;出口参数:ENTER_FLAG
PRO_ENTER:
CALL K_DELAY
JB K_ENTER,K_LOOP ;按钮抖动处理
SETB E NTER_FLAG