⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.sdi

📁 51 单片机支持ds18b20测温电路和源程序
💻 SDI
字号:
000B,,,DAT     BIT P3.7 ;数据通信口
,,,swpH    equ  0d2H
,,,swpL    equ  0ffH
,,,WDLSB   DATA 30H ;读出的温度低字节
,,,WDMSB   DATA 31H ;读出的温度高字节
,,,;***************************************************************
,,,        ORG 0000H
0000,02 00 28,,        LJMP MAIN
,,,        ORG 000BH
000B,02 00 0E,,        LJMP TMR0   ;定时显示,用定时器0
,,,
,,,;********************************************************
,,,;定时显示子程序
000E,,TMR0,TMR0:
000E,75 8C D2,, MOV TH0,#swpH ;定时器10MS中断
0011,75 8A FF,,MOV TL0,#swpL
0014,20 21 08,, JB 21H,dsl;用于高低位轮流显示
0017,85 42 80,,MOV P0,42H;高位
001A,43 80 20,,ORL P0,#00100000B
001D,80 06,, sjmp kkk
001F,,dsl,dsl:
001F,85 43 80,,MOV P0,43H;低位
0022,43 80 10,,ORL P0,#00010000B
0025,,kkk,kkk:
0025,B2 21,,  cpl 21H
0027,32,,RETI
,,,
,,,;主程序:
0028,,MAIN,MAIN:
0028,,TOINIT,TOINIT:
,,,;定时器0的初始化
0028,C2 AF,, CLR EA
002A,75 89 01,, MOV TMOD,#01H
002D,75 8C D2,, MOV TH0,#swpH ;定时器10MS中断
0030,75 8A FF,,MOV TL0,#swpL
0033,D2 AF,, SETB EA
0035,D2 A9,,SETB ET0
0037,D2 8C,, SETB TR0
,,,;***********************************************************
,,,;清显示缓冲
0039,7A 02,,  MOV R2,#2
003B,78 42,,MOV R0,#42H ;
003D,,OVER,OVER:
003D,76 00,,  MOV @R0,#00H;
003F,08,,INC R0
0040,DA FB,,DJNZ R2,OVER
,,,
0042,,LOOP,LOOP:
0042,12 00 47,,LCALL DSWD ;调用读出DS18B20温度程序
0045,80 FB,,SJMP LOOP
,,,
,,,;**********************************************************
0047,,DSWD,DSWD:
0047,12 00 C7,,        LCALL RSTSNR;调用复位程序
004A,30 D5 3D,,        JNB F0,KEND ;如果没有应答,返回主程序
004D,78 CC,,        MOV R0,#0CCH
004F,12 00 AB,,        LCALL SEND_BYTE ;跳过ROM匹配
0052,78 44,,        MOV R0,#44H ;发出温度转换命令
0054,12 00 AB,,        LCALL SEND_BYTE
0057,D2 AF,,        SETB EA
0059,75 48 01,,        MOV 48H,#1 ;延时75ms以上准备读
005C,,SS2,SS2:
005C,75 49 FF,,        MOV 49H,#255
005F,,SS1,SS1:
005F,75 4A FF,,        MOV 4AH,#255
0062,,SS0,SS0:
0062,D5 4A FD,,        DJNZ 4AH,SS0
0065,D5 49 F7,,        DJNZ 49H,SS1
0068,D5 48 F1,,        DJNZ 48H,SS2
006B,C2 AF,,        CLR EA
006D,12 00 C7,,        LCALL RSTSNR
0070,30 D5 17,,        JNB F0,KEND
0073,78 CC,,        MOV R0,#0CCH ;跳过ROM匹配
0075,12 00 AB,,        LCALL SEND_BYTE
0078,78 BE,,        MOV R0,#0BEH ;发出读温度命令
007A,12 00 AB,,        LCALL SEND_BYTE
007D,12 00 BD,,        LCALL READ_BYTE
0080,F5 30,,        MOV WDLSB,A
0082,12 00 BD,,        LCALL READ_BYTE
0085,F5 31,,        MOV WDMSB,A
0087,12 00 8D,,        LCALL TRANS12
008A,,KEND,KEND:
008A,D2 AF,,        SETB EA
008C,22,,        RET
,,,;**********************************************************
,,,;温度转换程序(只取整数) ,30H=LSB,31H=MSB;
008D,,TRANS12,TRANS12:
008D,E5 30,,    MOV A,30H
008F,54 F0,,        ANL A,#0F0H
0091,F5 3A,,        MOV 3AH,A
0093,E5 31,,        MOV A,31H
0095,54 0F,,        ANL A,#0FH
0097,45 3A,,        ORL A,3AH
0099,C4,,        SWAP A
009A,75 F0 0A,,        MOV B,#10
009D,84,,        DIV AB
,,,        ;MOV 42H,A
009E,85 F0 43,,        MOV 43H,B ;
00A1,75 F0 0A,,        mov b,#10
00A4,84,,        div ab
00A5,85 F0 42,,        mov 42H,B
00A8,F5 41,,        mov 41H,A
00AA,22,,        RET
,,,;*************************************************
00AB,,SEND_BYTE,SEND_BYTE: ;发送一个字节程序
00AB,E8,,        MOV A,R0
00AC,7D 08,,        MOV R5,#8
00AE,C3,SEN3,SEN3:   CLR C
00AF,13,,        RRC A
00B0,40 05,,        JC SEN1
00B2,12 00 F0,,        LCALL WRITE_0
00B5,80 03,,        SJMP SEN2
00B7,12 00 F9,SEN1,SEN1:   LCALL WRITE_1
00BA,DD F2,SEN2,SEN2:   DJNZ R5,SEN3 ; 循环8次,写一个字节
00BC,22,,        RET
,,,;*************************************************
,,,;读一个字节程序
00BD,,READ_BYTE,READ_BYTE:
00BD,7D 08,,        MOV R5,#8
00BF,12 01 07,READ1,READ1:  LCALL READ
00C2,13,,        RRC A
00C3,DD FA,,        DJNZ R5,READ1 ; 循环8次,读一个字节
00C5,F8,,        MOV R0,A
00C6,22,,        RET
,,,        ;*************************************************
,,,;复位程序,如果复位置位F0,没有就复位F0
00C7,D2 B7,RSTSNR,RSTSNR: SETB DAT
00C9,00,,        NOP
00CA,00,,        NOP
00CB,C2 B7,,        CLR DAT
00CD,7E FA,,        MOV R6,#250 ;主机发复位脉冲持续3μs×200=600μs
00CF,DE FE,,        DJNZ R6,$
00D1,7E 32,,        MOV R6,#50
00D3,DE FE,,        DJNZ R6,$
00D5,D2 B7,,        SETB DAT ;主机释放总线,口线改为输入
00D7,7E 0F,,        MOV R6,#15
00D9,DE FE,,        DJNZ R6,$
00DB,12 00 E5,,        CALL CHCK ;调用应答检查程序
00DE,7E 3C,,        MOV R6,#60
00E0,DE FE,,        DJNZ R6,$
00E2,D2 B7,,        SETB DAT
00E4,22,,        RET
,,,        ;*************************************************
00E5,A2 B7,CHCK,CHCK:   MOV C,DAT
00E7,40 04,,        JC RST0
00E9,D2 D5,,        SETB F0 ;检测到信号,置位F0
00EB,80 02,,        SJMP CHCK0
00ED,C2 D5,RST0,RST0:   CLR F0 ;未准备好F0复位
00EF,22,CHCK0,CHCK0:  RET
,,,;*************************************************
,,,;写0
00F0,,WRITE_0,WRITE_0:
00F0,C2 B7,,        CLR DAT
00F2,7E 1E,,        MOV R6,#30
00F4,DE FE,,        DJNZ R6,$
00F6,D2 B7,,        SETB DAT
00F8,22,,        RET
,,,;*************************************************
,,,;写1
00F9,,WRITE_1,WRITE_1:
00F9,C2 B7,,        CLR DAT
00FB,00,,        NOP
00FC,00,,        NOP
00FD,00,,        NOP
00FE,00,,        NOP
00FF,00,,        NOP
0100,D2 B7,,        SETB DAT
0102,7E 1E,,        MOV R6,#30
0104,DE FE,,        DJNZ R6,$
0106,22,,        RET
,,,;*************************************************
,,,;读一位数据程序
0107,D2 B7,READ,READ:   SETB DAT ;先复位至少1US产生读起始信号
0109,00,,        NOP
010A,00,,        NOP
010B,C2 B7,,        CLR DAT
010D,00,,        NOP
010E,00,,        NOP
010F,D2 B7,,        SETB DAT ;置位DAT准备接收数据
0111,00,,        NOP
0112,00,,        NOP
0113,00,,        NOP
0114,00,,        NOP
0115,00,,        NOP
0116,00,,        NOP
0117,00,,        NOP
0118,A2 B7,,        MOV C,DAT
011A,7E 17,,        MOV R6,#23
011C,DE FE,,        DJNZ R6,$
011E,22,,        RET
,,,;**********************************************
,,,;13毫秒延时子程序
011F,7C 14,DELAY10,DELAY10:MOV R4,#20
0121,7D 1E,D2,D2:     MOV R5,#30
0123,DD FE,,        DJNZ R5,$
0125,DC FA,,        DJNZ R4,D2
0127,22,,        RET
,,,
000E,,,        end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -