导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[sjpu]DS18B20单从设备与51的接口程序(



No.53771
作者:sjpu
邮件:
ID:7577
登陆:15次
文章数:46篇
最后登陆IP:222.135.132.13
最后登陆:2005/1/31 9:55:51
注册:2002/12/17 15:14:00
财富:157
发帖时间:2004/4/30 9:50:51
发贴者IP:61.179.111.146
标题:sjpu:DS18B20单从设备与51的接口程序(最新)
摘要:No.53771DS18B20单从设备与51的接口程序(最新) ;===========================================================================
;DS18B20与80C51系列单片机的接口程序
;单片机晶振24MHz,机器周期为0.5uS
;

; 温度转换--->  ....→读取温度→CRC校验→温度转换→数据处理→其他服务→
;                    ↑_____________↓________________________________↓
;===========================================================================
;1 wire 总线DQ
DQ bit P1^1

;===========================================================================
NAME DS18B20 ;模块名称

;===========================================================================
;延时子程序

delay_500uS:  ;延时大于480uS
 mov r5,#2;
d500_1: mov r6,#248;
 djnz r6,$;
 djnz r5,d500_1;
 ret
delay_90uS:
 mov r5,#89;
 djnz r5,$;
 ret
delay_400uS:
 mov r5,#2;
d400_1: mov r6,#198;
 djnz r6,$;
 djnz r5,d400_1;
 ret

;===========================================================================
;主机对1 wire 设备初始化子程序
;函数原型:bit  reset_ds18b20(void)
;返回值Cy:1=设备存在;0=设备不存在
;===========================================================================
?PR?_reset_ds18b20?DS18B20   SEGMENT CODE 
 PUBLIC _reset_ds18b20

RSEG  ?PR?_reset_ds18b20?DS18B20 
_reset_ds18b20:
 clr DQ;
 call delay_500uS;
 setb DQ;
 call delay_90uS;
 setb c; 设备存在
 jnb DQ,i_ret;
 clr c; 设备不存在
 ajmp j_ret; 
i_ret: call delay_400uS;
j_ret: ret  

;==============================================================================
;主机向DS18B20写一个字节数据
;入口:欲写的数据在A中


;==============================================================================
write_byte:
 push psw;
 mov r6,#8;
 clr c;
w_loop1:
 rrc a; 数据的低位先发,后发高位
 jc write1;
 clr DQ;
 call delay_90uS;
 setb DQ;
 ajmp w_loop2;
write1: clr DQ;
 nop; 恢复时间延时必须大于1uS
 nop;
 nop;
 nop;
 setb DQ;
 call delay_90uS;
w_loop2:djnz r6,w_loop1;
 pop psw;
 pop acc;
 ret

;==============================================================================
;主机从DS18B20读取一个字节数据
;出口:数据在A中
;

;===============================================================================
read_byte:
 
 push psw;
 mov r6,#8;
read_loop: clr DQ;
 nop; 拉低总线时间应大于1uS
 nop;
 nop;
 setb DQ;
 mov r7,#5; //必须在从拉低总线开始的15uS以内采样总线
 djnz r7,$;
 mov c,DQ;
 rrc a;
 mov r7,#49;延时50uS
 djnz r7,$;
 nop;;恢复时间延时必须大于1uS
 nop
 nop
 djnz r6,read_loop;
 pop psw;
 ret

;=================================================================================
;单从设备温度转换函数
;函数原型:void temp_conver(void)
;

;=================================================================================
?PR?temp_conver?DS18B20   SEGMENT CODE 
 PUBLIC temp_conver

RSEG  ?PR?temp_conver?DS18B20 
temp_conver:
 call _reset_ds18b20;
 mov A,#0cch; //跳跃ROM命令
 call write_byte;
 mov A,#044h; //温度转换命令
 call write_byte; 
 ret
 
;=================================================================================
;主机读取单从设备暂存器函数
;函数原型:void read_scrat(unsigned char data * buf,unsigned char n)
;入口:r7(buf):数据缓冲区首址
; R5(n):欲读取的字节数 
;================================================================================
?PR?_read_scrat?DS18B20   SEGMENT CODE 
 PUBLIC _read_scrat

RSEG  ?PR?_read_scrat?DS18B20
_read_scrat: 
 mov a,r7;
 mov r0,a;
 call _reset_ds18b20; //
 mov A,#0cch; //跳跃ROM命令
 call write_byte;
 mov A,#0beh; //读暂存器命令
 call write_byte; 
r_scrat_loop:
 call read_byte;
 mov @r0,a;
 inc r0;
 djnz r5,r_scrat_loop;
 call _reset_ds18b20;
 ret
 
;================================================================================
;主机写单从设备的3个暂存器函数
;函数原型:void write_scrat(unsigned char data * buf)
;入口:R7(buf)欲写数据的首地址 

;================================================================================
?PR?_write_scrat?DS18B20   SEGMENT CODE 
 PUBLIC _write_scrat

RSEG  ?PR?_write_scrat?DS18B20
_write_scrat:
 mov r6,#3;
 mov a,r7;
 mov r0,a;
 call _reset_ds18b20; //
 mov a,#0cch; //跳跃ROM命令
 call write_byte;
 mov a,#04eh; //写暂存器命令
 call write_byte; 
w_scrat_loop:
 mov a,@r0;
 call write_byte;//写数据
 inc r0;
 djnz r6,w_scrat_loop;
 ret
 
;=================================================================================
;单从设备将3个暂存器内容复制到E2PROM函数
;函数原型:void copy_scrat(void)
;=================================================================================
?PR?copy_scrat?DS18B20   SEGMENT CODE 
 PUBLIC copy_scrat

RSEG  ?PR?copy_scrat?DS18B20
copy_scrat:
 call _reset_ds1 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:78531毫秒 查询6次