DS18B20温度传感器汇编C程序.doc
文本预览下载声明
DS18B20温度传感器(汇编C程序)
发表于 2007-7-22 21:14:31
??? 这个程序是最近写的,对DS18B20进行读写操作只要控制好时序就应该没问题的。这个程序在我自己的板子上运行过能正常测温,温度显示到小数点两位。
这是汇编程序:
;这是关于单个DS18B20的测温程序,数据脚为P1.4,晶振是11.059MHZ;温度传感器18B20采用器件默认的12位转化,最大转化时间要750毫秒;内存分配声明TEMPER_L? EQU?? 31H???????????? ;用于保存读出温度的低字节TEMPER_H? EQU?? 30H???????????? ;用于保存读出温度的高字节T_DF????? EQU?? 33H???????????? ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)T_INTEGER EQU?? 32H???????????? ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节FLAG??? BIT???? 20H???????????? ;标志位DAT???? BIT???? P1.4??????????? ;DS18B20数据线
;------------------------------主函数开始-----------------------------??????? ORG???? 0000H??????? AJMP??? MAIN??????? ORG???? 0030HMAIN:??????? CLR???? EA????????????? ;使用DS18B20一定要禁止中断??????? MOV???? SP,#60H??????? MOV???? T_DF,#00H?????? ;赋初始温度为30度??????? MOV???? T_INTEGER,#30HSTART:? LCALL?? GET_TEMPER????? ;调用读温度子程序??????? LCALL?? T_FORMAT??????? ;将读出的2字节温度格式化,并转换为压缩BCD码??????? LCALL?? DISPLAY???????? ;显示温度??????? AJMP??? START
;-----------------------DS18B20的温度转换子程序-----------------------GET_TEMPER:??????? LCALL?? Set_18B20??????? MOV???? A,#0CCH???????? ;跳过ROM匹配??????? LCALL?? WRITE_1820??????? MOV???? A,#44H????????? ;发出温度转换命令??????? LCALL?? WRITE_1820??????? LCALL?? DISPLAY???????? ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms??????? LCALL?? Set_18B20?????? ;准备读温度前先初始化??????? MOV???? A,#0CCH???????? ;跳过ROM匹配??????? LCALL?? WRITE_1820??????? MOV???? A,#0BEH???????? ;发出读温度命令??????? LCALL?? WRITE_1820??????? LCALL?? READ_1820??????? ??????? RET
;--------------------------DS18B20初始化程序--------------------------Set_18B20:??????? SETB??? DAT??????? NOP??????? CLR???? DAT??????? MOV???? R2,#250???????? ;主机发出延时500微秒的复位低脉冲??????? DJNZ??? R2,$??????? SETB??? DAT???????????? ;然后拉高数据线??????? MOV???? R2,#30??????? DJNZ??? R2,$??????????? ;延时60us等待DS18B20回应??????? JNB???? DAT,INIT1??????? JMP???? Set_18B20?????? ;超时而没有响应,重新初始化INIT1:? MOV???? R2,#120??????? DJNZ??? R2,$??????????? ;延时240us??????? JB????? DAT,INIT2????
显示全部