本人单片机学的是汇编语言,做了DS18B20的实验,想通过这个实验学习下c语言开发,有汇编程序,请高手对照写个c语言程序,让本人学习一下,万分感谢!DS18B20单总线数字式温度传感器实验,实验连线时QD连P1.0,串并转换实验孔 DIN P3.0, CLK P3.1,LED两位显示,汇编源程序如下:
;单总线读写操作
;温度传感器DS1820 的汇编程序
;一次数据传输为四步:初始化、传送ROM命令、传送RAM命令、数据交换
;当命令者检测到器件存在时首先发送1个ROM命令
;总线信号:初始化、写1、写0、读信号
TEMPER_L DATA 36H ;温度寄存器的低位
TEMPER_H DATA 35H ;温度寄存器的高位
TEMPER_NUM DATA 60H ;保存温度值
FLAG BIT 00H ;器件是否存在的标志位,器件存在由软件置1,否则清0
DQ BIT P1.0
ORG 0000H
AJMP START
;
;*****************************************************************************
; /*主程序*/ *
;*****************************************************************************
;
ORG 0030H
START: MOV SP,#70H
CALL GET_TEMPER ;读取温度值
CALL TEMPER_COV ;读取转换后的温度值
MOV R0,A
CALL DISP
CALL DELAY
AJMP START
;
;*****************************************************************************
; /*取得温度子程序*/ *
;*****************************************************************************
;
GET_TEMPER: SETB DQ
CALL CHECK ;
MOV A,#0CCH ; 跳过ROM匹配(当总线上只有一个器件时可跳过读ROM命令)
CALL DSWRITE ; 写入命令
MOV A,#44H ; 发出温度转换命令
CALL DSWRITE
NOP
CALL DELAY
CALL DELAY
CALL CHECK
MOV A,#0CCH ; 跳过ROM匹配
CALL DSWRITE
MOV A,#0BEH ; 发出读温度命令
CALL DSWRITE
CALL DSREAD ;读取温度的低位
MOV R0,#TEMPER_L
MOV @R0,A ;存入TEMPER_L
CALL DSREAD ;读取温度的低位
DEC R0 ;存入TEMPER_H
MOV @R0,A
RET
;
;*****************************************************************************
; /*读DS18B20的程序,从DS18B20中读出一个字节的数据*/ *
;*****************************************************************************
;
DSREAD: MOV R2,#8
READ1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#01
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,READ1
RET
;
;*****************************************************************************
; /*写DS18B20序子程序*/ *
;*****************************************************************************
;
DSWRITE: MOV R2,#8
CLR C
WRITE1: CLR DQ
MOV R3,#6 ;延时12US
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23 ;46US
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WRITE1
SETB DQ
RET
;
;*****************************************************************************
; /*温度转换程序*/ *
;*****************************************************************************
;
TEMPER_COV: MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值,
INC TEMPER_NUM ;D3为1则加1,为0则舍去
TEMPER_COV1: MOV A,TEMPER_H ; 高位
ANL A,#07H ;温度寄存器的高字节只有后3位有效
SWAP A
ORL A,TEMPER_NUM ; 拼装
MOV TEMPER_NUM,A ; 保存变换后的温度数据
CALL BIN_BCD
RET
;
;*****************************************************************************
; /*检查器件是否存在子程序*/ *
;*****************************************************************************
;
CHECK: CALL DSINIT ; 初始化
JB FLAG,CHECK1 ; 检查标志位判断器件是否存在
AJMP CHECK ; 若DS18B20不存在则继续检测
CHECK1: CALL DELAY1
RET
;
;*****************************************************************************
; /*BCD码转换子程序*/ *
;*****************************************************************************
;
BIN_BCD: MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
;
;*****************************************************************************
; /*初始化子程序程序*/
;初始化时序是由总线发出一个复位信号,然后由器件发 *
;出一个应答信号,表示该器件存在,并准备好开始工作
;*****************************************************************************
;
DSINIT: SETB DQ
NOP
CLR DQ ;总线发一个复位信号
MOV R0,#80H
DJNZ R0,$ ; 延时
SETB DQ ;拉高总线准备检测
MOV R0,#25H ;延时
DJNZ R0,$
JNB DQ,INIT2 ;检测是否有应答信号,有应答信号跳转
AJMP INIT3 ; 延时
INIT2: SETB FLAG ; 置标志位,表示DS1820存在
AJMP INIT4
INIT3: CLR FLAG ; 清标志位,表示DS1820不存在
AJMP INIT5
INIT4: MOV R0,#6BH
DJNZ R0,$ ; 延时
INIT5: SETB DQ ;拉高总线
RET
;
;*****************************************************************************
; /*配置程序*/ *
;*****************************************************************************
;
RE_CONFIG: JB FLAG,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1: MOV A,#0CCH ; 发SKIP ROM命令
CALL DSWRITE
MOV A,#4EH ; 发写暂存存储器命令
CALL DSWRITE
MOV A,#00H ; TH(报警上限)中写入00H
CALL DSWRITE
MOV A,#00H ; TL(报警下限)中写入00H
CALL DSWRITE
MOV A,#7FH ; 选择12位温度分辨率
CALL DSWRITE
RET
;
;*****************************************************************************
; /*显示子程序*/ *
;*****************************************************************************
;
DISP: MOV A,R0 ;转换结果低位
ANL A,#0FH
ACALL DSEND ;显示
MOV A,R0
SWAP A
ANL A,#0FH ;转换结果高位
ACALL DSEND ;显示
RET
DSEND: MOV DPTR,#SGTB1
MOVC A,@A+DPTR ;取字符
MOV SBUF,A
JNB TI,$
CLR TI
RET
;
;*****************************************************************************
; /*延时程序*/ *
;*****************************************************************************
;
DELAY: MOV R7,#00H
DELAY0: MOV R6,#00H
DJNZ R6,$
DJNZ R7,DELAY0
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET
;
;*****************************************************************************
; /*字符编码*/ *
;*****************************************************************************
;
SGTB1: DB 03H ;0
DB 9FH ;1
DB 25H ;2
DB 0DH ;3
DB 99H ;4
DB 49H ;5
DB 41H ;6
DB 1FH ;7
DB 01H ;8
DB 09H ;9
DB 11H ;A
DB 0C1H ;B
DB 63H ;C
DB 85H ;D
DB 61H ;E
DB 71H ;F
DB 00H
TEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
END