<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[转]在C中调用汇编写的ds18b20驱动代码]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 26 Dec 2008 03:25:40 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	一个usb系统，其控制芯片的程序是C写的，现在想加入温度传感器，已有现成的汇编代码（伟纳ME300A+产品提供）<br/><br/><br/><div class="code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMPL&nbsp;&nbsp; DATA&nbsp;&nbsp;26H<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMPH&nbsp;&nbsp; DATA&nbsp;&nbsp;27H<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FLAG1 EQU 38H&nbsp;&nbsp;;是否有ds18b20<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATE_LINE EQU P3.6 ;接到ds18b20数据线引脚<br/>;**************************************************<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORG 0000H<br/>MAIN:&nbsp;&nbsp;&nbsp;&nbsp; MOV SP,#30H<br/>START:&nbsp;&nbsp;&nbsp;&nbsp;CALL RESET<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB P3.2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL RESET<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JNB FLAG1,MAIN<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV A,#0CCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 跳过ROM匹配<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL WRITE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV A,#044H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 发出温度转换命令<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL WRITE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL RESET<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV A,#0CCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 跳过ROM匹配<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL WRITE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV A,#0BEH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 发出读温度命令<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL WRITE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL READ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 将读出的温度数据保存到26H/27H<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;CALL CONVTEMP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;CALL DISPBCD<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;CALL DISP1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP MAIN<br/>;*************************************************<br/>RESET:&nbsp;&nbsp;SETB DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R0,#0D6H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;主机发出延时642微秒的复位低脉冲<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R1,#03H<br/>TSR1:&nbsp;&nbsp; DJNZ R0,$<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R0,#0D6H<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R1,TSR1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;然后拉高数据线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R0,#4AH<br/>TSR2:&nbsp;&nbsp; JNB DATE_LINE,TSR3&nbsp;&nbsp; ;等待DS18B20回应<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R0,TSR2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP TSR4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 延时<br/>TSR3:&nbsp;&nbsp; SETB FLAG1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 置标志位,表示DS1820存在<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP TSR5<br/>TSR4:&nbsp;&nbsp; CLR FLAG1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 清标志位,表示DS1820不存在<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP TSR7<br/>TSR5:&nbsp;&nbsp; MOV R0,#06BH<br/>TSR6:&nbsp;&nbsp; DJNZ R0,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 时序要求延时一段时间<br/>TSR7:&nbsp;&nbsp; SETB DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RET<br/>;********************************************************************<br/>WRITE:&nbsp;&nbsp;MOV R2,#8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;一共8位数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR CY<br/>WR1:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;开始写入DS18B20总线要处于复位（低）状态<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R3,#10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R3,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;总线复位保持16微妙以上<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RRC A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把一个字节DATA 分成8个BIT环移给C<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV DATE_LINE,C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;写入一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R3,#2EH<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R3,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;等待46微妙<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;重新释放总线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R2,WR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;写入下一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RET<br/>;******************************************************<br/>READ:&nbsp;&nbsp;&nbsp;&nbsp;MOV R4,#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 将温度高位和低位从DS18B20中读出<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV R1,#26H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 存入26H 27H<br/>RE00:&nbsp;&nbsp;&nbsp;&nbsp;MOV R2,#8<br/>RE01:&nbsp;&nbsp;&nbsp;&nbsp;CLR CY<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SETB DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLR DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;读前总线保持为低<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SETB DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;开始读总线释放<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV R3,#18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;延时18微妙<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R3,$<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV C,DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;从DS18B20总线读得一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV R3,#46<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R3,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;等待46微妙<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RRC A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把读得的位值环移给A<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R2,RE01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;读下一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV @R1,A<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC R1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R4,RE00<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RET<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END</div><br/>代码就三个函数，reset,write,read。分别是没有参数和返回值、有参数没返回值、无参数有返回值。为了研究相应的C函数的结构，可以编译一个C程序看看<br/><br/><br/><div class="code">#pragma SRC<br/>void ds18b20_reset()<br/>&#123;<br/> <br/>&#125;<br/>void ds18b20_write( char sz)<br/>&#123;<br/><br/>&#125;<br/>int ds18b20_read(&nbsp;&nbsp;)<br/>&#123;<br/> int nTpr;<br/> return nTpr;<br/>&#125;</div><br/>用Keil 的c51编译<br/><br/>c51 test.c<br/><br/>可以得到一个TEST.SRC的文件<br/><div class="code">; thermometer.SRC generated from: thermometer.c<br/>; COMPILER INVOKED BY:<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:&#92;Keil&#92;C51&#92;BIN&#92;c51.exe thermometer.c</div><br/><br/>NAME THERMOMETER<br/><br/>?PR?ds18b20_reset?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEGMENT CODE<br/>?PR?_ds18b20_write?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT CODE<br/>?DT?_ds18b20_write?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT DATA OVERLAYABLE<br/>?PR?ds18b20_read?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT CODE<br/>?DT?ds18b20_read?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT DATA OVERLAYABLE<br/> PUBLIC ds18b20_read<br/> PUBLIC _ds18b20_write<br/> PUBLIC ds18b20_reset<br/><br/> RSEG&nbsp;&nbsp;?DT?ds18b20_read?THERMOMETER<br/>?ds18b20_read?BYTE:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nTpr?241:&nbsp;&nbsp; DS&nbsp;&nbsp; 2<br/><br/> RSEG&nbsp;&nbsp;?DT?_ds18b20_write?THERMOMETER<br/>?_ds18b20_write?BYTE:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sz?140:&nbsp;&nbsp; DS&nbsp;&nbsp; 1<br/>; #pragma SRC<br/>; void ds18b20_reset()<br/><br/> RSEG&nbsp;&nbsp;?PR?ds18b20_reset?THERMOMETER<br/>ds18b20_reset:<br/>&nbsp;&nbsp; ; SOURCE LINE # 2<br/>; &#123;<br/>&nbsp;&nbsp; ; SOURCE LINE # 3<br/>;&nbsp;&nbsp;<br/>; &#125;<br/>&nbsp;&nbsp; ; SOURCE LINE # 5<br/> RET&nbsp;&nbsp; <br/>; END OF ds18b20_reset<br/><br/>; void ds18b20_write( char sz)<br/><br/> RSEG&nbsp;&nbsp;?PR?_ds18b20_write?THERMOMETER<br/>_ds18b20_write:<br/>&nbsp;&nbsp; ; SOURCE LINE # 6<br/> MOV&nbsp;&nbsp; sz?140,R7<br/>; &#123;<br/>&nbsp;&nbsp; ; SOURCE LINE # 7<br/>;<br/>; &#125;<br/>&nbsp;&nbsp; ; SOURCE LINE # 9<br/> RET&nbsp;&nbsp; <br/>; END OF _ds18b20_write<br/><br/>; int ds18b20_read(&nbsp;&nbsp;)<br/><br/> RSEG&nbsp;&nbsp;?PR?ds18b20_read?THERMOMETER<br/>ds18b20_read:<br/> USING 0<br/>&nbsp;&nbsp; ; SOURCE LINE # 10<br/>; &#123;<br/>&nbsp;&nbsp; ; SOURCE LINE # 11<br/>;&nbsp;&nbsp;int nTpr;<br/>;&nbsp;&nbsp;return nTpr;<br/>&nbsp;&nbsp; ; SOURCE LINE # 13<br/> MOV&nbsp;&nbsp; R6,nTpr?241<br/> MOV&nbsp;&nbsp; R7,nTpr?241+01H<br/>; &#125;&nbsp;&nbsp; ; SOURCE LINE # 14<br/>?C0003:<br/> RET&nbsp;&nbsp; <br/>; END OF ds18b20_read<br/><br/> END<br/><br/>其中write函数用下划线前缀做了修饰，表示函数将通过寄存器传递参数。<br/><br/>最后给出改造后可以用与c程序的ds18b20代码:<br/><br/>; thermometer.SRC generated from: thermometer.c<br/>; COMPILER INVOKED BY:<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:&#92;Keil&#92;C51&#92;BIN&#92;c51.exe thermometer.c<br/><br/><br/>NAME THERMOMETER<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATE_LINE EQU P1.4 ;接到ds18b20数据线引脚<br/><br/>?PR?ds18b20_reset?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEGMENT CODE<br/>?PR?_ds18b20_write?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT CODE<br/>;?DT?_ds18b20_write?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT DATA OVERLAYABLE<br/>?PR?ds18b20_read?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT CODE<br/>?DT?ds18b20_read?THERMOMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT DATA OVERLAYABLE<br/> PUBLIC ds18b20_read<br/> PUBLIC _ds18b20_write<br/> PUBLIC ds18b20_reset<br/><br/> ;RSEG&nbsp;&nbsp;?DT?_ds18b20_write?THERMOMETER<br/>;?_ds18b20_write?BYTE:<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sz?140:&nbsp;&nbsp; DS&nbsp;&nbsp; 1<br/><br/> RSEG&nbsp;&nbsp;?DT?ds18b20_read?THERMOMETER<br/>?ds18b20_read?BYTE:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nTpr?241:&nbsp;&nbsp; DS&nbsp;&nbsp; 2<br/><br/>; #pragma SRC<br/>; void ds18b20_reset()<br/><br/> RSEG&nbsp;&nbsp;?PR?ds18b20_reset?THERMOMETER<br/>ds18b20_reset:<br/>&nbsp;&nbsp; ; SOURCE LINE # 2<br/>; &#123;<br/> SETB DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R0,#0D6H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;主机发出延时642微秒的复位低脉冲<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R1,#03H<br/>TSR1:&nbsp;&nbsp; DJNZ R0,$<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R0,#0D6H<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R1,TSR1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;然后拉高数据线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R0,#4AH<br/>TSR2:&nbsp;&nbsp; JNB DATE_LINE,TSR3&nbsp;&nbsp; ;等待DS18B20回应<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R0,TSR2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP TSR4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 延时<br/>TSR3:&nbsp;&nbsp; SETB c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 置标志位,表示DS1820存在<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP TSR5<br/>TSR4:&nbsp;&nbsp; CLR c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 清标志位,表示DS1820不存在<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMP TSR7<br/>TSR5:&nbsp;&nbsp; MOV R0,#06BH<br/>TSR6:&nbsp;&nbsp; DJNZ R0,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 时序要求延时一段时间<br/>TSR7:&nbsp;&nbsp; SETB DATE_LINE<br/><br/>;&nbsp;&nbsp;<br/>; &#125;<br/>&nbsp;&nbsp; ; SOURCE LINE # 5<br/> RET&nbsp;&nbsp; <br/>; END OF ds18b20_reset<br/><br/>; void ds18b20_write( char sz)<br/><br/> RSEG&nbsp;&nbsp;?PR?_ds18b20_write?THERMOMETER<br/>_ds18b20_write:<br/>&nbsp;&nbsp; ; SOURCE LINE # 6<br/> MOV&nbsp;&nbsp; a,R7<br/>; &#123;<br/> MOV R2,#8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;一共8位数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR CY<br/>WR1:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;开始写入DS18B20总线要处于复位（低）状态<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R3,#10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R3,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;总线复位保持16微妙以上<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RRC A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把一个字节DATA 分成8个BIT环移给C<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV DATE_LINE,C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;写入一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV R3,#2EH<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R3,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;等待46微妙<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;重新释放总线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ R2,WR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;写入下一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB DATE_LINE;<br/>; &#125;<br/>&nbsp;&nbsp; ; SOURCE LINE # 9<br/> RET&nbsp;&nbsp; <br/>; END OF _ds18b20_write<br/><br/>; int ds18b20_read(&nbsp;&nbsp;)<br/><br/> RSEG&nbsp;&nbsp;?PR?ds18b20_read?THERMOMETER<br/>ds18b20_read:<br/> USING 0<br/>&nbsp;&nbsp; ; SOURCE LINE # 10<br/>; &#123;<br/> MOV R4,#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 将温度高位和低位从DS18B20中读出<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV R1,#nTpr?241&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 存入26H 27H<br/>RE00:&nbsp;&nbsp;&nbsp;&nbsp;MOV R2,#8<br/>RE01:&nbsp;&nbsp;&nbsp;&nbsp;CLR CY<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SETB DATE_LINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLR DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;读前总线保持为低<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SETB DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;开始读总线释放<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV R3,#18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;延时18微妙<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R3,$<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV C,DATE_LINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;从DS18B20总线读得一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV R3,#46<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R3,$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;等待46微妙<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RRC A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把读得的位值环移给A<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R2,RE01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;读下一个BIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV @R1,A<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC R1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ R4,RE00;<br/><br/> MOV&nbsp;&nbsp; R6,nTpr?241<br/> MOV&nbsp;&nbsp; R7,nTpr?241+01H<br/>;&#125;&nbsp;&nbsp; ; SOURCE LINE # 13<br/> RET&nbsp;&nbsp; <br/>; END OF ds18b20_read<br/><br/> END
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [转]在C中调用汇编写的ds18b20驱动代码]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>