C 語言與匯編語言混合編程實(shí)例介紹_第1頁
C 語言與匯編語言混合編程實(shí)例介紹_第2頁
C 語言與匯編語言混合編程實(shí)例介紹_第3頁
C 語言與匯編語言混合編程實(shí)例介紹_第4頁
C 語言與匯編語言混合編程實(shí)例介紹_第5頁
已閱讀5頁,還剩226頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、目錄1 單線數(shù)字溫度傳感器DS18B20 41.1 DS18B20與單片機(jī)的連接 41.2 讀DS18B20溫度值的匯編語言程序1 41.3讀DS18B20溫度值的匯編語言程序2 101.4 讀單個(gè)DS18B20芯片序列號(hào)的匯編語言程序 141.5 讀多個(gè)DS18B20芯片溫度值的匯編語言程序 171.6 被調(diào)匯編語言程序 201.7 調(diào)用匯編語言程序的C51語言程序 271.8 不調(diào)用匯編語言程序的C51程序 282 實(shí)時(shí)時(shí)鐘/日歷芯片PCF8563 322.1 PCF8563與單片機(jī)的連接 322.2 匯編語言程序 322.3 被調(diào)匯編語言程序 392.4 調(diào)用匯編語言程序的C51語言程序

2、 462.5 不調(diào)用匯編語言程序的C51語言程序 483 串行帶鬧鐘的實(shí)時(shí)時(shí)鐘芯片DS1305 553.1 DS1305與單片機(jī)的連接 553.2 匯編語言程序 553.3 被調(diào)匯編語言程序 623.4 調(diào)用匯編語言程序的C51語言程序 683.5 不調(diào)用匯編語言程序的C51語言程序 714 單通道12位串行A/D轉(zhuǎn)換器MAX1241 774.1 MAX1241與單片機(jī)的連接 774.2 匯編語言程序 774.3 被調(diào)匯編語言程序 794.4 調(diào)用匯編語言程序的C51語言程序 815 8路12位串行A/D轉(zhuǎn)換器MAX146/147 835.1 MAX146/147與單片機(jī)的連接 835.2 匯

3、編語言程序 835.3 被調(diào)匯編語言程序 865.4 調(diào)用匯編語言程序的C51語言程序 886 8路12位并行A/D轉(zhuǎn)換器MAX197 916.1 MAX197與單片機(jī)的連接 916.2 匯編語言程序1 916.3 匯編語言程序2 936.4 被調(diào)匯編語言程序 946.5 調(diào)用匯編語言程序的C51語言程序 967 8路12位串行A/D轉(zhuǎn)換器MAX186 997.1 MAX186與單片機(jī)的連接 997.2 匯編語言程序1 997.3 匯編語言程序2 1017.4 被調(diào)匯編語言程序 1037.5 調(diào)用匯編語言程序的C51語言程序 1058 雙路14位串行A/D轉(zhuǎn)換器MAX111 1088.1 MA

4、X111與單片機(jī)的連接 1088.2 匯編語言程序 1088.3 被調(diào)匯編語言程序 1118.4 調(diào)用匯編語言程序的C51語言程序 1149 雙路16位-A/D轉(zhuǎn)換器AD7705 1179.1 AD7705與單片機(jī)以五線方式連接 1179.2 單片機(jī)的串行口與AD7705連接(三線方式) 1179.3 AD7705與單片機(jī)以五線方式連接下的程序 11710 9位數(shù)字溫度傳感器DS1620 12710.1 DS1620與單片機(jī)的連接 12710.2 匯編語言程序 12710.3 被調(diào)匯編語言程序 12910.4 調(diào)用匯編語言程序的C51語言程序 13210.5 不調(diào)用匯編語言程序的C51語言程序

5、 13311 10位數(shù)字溫度傳感器AD7416 13811.1 AD7416與單片機(jī)的連接 13811.2 匯編語言程序 13811.3 被調(diào)匯編語言程序 14111.4 調(diào)用匯編語言程序的C51語言程序 14611.5 不調(diào)用匯編語言程序的C51語言程序 14812 單路8位串行D/A轉(zhuǎn)換器MAX517 15612.1 MAX517與單片機(jī)的連接 15612.2 匯編語言程序 15612.3 被調(diào)匯編語言程序 15812.4 調(diào)用匯編語言程序的C51語言程序 16112.5 不調(diào)用匯編語言程序的C51語言程序 16213 單路10位串行D/A轉(zhuǎn)換器MAX515 16613.1 MAX515與

