C 语言与汇编语言混合编程实例介绍_第1页
C 语言与汇编语言混合编程实例介绍_第2页
C 语言与汇编语言混合编程实例介绍_第3页
C 语言与汇编语言混合编程实例介绍_第4页
C 语言与汇编语言混合编程实例介绍_第5页
已阅读5页,还剩226页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 单线数字温度传感器DS18B20 41.1 DS18B20与单片机的连接 41.2 读DS18B20温度值的汇编语言程序1 41.3读DS18B20温度值的汇编语言程序2 101.4 读单个DS18B20芯片序列号的汇编语言程序 141.5 读多个DS18B20芯片温度值的汇编语言程序 171.6 被调汇编语言程序 201.7 调用汇编语言程序的C51语言程序 271.8 不调用汇编语言程序的C51程序 282 实时时钟/日历芯片PCF8563 322.1 PCF8563与单片机的连接 322.2 汇编语言程序 322.3 被调汇编语言程序 392.4 调用汇编语言程序的C51语言程序

2、 462.5 不调用汇编语言程序的C51语言程序 483 串行带闹钟的实时时钟芯片DS1305 553.1 DS1305与单片机的连接 553.2 汇编语言程序 553.3 被调汇编语言程序 623.4 调用汇编语言程序的C51语言程序 683.5 不调用汇编语言程序的C51语言程序 714 单通道12位串行A/D转换器MAX1241 774.1 MAX1241与单片机的连接 774.2 汇编语言程序 774.3 被调汇编语言程序 794.4 调用汇编语言程序的C51语言程序 815 8路12位串行A/D转换器MAX146/147 835.1 MAX146/147与单片机的连接 835.2 汇

3、编语言程序 835.3 被调汇编语言程序 865.4 调用汇编语言程序的C51语言程序 886 8路12位并行A/D转换器MAX197 916.1 MAX197与单片机的连接 916.2 汇编语言程序1 916.3 汇编语言程序2 936.4 被调汇编语言程序 946.5 调用汇编语言程序的C51语言程序 967 8路12位串行A/D转换器MAX186 997.1 MAX186与单片机的连接 997.2 汇编语言程序1 997.3 汇编语言程序2 1017.4 被调汇编语言程序 1037.5 调用汇编语言程序的C51语言程序 1058 双路14位串行A/D转换器MAX111 1088.1 MA

4、X111与单片机的连接 1088.2 汇编语言程序 1088.3 被调汇编语言程序 1118.4 调用汇编语言程序的C51语言程序 1149 双路16位-A/D转换器AD7705 1179.1 AD7705与单片机以五线方式连接 1179.2 单片机的串行口与AD7705连接(三线方式) 1179.3 AD7705与单片机以五线方式连接下的程序 11710 9位数字温度传感器DS1620 12710.1 DS1620与单片机的连接 12710.2 汇编语言程序 12710.3 被调汇编语言程序 12910.4 调用汇编语言程序的C51语言程序 13210.5 不调用汇编语言程序的C51语言程序

5、 13311 10位数字温度传感器AD7416 13811.1 AD7416与单片机的连接 13811.2 汇编语言程序 13811.3 被调汇编语言程序 14111.4 调用汇编语言程序的C51语言程序 14611.5 不调用汇编语言程序的C51语言程序 14812 单路8位串行D/A转换器MAX517 15612.1 MAX517与单片机的连接 15612.2 汇编语言程序 15612.3 被调汇编语言程序 15812.4 调用汇编语言程序的C51语言程序 16112.5 不调用汇编语言程序的C51语言程序 16213 单路10位串行D/A转换器MAX515 16613.1 MAX515与

