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 ......
>>返回讨论的主题
|