6、單片機(jī)的連接 16613.2 匯編語言程序 16613.3 被調(diào)匯編語言程序 16813.4 調(diào)用匯編語言程序的C51語言程序 17113.5 不調(diào)用匯編語言程序的C51語言程序 17214 單路12位串行D/A轉(zhuǎn)換器MAX539 17514.1 MAX539與單片機(jī)的連接 17514.2 匯編語言程序 17514.3 被調(diào)匯編語言程序 17814.4 調(diào)用匯編語言程序的C51語言程序 18014.5 不調(diào)用匯編語言程序的C51語言程序 1811 單線數(shù)字溫度傳感器DS18B201.1 DS18B20與單片機(jī)的連接1.2 讀DS18B20溫度值的匯編語言程序1;*;/* 這是DS18B20的匯

7、編程序, 文件名DS18B20.ASM */;/* 功能:本程序主要是讀出單個(gè)DS18B20芯片轉(zhuǎn)換后的溫度值,并把它 */;/* 轉(zhuǎn)換成BCD碼,范圍(-5599)。單片機(jī)的P1.0接DS18B20 */;/* 的BQ。FLAG1:標(biāo)志位,為"1"時(shí)表示檢測(cè)到DS18B20;FLAG2:標(biāo)志位, */;/* 為"1"時(shí)表示檢測(cè)到的溫度值為負(fù)值,為"0"時(shí)表示檢測(cè)到的溫度 */;/* 值為正值。DQ:DS18B20的數(shù)據(jù)總線接腳 ; */;/* TEMPER_NUM:保存讀出的溫度數(shù)據(jù)。 本程序僅適合單個(gè)DS18B20 */;/* 和

8、51單片機(jī)的連接,晶振為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 ;清負(fù)號(hào)標(biāo)志位FLAG2LCALL RE_CONFIG ;重新寫DS18B20暫存存儲(chǔ)器設(shè)定值LCALL GET_TEMPER ;讀出轉(zhuǎn)換后的溫

9、度值;將從DS18B20中讀出的溫度數(shù)據(jù)轉(zhuǎn)換成BCD碼(5599)LCALL TEMPER_COVLJMP $;讀出轉(zhuǎn)換后的溫度值GET_TEMPER:SETB DQ ; 定時(shí)入口LCALL InitDs18b20JB FLAG1,S22RETS22: LCALL Delay64uSMOV A,#SkipDs18b20 ; 跳過ROM匹配-0CCLCALL WriteByteDs1820MOV A,#StartDs18b20 ; 發(fā)出溫度轉(zhuǎn)換命令LCALL WriteByteDs1820LCALL DELAY1sLCALL InitDs18b20JB FLAG1,ABCRETABC: LCAL

10、L Delay64uSMOV A,#SkipDs18b20 ; 跳過ROM匹配LCALL WriteByteDs1820MOV A,#ReadDs ; 發(fā)出讀溫度命令LCALL WriteByteDs1820LCALL ReadDs18b20 ;READ_1820RET;讀DS18B20的程序,從DS18B20中讀出一個(gè)字節(jié)的數(shù)據(jù)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中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)ReadDs18b20:LCALL ReadByteDs1820MOV TEMPER_L ,ALCALL ReadByteDs1820MOV TEMPER_H,ARET;重新寫DS18B20暫存存儲(chǔ)器設(shè)定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若

12、DS18B20存在,轉(zhuǎn)RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH ; 發(fā)SKIP ROM命令LCALL WriteByteDs1820MOV A,#4EH ; 發(fā)寫暫存存儲(chǔ)器命令LCALL WriteByteDs1820MOV A,#00H ; TH(報(bào)警上限中寫入00H;LCALL WriteByteDs1820MOV A,#00H ; TL(報(bào)警下限中寫入00H;LCALL WriteByteDs1820MOV A,#7FH ; 選擇12位溫度分辨率LCALL WriteByteDs1820RET;延時(shí)子程序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,$ ; 延時(shí)SETB DQMOV R7,#25h ;DJNZ R7,$SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在JNB DQ,TSR5CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在LJMP TSR7TSR5:MOV R7,#06BH ;200USDJNZ R7,$ ; 延時(shí)TSR7:SETB

14、 DQRET; 將從DS18B20中讀出的溫度數(shù)據(jù)進(jìn)行轉(zhuǎn)換TEMPER_COV:MOV A,TEMPER_HSUBB A,#0F8HJC TEM0 ; 看溫度值是否為負(fù)?不是,轉(zhuǎn)SETB FLAG2 ; 是,置標(biāo)志位FLAG2MOV A,TEMPER_HCPL AMOV TEMPER_H,AMOV A,TEMPER_LCPL AINC AMOV TEMPER_L,ATEM0:MOV A,#0F0HANL A,TEMPER_L ; 舍去溫度低位中小數(shù)點(diǎn)后的四位溫度數(shù)值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 ; 保存變換后的溫度數(shù)據(jù)LCALL BIN_BCDRET; 將16進(jìn)制的溫度數(shù)據(jù)轉(zhuǎn)換成壓縮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 */;/* 功能:本程序主要是讀出多個(gè)DS18B20芯片轉(zhuǎn)換后的溫度值,這里用 */;/* 兩個(gè)DS18B20芯片。單片機(jī)的P1.0接DS18B20的BQ。第1個(gè)DS18B20 */;/* 芯片的溫度值放在50H和51H單元(高字節(jié)在50H中),第2個(gè)DS18B20*/;/* 芯片的溫度值放在52H和53H單元(高字節(jié)在52H中)。本程序適合 */;/* 多個(gè)DS18B20

18、 和51單片機(jī)的連接,晶振為12MHZ左右。 */;*DQ EQU P1.0ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HLCALL GET_TEMPSJMP $GET_TEMP:CLR PSW.4SETB PSW.3 ;設(shè)置工作寄存器當(dāng)前所在的區(qū)域CLR EA ;使用ds1820一定要禁止任何中斷產(chǎn)生LCALL INT ;調(diào)用初使化子程序MOV A,#0CCHLCALL WRITE ;送入跳過ROM命令MOV A, #44HLCALL WRITE ;送入溫度轉(zhuǎn)換命令LCALL INT ;溫度轉(zhuǎn)換完全,再次初使化ds1820MOV A,#55HLCALL