6、单片机的连接 16613.2 汇编语言程序 16613.3 被调汇编语言程序 16813.4 调用汇编语言程序的C51语言程序 17113.5 不调用汇编语言程序的C51语言程序 17214 单路12位串行D/A转换器MAX539 17514.1 MAX539与单片机的连接 17514.2 汇编语言程序 17514.3 被调汇编语言程序 17814.4 调用汇编语言程序的C51语言程序 18014.5 不调用汇编语言程序的C51语言程序 1811 单线数字温度传感器DS18B201.1 DS18B20与单片机的连接1.2 读DS18B20温度值的汇编语言程序1;*;/* 这是DS18B20的汇

7、编程序, 文件名DS18B20.ASM */;/* 功能:本程序主要是读出单个DS18B20芯片转换后的温度值,并把它 */;/* 转换成BCD码,范围(-5599)。单片机的P1.0接DS18B20 */;/* 的BQ。FLAG1:标志位,为"1"时表示检测到DS18B20;FLAG2:标志位, */;/* 为"1"时表示检测到的温度值为负值,为"0"时表示检测到的温度 */;/* 值为正值。DQ:DS18B20的数据总线接脚 ; */;/* TEMPER_NUM:保存读出的温度数据。 本程序仅适合单个DS18B20 */;/* 和

8、51单片机的连接,晶振为12MHZ左右。 */;*TEMPER_L EQU 36HTEMPER_H EQU 35HTEMPER_NUM EQU 33HFLAG1 EQU 0D5HFLAG2 EQU 00HDQ EQU P1.0SkipDs18b20 EQU 0CCHStartDs18b20 EQU 44HReadDs EQU 0BEHORG 0000HSJMP MAINORG 0040HMAIN: MOV SP,#60HCLR EACLR FLAG2 ;清负号标志位FLAG2LCALL RE_CONFIG ;重新写DS18B20暂存存储器设定值LCALL GET_TEMPER ;读出转换后的温

9、度值;将从DS18B20中读出的温度数据转换成BCD码(5599)LCALL TEMPER_COVLJMP $;读出转换后的温度值GET_TEMPER:SETB DQ ; 定时入口LCALL InitDs18b20JB FLAG1,S22RETS22: LCALL Delay64uSMOV A,#SkipDs18b20 ; 跳过ROM匹配-0CCLCALL WriteByteDs1820MOV A,#StartDs18b20 ; 发出温度转换命令LCALL WriteByteDs1820LCALL DELAY1sLCALL InitDs18b20JB FLAG1,ABCRETABC: LCAL

10、L Delay64uSMOV A,#SkipDs18b20 ; 跳过ROM匹配LCALL WriteByteDs1820MOV A,#ReadDs ; 发出读温度命令LCALL WriteByteDs1820LCALL ReadDs18b20 ;READ_1820RET;读DS18B20的程序,从DS18B20中读出一个字节的数据ReadByteDs1820:MOV R2,#8RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;写

11、DS18B20的程序WriteByteDs1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET;读DS18B20的程序,从DS18B20中读出两个字节的温度数据ReadDs18b20:LCALL ReadByteDs1820MOV TEMPER_L ,ALCALL ReadByteDs1820MOV TEMPER_H,ARET;重新写DS18B20暂存存储器设定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若

12、DS18B20存在,转RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH ; 发SKIP ROM命令LCALL WriteByteDs1820MOV A,#4EH ; 发写暂存存储器命令LCALL WriteByteDs1820MOV A,#00H ; TH(报警上限中写入00H;LCALL WriteByteDs1820MOV A,#00H ; TL(报警下限中写入00H;LCALL WriteByteDs1820MOV A,#7FH ; 选择12位温度分辨率LCALL WriteByteDs1820RET;延时子程序Delay500uS:MOV R6,#00HDJNZ

13、R6,$RETDelay64uS:MOV R6,#20HDJNZ R6,$RETDelay1S:MOV B,#130Dela11:PUSH BPOP BDJNZ B,Dela11RET;DS18B20初始化程序InitDs18b20:CLR DQMOV R7,#80hDJNZ R7,$ ; 延时SETB DQMOV R7,#25h ;DJNZ R7,$SETB FLAG1 ; 置标志位,表示DS1820存在JNB DQ,TSR5CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R7,#06BH ;200USDJNZ R7,$ ; 延时TSR7:SETB

14、 DQRET; 将从DS18B20中读出的温度数据进行转换TEMPER_COV:MOV A,TEMPER_HSUBB A,#0F8HJC TEM0 ; 看温度值是否为负?不是,转SETB FLAG2 ; 是,置标志位FLAG2MOV A,TEMPER_HCPL AMOV TEMPER_H,AMOV A,TEMPER_LCPL AINC AMOV TEMPER_L,ATEM0:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SWAP AMOV TEMPER_NUM,AMOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去

15、温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSWAP AORL A,TEMPER_NUMMOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET; 将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TABMOV A,TEMPER_NUMMOVC A,A+DPTRMOV TEMPER_NUM,ARETTEMP_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07HDB 08H,09H,10H,11H,12H,13H,14H,15HDB 16H,1

16、7H,18H,19H,20H,21H,22H,23HDB 24H,25H,26H,27H,28H,29H,30H,31HDB 32H,33H,34H,35H,36H,37H,38H,39HDB 40H,41H,42H,43H,44H,45H,46H,47HDB 48H,49H,50H,51H,52H,53H,54H,55HDB 56H,57H,58H,59H,60H,61H,62H,63HDB 64H,65H,66H,67H,68H,69H,70H,71HDB 72H,73H,74H,75H,76H,77H,78H,79HDB 80H,81H,82H,83H,84H,85H,86H,87HDB

17、 88H,89H,90H,91H,92H,93H,94H,95HDB 96H,97H,98H,99HEND1.3读DS18B20温度值的汇编语言程序2;*;/* 这是DS18B20的汇编程序, 文件名D18B203.ASM */;/* 功能:本程序主要是读出多个DS18B20芯片转换后的温度值,这里用 */;/* 两个DS18B20芯片。单片机的P1.0接DS18B20的BQ。第1个DS18B20 */;/* 芯片的温度值放在50H和51H单元(高字节在50H中),第2个DS18B20*/;/* 芯片的温度值放在52H和53H单元(高字节在52H中)。本程序适合 */;/* 多个DS18B20

18、 和51单片机的连接,晶振为12MHZ左右。 */;*DQ EQU P1.0ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HLCALL GET_TEMPSJMP $GET_TEMP:CLR PSW.4SETB PSW.3 ;设置工作寄存器当前所在的区域CLR EA ;使用ds1820一定要禁止任何中断产生LCALL INT ;调用初使化子程序MOV A,#0CCHLCALL WRITE ;送入跳过ROM命令MOV A, #44HLCALL WRITE ;送入温度转换命令LCALL INT ;温度转换完全,再次初使化ds1820MOV A,#55HLCALL