19、 WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;發(fā)第1個(gè)DS18B20序列號(hào)(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 ;讀出溫度值低字節(jié)存入51H

20、CALL READMOV 50H,A ;讀出謾度值高字節(jié)存入50HLCALL INT ;再次初使化ds1820MOV A,#55HLCALL WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;發(fā)第2個(gè)DS18B20序列號(hào)(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 ;讀出溫度值低字節(jié)存入53HCALL READMOV 52H,A ;讀出謾度值高字節(jié)存入52HSETB EARETINT: ;初始化ds1820子程序CLR EAL0: CLR DQ ;ds1820總線為低復(fù)位電平MOV R2,#200L1: CLR DQDJNZ R2,L1 ;總線復(fù)位電平保持400usSETB DQ ;釋放ds1820總線MOV R2,#30L4: DJNZ R2,L4 ;釋放ds1820總線保持60usCLR C ;清存在信號(hào)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數(shù),一個(gè)字節(jié)8個(gè)bitWR1:SETB DQMOV R4,#8RRC A ;把一個(gè)字節(jié)data(A分成8個(gè)bit環(huán)移給 CCLR DQ ;開始寫入ds1820總線要處于復(fù)位(低狀態(tài)WR2:DJNZ R4,WR2 ;ds1820總線復(fù)位保持16usMOV DQ,C ;寫入一個(gè)bitMOV R4,#20WR3:DJNZ R4,WR

23、3 ;等待40usDJNZ R3,WR1 ;寫入下一個(gè)bitSETB DQ ;重新釋放ds1820總線RETREAD:CLR EAMOV R6,#8 ;連續(xù)讀8個(gè)bitRE1:CLR DQ ;讀前總線保持為低MOV R4,#4NOPSETB DQ ;開始讀總線釋放RE2:DJNZ R4,RE2 ;持續(xù)8usMOV C,DQ ;從ds1820總線讀得一個(gè)bitRRC A ;把讀得的位值環(huán)移給 AMOV R5,#30RE3:DJNZ R5,RE3 ;持續(xù)60usDJNZ R6,RE1 ;讀下一個(gè)bitSETB DQ ;重新釋放ds1820總線RETEND1.4 讀單個(gè)DS18B20芯片序列號(hào)的匯編

24、語言程序;/*;/* 這是DS18B20的匯編程序, 文件名D18B20.ASM */;/* 功能:本程序主要是讀出芯片DS18B20固有的序列號(hào),序列號(hào)共64位, */;/* 也就是8個(gè)字節(jié),讀出后依次放在單片機(jī)的RAM 40H,41H,.47H中。*/;/* 單片機(jī)的P1.0接DS18B20的BQ。 */;/* 本芯片的序列號(hào)為: 28h,10h,46h,e2h,00,00,00,7eh */;/*DQ EQU P1.0ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HCLR EA ;使用ds1820一定要禁止任何中斷產(chǎn)生LCALL INT ;初始化ds

25、1820MOV A,#33HLCALL WRITE ;送入讀ds1820的ROM命令LCALL READ ;開始讀出當(dāng)前ds1820序列號(hào)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總線為低復(fù)位電平MOV R2,#200L1: CLR DQDJNZ

26、R2,L1 ;總線復(fù)位電平保持400usSETB DQ ;釋放ds1820總線MOV R2,#30L4: DJNZ R2,L4 ;釋放ds1820總線保持60usCLR C ;清存在信號(hào)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數(shù),一個(gè)字節(jié)8個(gè)bitWR1: SETB DQMOV R4,#8RRC A ;把一個(gè)字節(jié)data(A分成8

27、個(gè)bit環(huán)移給 CCLR DQ ;開始寫入ds1820總線要處于復(fù)位(低狀態(tài)WR2: DJNZ R4,WR2 ;ds1820總線復(fù)位保持16usMOV DQ,C ;寫入一個(gè)bitMOV R4,#20WR3: DJNZ R4,WR3 ;等待40usDJNZ R3,WR1 ;寫入下一個(gè)bitSETB DQ ;重新釋放ds1820總線RETREAD:CLR EAMOV R6,#8 ;連續(xù)讀8個(gè)bitRE1: CLR DQ ;讀前總線保持為低MOV R4,#4NOPSETB DQ ;開始讀總線釋放RE2: DJNZ R4,RE2 ;持續(xù)8usMOV C,DQ ;從ds1820總線讀得一個(gè)bitRRC

28、A ;把讀得的位值環(huán)移給 AMOV R5,#30RE3: DJNZ R5,RE3 ;持續(xù)60usDJNZ R6,RE1 ;讀下一個(gè)bitSETB DQ ;重新釋放ds1820總線RETEND1.5 讀多個(gè)DS18B20芯片溫度值的匯編語言程序;*;/* 這是DS18B20的匯編程序, 文件名D18B203.ASM */;/* 功能:本程序主要是讀出多個(gè)DS18B20芯片轉(zhuǎn)換后的溫度值,這里用 */;/* 兩個(gè)DS18B20芯片。單片機(jī)的P1.0接DS18B20的BQ。第1個(gè)DS18B20 */;/* 芯片的溫度值放在50H和51H單元(高字節(jié)在50H中),第2個(gè)DS18B20*/;/* 芯片的

29、溫度值放在52H和53H單元(高字節(jié)在52H中)。本程序適合 */;/* 多個(gè)DS18B20 和51單片機(jī)的連接,晶振為12MHZ左右。 */;*DQ EQU P1.0ORG 0000HAJMP MAINORG 0020HMAIN:MOV SP,#60HLCALL GET_TEMPSJMP $GET_TEMP:CLR PSW.4SETB PSW.3 ;設(shè)置工作寄存器當(dāng)前所在的區(qū)域CLR EA ;使用ds1820一定要禁止任何中斷產(chǎn)生LCALL INT ;調(diào)用初使化子程序MOV A,#0CCHLCALL WRITE ;送入跳過ROM命令MOV A, #44HLCALL WRITE ;送入溫度轉(zhuǎn)換

30、命令LCALL INT ;溫度轉(zhuǎn)換完全,再次初使化ds1820MOV A,#55HLCALL WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;發(fā)第1個(gè)DS18B20序列號(hào)(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 ;讀出溫度值低字節(jié)存入51HCALL READMOV 50H,A ;讀出謾度值高字節(jié)存入50HLCALL INT ;再次初使化ds1820MOV A,#55HLCALL WRITE ;送入匹配ROM命令MOV A,#28HLCALL WRITE ;發(fā)第2個(gè)DS18B20序列號(hào)(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 ;讀出溫度值低字節(jié)存入53HCALL READMOV 52H,A ;讀出謾度值高字節(jié)存入52HSETB EARETINT: ;初始化ds1820子程序CLR EAL0: CLR DQ ;ds1820總線為低復(fù)位電平MOV R2,#200L1: CLR DQDJNZ R2,L1 ;總線復(fù)位電平保持400usSETB DQ ;釋放ds1820總線MOV R2,#30L4: DJNZ R2,L4 ;

33、釋放ds1820總線保持60usCLR C ;清存在信號(hào)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數(shù),一個(gè)字節(jié)8個(gè)bitWR1:SETB DQMOV R4,#8RRC A ;把一個(gè)字節(jié)data(A分成8個(gè)bit環(huán)移給 CCLR DQ ;開始寫入ds1820總線要處于復(fù)位(低狀態(tài)WR2:DJNZ R4,WR2 ;ds1820總線復(fù)位保

34、持16usMOV DQ,C ;寫入一個(gè)bitMOV R4,#20WR3:DJNZ R4,WR3 ;等待40usDJNZ R3,WR1 ;寫入下一個(gè)bitSETB DQ ;重新釋放ds1820總線RETREAD:CLR EAMOV R6,#8 ;連續(xù)讀8個(gè)bitRE1:CLR DQ ;讀前總線保持為低MOV R4,#4NOPSETB DQ ;開始讀總線釋放RE2:DJNZ R4,RE2 ;持續(xù)8usMOV C,DQ ;從ds1820總線讀得一個(gè)bitRRC A ;把讀得的位值環(huán)移給 AMOV R5,#30RE3:DJNZ R5,RE3 ;持續(xù)60usDJNZ R6,RE1 ;讀下一個(gè)bitSET

35、B DQ ;重新釋放ds1820總線RETEND1.6 被調(diào)匯編語言程序;*;/* 這是被CALLB20.C調(diào)用的DS18B20匯編語言程序,文件名為DS18B20B.ASM */;/* 功能:本程序主要是讀出單個(gè)DS18B20芯片轉(zhuǎn)換后的溫度值,并把它 */;/* 轉(zhuǎn)換成BCD碼,范圍(5599)。單片機(jī)的P1.0接DS18B20 */;/* 的BQ。FLAG1:標(biāo)志位,為"1"時(shí)表示檢測(cè)到DS18B20;FLAG2:標(biāo)志單元 */;/* , 為"1"時(shí)表示檢測(cè)到的溫度值為負(fù)值,為"0"時(shí)表示檢測(cè)到的溫度 */;/* 值為正值。DQ

36、:DS18B20的數(shù)據(jù)總線接腳 ; */;/* TEMPER_NUM:保存讀出的溫度數(shù)據(jù)。 本程序僅適合單個(gè)DS18B20 */;/* 和51單片機(jī)的連接,晶振為12MHZ左右。 */;/* 本程序是被調(diào)用的匯編語言程序,由外部傳遞進(jìn)來的參數(shù)在R7中, */;/* 是字符型的,在本程序中未用;返回的參數(shù)是整形的,其中高八位 */;/* 放置溫度值的正負(fù)號(hào),為"1"時(shí)表示檢測(cè)到的溫度值為負(fù)值,為"0" */;/* 時(shí)表示檢測(cè)到的溫度值為正值,低八位放置溫度值。 */;*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中放傳遞進(jìn)來的字符型參數(shù)MOV FLAG2,#00 ;清負(fù)號(hào)標(biāo)志FLAG2LCALL RE_CONFIG ;重新寫DS18B20暫存存儲(chǔ)器設(shè)定值LCALL GET_TEMPER ;讀出轉(zhuǎn)換后的溫度值MOV TEMPER_L,#90HMOV TEMPER_H,#0FCHLCALL TEMPER_COV ;將從DS18B20中讀出的溫度數(shù)據(jù)轉(zhuǎn)換成BCD碼MOV A,TEMPER_NUMMOV R7,A ;R7中放返回溫度值MOV R6,FLAG2 ;R6中放返回溫度值的符號(hào),1為負(fù),0為正。RET;讀出轉(zhuǎn)換后的溫度值GET_TEMPER:SkipDs18b20 EQ

39、U 0CCHStartDs18b20 EQU 44HReadDs EQU 0BEHSETB DQ ; 定時(shí)入口CALL InitDs18b20JB FLAG1,S22RETS22: CALL Delay64uSMOV A,#SkipDs18b20 ; 跳過ROM匹配-0CCCALL WriteByteDs1820MOV A,#StartDs18b20 ; 發(fā)出溫度轉(zhuǎn)換命令CALL WriteByteDs1820CALL DELAY1sCALL InitDs18b20JB FLAG1,ABCRETABC: CALL Delay64uSMOV A,#SkipDs18b20 ; 跳過ROM匹配CAL

40、L WriteByteDs1820MOV A,#ReadDs ; 發(fā)出讀溫度命令CALL WriteByteDs1820CALL ReadDs18b20 ;READ_1820RET;讀DS18B20的程序,從DS18B20中讀出一個(gè)字節(jié)的數(shù)據(jù)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中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)ReadDs18b20:CALL ReadByteDs1820MOV TEMPER_L ,ACALL ReadByteDs1820MOV TEMPER_H,ARET;重新寫DS18B20暫存存儲(chǔ)器設(shè)定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,轉(zhuǎn)RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH

42、; 發(fā)SKIP ROM命令CALL WriteByteDs1820MOV A,#4EH ; 發(fā)寫暫存存儲(chǔ)器命令CALL WriteByteDs1820MOV A,#00H ; TH(報(bào)警上限中寫入00H;CALL WriteByteDs1820MOV A,#00H ; TL(報(bào)警下限中寫入00H;CALL WriteByteDs1820MOV A,#7FH ; 選擇12位溫度分辨率CALL WriteByteDs1820RET;延時(shí)子程序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,$ ; 延時(shí)SETB DQMOV R7,#25h DJNZ R7,$SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在JNB DQ,TSR5CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在LJMP TSR7TSR5:MOV R7,#06BH ;200USDJNZ R7,$ ; 延時(shí)TSR7:SETB DQRET; 將從DS18B20中讀出的溫度數(shù)據(jù)進(jìn)行轉(zhuǎn)換TEMPER_COV:MOV A,TEMPER_

44、HSUBB A,#0F8HJC TEM0 ; 看溫度值是否為負(fù)?不是,轉(zhuǎn)MOV FLAG2,#01H ; 是,置標(biāo)志位FLAG2MOV A,TEMPER_HCPL AMOV TEMPER_H,AMOV A,TEMPER_LCPL AINC AMOV TEMPER_L,ATEM0:MOV A,#0F0HANL A,TEMPER_L ; 舍去溫度低位中小數(shù)點(diǎn)后的四位溫度數(shù)值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 ; 保存變換后的溫度數(shù)據(jù)LCALL BIN_BCDRET; 將16進(jìn)制的溫度數(shù)據(jù)轉(zhuǎn)換成壓縮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 調(diào)用匯編語言程序的C51語言程序/*/* 這是調(diào)用DS18B20的匯編程序(DS18B20B.ASM)的C51程序, */* 文件名CALLB20.C */* 功能:本程序主要是讀出單個(gè)DS18B20芯片的溫度轉(zhuǎn)換值,轉(zhuǎn)換值放*/* 在變量temp1中。轉(zhuǎn)換值為BCD碼,范圍-5599。若flag0*/* =1為負(fù)溫度值,若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(bǔ)_func 聲明為外部函數(shù)uint idata temp1 ;uchar flag0;void timedelay(uint timess /延時(shí)程序uint tj;for (tj=timess;tj>0;tj-;void delay1(uint x /延時(shí)程序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采集的溫度轉(zhuǎn)換值temp1=chai; / 放入變量temp1中。/若flag0=0為正溫度;若flag0=1為負(fù)溫度值。if (temp1>255flag0=1;temp1=temp1-256; while(1;1.8 不調(diào)用匯編語言程序的C51程序/*/* 這是直接用C51高級(jí)語言編寫的DS18B20轉(zhuǎn)換程序沒有調(diào)用匯編語言,*/* 文件名DS18B20C2.C */* 功能:本程序主要是讀出單個(gè)DS18B20芯片轉(zhuǎn)換后的溫度值,范圍 */* (-55125)。單片機(jī)的P1.0接DS18B20 的BQ。 */* fl

50、ag為溫度值的正負(fù)號(hào)標(biāo)志單元, flag 為"1"時(shí)表示溫度值為負(fù)值*/* ,為"0"時(shí)表示溫度值為正值。 變量cc中保存讀出的溫度值。 */* 本程序僅適合單個(gè)DS18B20 和51單片機(jī)的連接,晶振為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 /延時(shí)程序for(;useconds>0;useconds-;uchar ow_reset(void /復(fù)位uchar presence;DQ = 0; / DQ 低電平delay(29; / 480usDQ = 1; / DQ 高電平delay(3; / 等待presence = DQ; / presence 信號(hào)delay(25;return(presence; / 0允許, 1 = 禁止 uchar read_byte(void /從1-wire 總線上讀取一個(gè)字節(jié)uchar i;ucha

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論