19、 WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;发第1个DS18B20序列号(28H,10H,46H,0E2H,00,00,00,7EHMOV A,#10HLCALL WRITEMOV A,#46HLCALL WRITEMOV A,#0E2HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#7EHLCALL WRITEMOV A,#0BEHLCALL WRITE ;送入读温度暂存器命令LCALL READMOV 51H,A ;读出温度值低字节存入51H

20、CALL READMOV 50H,A ;读出谩度值高字节存入50HLCALL INT ;再次初使化ds1820MOV A,#55HLCALL WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;发第2个DS18B20序列号(28H,24H,0C5H,39H,00,00,00,5FHMOV A,#24HLCALL WRITEMOV A,#0C5HLCALL WRITEMOV A,#39HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#5FHLCALL WRI

21、TEMOV A,#0BEHLCALL WRITE ;送入读温度暂存器命令LCALL READMOV 53H,A ;读出温度值低字节存入53HCALL READMOV 52H,A ;读出谩度值高字节存入52HSETB EARETINT: ;初始化ds1820子程序CLR EAL0: CLR DQ ;ds1820总线为低复位电平MOV R2,#200L1: CLR DQDJNZ R2,L1 ;总线复位电平保持400usSETB DQ ;释放ds1820总线MOV R2,#30L4: DJNZ R2,L4 ;释放ds1820总线保持60usCLR C ;清存在信号ORL C,DQJC L0 ;存在吗

22、?不存在则重新来MOV R6,#80L5: ORL C,DQJC L3DJNZ R6,L5SJMP L0L3: MOV R2,#240L2: DJNZ R2,L2RETWRITE: ;向ds1820写操作命令子程序CLR EAMOV R3,#8 ;写入ds1820的bit数,一个字节8个bitWR1:SETB DQMOV R4,#8RRC A ;把一个字节data(A分成8个bit环移给 CCLR DQ ;开始写入ds1820总线要处于复位(低状态WR2:DJNZ R4,WR2 ;ds1820总线复位保持16usMOV DQ,C ;写入一个bitMOV R4,#20WR3:DJNZ R4,WR

23、3 ;等待40usDJNZ R3,WR1 ;写入下一个bitSETB DQ ;重新释放ds1820总线RETREAD:CLR EAMOV R6,#8 ;连续读8个bitRE1:CLR DQ ;读前总线保持为低MOV R4,#4NOPSETB DQ ;开始读总线释放RE2:DJNZ R4,RE2 ;持续8usMOV C,DQ ;从ds1820总线读得一个bitRRC A ;把读得的位值环移给 AMOV R5,#30RE3:DJNZ R5,RE3 ;持续60usDJNZ R6,RE1 ;读下一个bitSETB DQ ;重新释放ds1820总线RETEND1.4 读单个DS18B20芯片序列号的汇编

24、语言程序;/*;/* 这是DS18B20的汇编程序, 文件名D18B20.ASM */;/* 功能:本程序主要是读出芯片DS18B20固有的序列号,序列号共64位, */;/* 也就是8个字节,读出后依次放在单片机的RAM 40H,41H,.47H中。*/;/* 单片机的P1.0接DS18B20的BQ。 */;/* 本芯片的序列号为: 28h,10h,46h,e2h,00,00,00,7eh */;/*DQ EQU P1.0ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HCLR EA ;使用ds1820一定要禁止任何中断产生LCALL INT ;初始化ds

25、1820MOV A,#33HLCALL WRITE ;送入读ds1820的ROM命令LCALL READ ;开始读出当前ds1820序列号MOV 40H,ALCALL READMOV 41H,ALCALL READMOV 42H,ALCALL READMOV 43H,ALCALL READMOV 44H,ALCALL READMOV 45H,ALCALL READMOV 46H,ALCALL READMOV 47H,ASETB EASJMP $INT: ;初始化ds1820子程序CLR EAL0: CLR DQ ;ds1820总线为低复位电平MOV R2,#200L1: CLR DQDJNZ

26、R2,L1 ;总线复位电平保持400usSETB DQ ;释放ds1820总线MOV R2,#30L4: DJNZ R2,L4 ;释放ds1820总线保持60usCLR C ;清存在信号ORL C,DQJC L0 ;存在吗?不存在则重新来MOV R6,#80L5: ORL C,DQJC L3DJNZ R6,L5SJMP L0L3: MOV R2,#240L2: DJNZ R2,L2RETWRITE: ;向ds1820写操作命令子程序CLR EAMOV R3,#8 ;写入ds1820的bit数,一个字节8个bitWR1: SETB DQMOV R4,#8RRC A ;把一个字节data(A分成8

27、个bit环移给 CCLR DQ ;开始写入ds1820总线要处于复位(低状态WR2: DJNZ R4,WR2 ;ds1820总线复位保持16usMOV DQ,C ;写入一个bitMOV R4,#20WR3: DJNZ R4,WR3 ;等待40usDJNZ R3,WR1 ;写入下一个bitSETB DQ ;重新释放ds1820总线RETREAD:CLR EAMOV R6,#8 ;连续读8个bitRE1: CLR DQ ;读前总线保持为低MOV R4,#4NOPSETB DQ ;开始读总线释放RE2: DJNZ R4,RE2 ;持续8usMOV C,DQ ;从ds1820总线读得一个bitRRC

28、A ;把读得的位值环移给 AMOV R5,#30RE3: DJNZ R5,RE3 ;持续60usDJNZ R6,RE1 ;读下一个bitSETB DQ ;重新释放ds1820总线RETEND1.5 读多个DS18B20芯片温度值的汇编语言程序;*;/* 这是DS18B20的汇编程序, 文件名D18B203.ASM */;/* 功能:本程序主要是读出多个DS18B20芯片转换后的温度值,这里用 */;/* 两个DS18B20芯片。单片机的P1.0接DS18B20的BQ。第1个DS18B20 */;/* 芯片的温度值放在50H和51H单元(高字节在50H中),第2个DS18B20*/;/* 芯片的

29、温度值放在52H和53H单元(高字节在52H中)。本程序适合 */;/* 多个DS18B20 和51单片机的连接,晶振为12MHZ左右。 */;*DQ EQU P1.0ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HLCALL GET_TEMPSJMP $GET_TEMP:CLR PSW.4SETB PSW.3 ;设置工作寄存器当前所在的区域CLR EA ;使用ds1820一定要禁止任何中断产生LCALL INT ;调用初使化子程序MOV A,#0CCHLCALL WRITE ;送入跳过ROM命令MOV A, #44HLCALL WRITE ;送入温度转换

30、命令LCALL INT ;温度转换完全,再次初使化ds1820MOV A,#55HLCALL WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;发第1个DS18B20序列号(28H,10H,46H,0E2H,00,00,00,7EHMOV A,#10HLCALL WRITEMOV A,#46HLCALL WRITEMOV A,#0E2HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#7EHLCALL WRITEMOV A,#0BEHLCALL WRITE

31、 ;送入读温度暂存器命令LCALL READMOV 51H,A ;读出温度值低字节存入51HCALL READMOV 50H,A ;读出谩度值高字节存入50HLCALL INT ;再次初使化ds1820MOV A,#55HLCALL WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;发第2个DS18B20序列号(28H,24H,0C5H,39H,00,00,00,5FHMOV A,#24HLCALL WRITEMOV A,#0C5HLCALL WRITEMOV A,#39HLCALL WRITEMOV A,#00HLCALL WRITEMOV A,#00HLCALL

32、 WRITEMOV A,#00HLCALL WRITEMOV A,#5FHLCALL WRITEMOV A,#0BEHLCALL WRITE ;送入读温度暂存器命令LCALL READMOV 53H,A ;读出温度值低字节存入53HCALL READMOV 52H,A ;读出谩度值高字节存入52HSETB EARETINT: ;初始化ds1820子程序CLR EAL0: CLR DQ ;ds1820总线为低复位电平MOV R2,#200L1: CLR DQDJNZ R2,L1 ;总线复位电平保持400usSETB DQ ;释放ds1820总线MOV R2,#30L4: DJNZ R2,L4 ;

33、释放ds1820总线保持60usCLR C ;清存在信号ORL C,DQJC L0 ;存在吗?不存在则重新来MOV R6,#80L5: ORL C,DQJC L3DJNZ R6,L5SJMP L0L3: MOV R2,#240L2: DJNZ R2,L2RETWRITE: ;向ds1820写操作命令子程序CLR EAMOV R3,#8 ;写入ds1820的bit数,一个字节8个bitWR1:SETB DQMOV R4,#8RRC A ;把一个字节data(A分成8个bit环移给 CCLR DQ ;开始写入ds1820总线要处于复位(低状态WR2:DJNZ R4,WR2 ;ds1820总线复位保

34、持16usMOV DQ,C ;写入一个bitMOV R4,#20WR3:DJNZ R4,WR3 ;等待40usDJNZ R3,WR1 ;写入下一个bitSETB DQ ;重新释放ds1820总线RETREAD:CLR EAMOV R6,#8 ;连续读8个bitRE1:CLR DQ ;读前总线保持为低MOV R4,#4NOPSETB DQ ;开始读总线释放RE2:DJNZ R4,RE2 ;持续8usMOV C,DQ ;从ds1820总线读得一个bitRRC A ;把读得的位值环移给 AMOV R5,#30RE3:DJNZ R5,RE3 ;持续60usDJNZ R6,RE1 ;读下一个bitSET

35、B DQ ;重新释放ds1820总线RETEND1.6 被调汇编语言程序;*;/* 这是被CALLB20.C调用的DS18B20汇编语言程序,文件名为DS18B20B.ASM */;/* 功能:本程序主要是读出单个DS18B20芯片转换后的温度值,并把它 */;/* 转换成BCD码,范围(5599)。单片机的P1.0接DS18B20 */;/* 的BQ。FLAG1:标志位,为"1"时表示检测到DS18B20;FLAG2:标志单元 */;/* , 为"1"时表示检测到的温度值为负值,为"0"时表示检测到的温度 */;/* 值为正值。DQ

36、:DS18B20的数据总线接脚 ; */;/* TEMPER_NUM:保存读出的温度数据。 本程序仅适合单个DS18B20 */;/* 和51单片机的连接,晶振为12MHZ左右。 */;/* 本程序是被调用的汇编语言程序,由外部传递进来的参数在R7中, */;/* 是字符型的,在本程序中未用;返回的参数是整形的,其中高八位 */;/* 放置温度值的正负号,为"1"时表示检测到的温度值为负值,为"0" */;/* 时表示检测到的温度值为正值,低八位放置温度值。 */;*TEMPER_L EQU 36HTEMPER_H EQU 35HTEMPER_NUM E

37、QU 33HFLAG1 EQU 0D5HFLAG2 EQU 34HDQ EQU P1.0NAME DS18B20?PR?_a_func?DS18B20 SEGMENT CODE?DT?_a_func?DS18B20 SEGMENT DATA OVERLAYABLE?DT?DS18B20 SEGMENT DATAPUBLIC chaiPUBLIC ?_a_func?BYTEPUBLIC _a_funcRSEG ?DT?_a_func?DS18B20?_a_func?BYTE:aa:DS 1RSEG ?DT?DS18B20chai:DS 2RSEG ?PR?_a_func?DS18B20_a_fu

38、nc:MOV aa,R7 ;R7中放传递进来的字符型参数MOV FLAG2,#00 ;清负号标志FLAG2LCALL RE_CONFIG ;重新写DS18B20暂存存储器设定值LCALL GET_TEMPER ;读出转换后的温度值MOV TEMPER_L,#90HMOV TEMPER_H,#0FCHLCALL TEMPER_COV ;将从DS18B20中读出的温度数据转换成BCD码MOV A,TEMPER_NUMMOV R7,A ;R7中放返回温度值MOV R6,FLAG2 ;R6中放返回温度值的符号,1为负,0为正。RET;读出转换后的温度值GET_TEMPER:SkipDs18b20 EQ

39、U 0CCHStartDs18b20 EQU 44HReadDs EQU 0BEHSETB DQ ; 定时入口CALL InitDs18b20JB FLAG1,S22RETS22: CALL Delay64uSMOV A,#SkipDs18b20 ; 跳过ROM匹配-0CCCALL WriteByteDs1820MOV A,#StartDs18b20 ; 发出温度转换命令CALL WriteByteDs1820CALL DELAY1sCALL InitDs18b20JB FLAG1,ABCRETABC: CALL Delay64uSMOV A,#SkipDs18b20 ; 跳过ROM匹配CAL

40、L WriteByteDs1820MOV A,#ReadDs ; 发出读温度命令CALL WriteByteDs1820CALL ReadDs18b20 ;READ_1820RET;读DS18B20的程序,从DS18B20中读出一个字节的数据ReadByteDs1820:MOV R2,#8RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;写DS18B20的程序WriteByteDs1820:MOV R2,#8CLR CWR1:C

41、LR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET;读DS18B20的程序,从DS18B20中读出两个字节的温度数据ReadDs18b20:CALL ReadByteDs1820MOV TEMPER_L ,ACALL ReadByteDs1820MOV TEMPER_H,ARET;重新写DS18B20暂存存储器设定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH

42、; 发SKIP ROM命令CALL WriteByteDs1820MOV A,#4EH ; 发写暂存存储器命令CALL WriteByteDs1820MOV A,#00H ; TH(报警上限中写入00H;CALL WriteByteDs1820MOV A,#00H ; TL(报警下限中写入00H;CALL WriteByteDs1820MOV A,#7FH ; 选择12位温度分辨率CALL WriteByteDs1820RET;延时子程序Delay500uS:MOV R6,#00HDJNZ R6,$RETDelay64uS:MOV R6,#20HDJNZ R6,$RETDelay1S:MOV

43、B,#130Dela11:PUSH BPOP BDJNZ B,Dela11RET;DS18B20初始化程序InitDs18b20:CLR DQMOV R7,#80hDJNZ R7,$ ; 延时SETB DQMOV R7,#25h DJNZ R7,$SETB FLAG1 ; 置标志位,表示DS1820存在JNB DQ,TSR5CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R7,#06BH ;200USDJNZ R7,$ ; 延时TSR7:SETB DQRET; 将从DS18B20中读出的温度数据进行转换TEMPER_COV:MOV A,TEMPER_

44、HSUBB A,#0F8HJC TEM0 ; 看温度值是否为负?不是,转MOV FLAG2,#01H ; 是,置标志位FLAG2MOV A,TEMPER_HCPL AMOV TEMPER_H,AMOV A,TEMPER_LCPL AINC AMOV TEMPER_L,ATEM0:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SWAP AMOV TEMPER_NUM,AMOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,

45、#07HSWAP AORL A,TEMPER_NUMMOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET; 将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TABMOV A,TEMPER_NUMMOVC A,A+DPTRMOV TEMPER_NUM,ARETTEMP_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07HDB 08H,09H,10H,11H,12H,13H,14H,15HDB 16H,17H,18H,19H,20H,21H,22H,23HDB 24H,25H,26H,27H,28H,

46、29H,30H,31HDB 32H,33H,34H,35H,36H,37H,38H,39HDB 40H,41H,42H,43H,44H,45H,46H,47HDB 48H,49H,50H,51H,52H,53H,54H,55HDB 56H,57H,58H,59H,60H,61H,62H,63HDB 64H,65H,66H,67H,68H,69H,70H,71HDB 72H,73H,74H,75H,76H,77H,78H,79HDB 80H,81H,82H,83H,84H,85H,86H,87HDB 88H,89H,90H,91H,92H,93H,94H,95HDB 96H,97H,98H,99

47、HEND1.7 调用汇编语言程序的C51语言程序/*/* 这是调用DS18B20的汇编程序(DS18B20B.ASM)的C51程序, */* 文件名CALLB20.C */* 功能:本程序主要是读出单个DS18B20芯片的温度转换值,转换值放*/* 在变量temp1中。转换值为BCD码,范围-5599。若flag0*/* =1为负温度值,若flag0=0为正温度值。 */*/#include #define uchar unsigned char#define uint unsigned intvoid timedelay(uint timess;void delay1(uint x;exte

48、rn uint chai; /把全局变量chai声明为外部变量extern uint a_func(uchar; /把a_func 声明为外部函数uint idata temp1 ;uchar flag0;void timedelay(uint timess /延时程序uint tj;for (tj=timess;tj>0;tj-;void delay1(uint x /延时程序uchar tw;while (x->0for (tw=0;tw<125;tw+;void main( /主程序SP=0xcf;timedelay(10000;delay1(1000;EA=0;fla

49、g0=0;chai=a_func(0x00; / 读出DS18B20采集的温度转换值temp1=chai; / 放入变量temp1中。/若flag0=0为正温度;若flag0=1为负温度值。if (temp1>255flag0=1;temp1=temp1-256; while(1;1.8 不调用汇编语言程序的C51程序/*/* 这是直接用C51高级语言编写的DS18B20转换程序没有调用汇编语言,*/* 文件名DS18B20C2.C */* 功能:本程序主要是读出单个DS18B20芯片转换后的温度值,范围 */* (-55125)。单片机的P1.0接DS18B20 的BQ。 */* fl

50、ag为温度值的正负号标志单元, flag 为"1"时表示温度值为负值*/* ,为"0"时表示温度值为正值。 变量cc中保存读出的温度值。 */* 本程序仅适合单个DS18B20 和51单片机的连接,晶振为12MHZ左右。*/*/#include #define uchar unsigned char#define uint unsigned intsbit DQ =P10; /定义端口unionuchar c2;uint x;temp;uchar flag;uint cc;void delay(uint useconds /延时程序for(;useconds>0;useconds-;uchar ow_reset(void /复位uchar presence;DQ = 0; / DQ 低电平delay(29; / 480usDQ = 1; / DQ 高电平delay(3; / 等待presence = DQ; / presence 信号delay(25;return(presence; / 0允许, 1 = 禁止 uchar read_byte(void /从1-wire 总线上读取一个字节uchar i;ucha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论