📄 ex10-4.sdi
字号:
022B,20 54 45 4D,M_ERROR2,M_ERROR2: DB " TEMP: ---- ",0
,,,
,,,;****************************DS18B20复位子程序 *****************************
023C,D2 B3,RST,RST: SETB DQ
023E,00,, NOP
023F,C2 B3,, CLR DQ
0241,78 6B,, MOV R0,#6BH ;主机发出延时复位低脉冲
0243,79 04,, MOV R1,#04H
0245,D8 FE,TSR1,TSR1: DJNZ R0,$
0247,78 6B,, MOV R0,#6BH
0249,D9 FA,, DJNZ R1,TSR1
024B,D2 B3,, SETB DQ ;拉高数据线
024D,00,, NOP
024E,00,, NOP
024F,00,, NOP
0250,78 32,, MOV R0,#32H
0252,30 B3 05,TSR2,TSR2: JNB DQ,TSR3 ;等待DS18B20回应
0255,D8 FB,, DJNZ R0,TSR2
0257,02 02 5F,, JMP TSR4 ; 延时
025A,D2 00,TSR3,TSR3: SETB FLAG1 ; 置1标志位,表示DS1820存在
025C,02 02 64,, JMP TSR5
025F,C2 00,TSR4,TSR4: CLR FLAG1 ; 清0标志位,表示DS1820不存在
0261,02 02 68,, JMP TSR7
0264,78 6B,TSR5,TSR5: MOV R0,#06BH
0266,D8 FE,TSR6,TSR6: DJNZ R0,$ ; 时序要求延时一段时间
0268,D2 B3,TSR7,TSR7: SETB DQ
026A,22,, RET
,,,
,,,;************************ DS18B20暂存器操作子程序 ***************************
026B,20 00 01,RE_18B20,RE_18B20:JB FLAG1,RE_18B20A
026E,22,, RET
026F,,RE_18B20A,RE_18B20A:
026F,12 02 3C,,LCALL RST
0272,74 CC,, MOV A,#0CCH ;跳过ROM匹配
0274,12 02 C5,, LCALL WRITE
0277,,WR_SCRAPD,WR_SCRAPD:
0277,74 4E,, MOV A,#4EH ;写暂器
0279,12 02 C5,, LCALL WRITE
027C,E5 27,, MOV A,TEMP_TH ;TH(报警上限)
027E,12 02 C5,, LCALL WRITE
0281,E5 28,, MOV A,TEMP_TL ;TL(报警下限)
0283,12 02 C5,, LCALL WRITE
0286,74 7F,, MOV A,#7FH ;12位精度
0288,12 02 C5,, LCALL WRITE
028B,22,, RET
,,,
,,,;************************ 复制暂存器子程序 *******************************
028C,12 02 3C,WRITE_E2,WRITE_E2:LCALL RST
028F,74 CC,, MOV A,#0CCH ;跳过ROM匹配
0291,12 02 C5,, LCALL WRITE
0294,74 48,, MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM
0296,12 02 C5,, LCALL WRITE
0299,22,, RET
,,,
,,,;*********************** 重读EEROM子程序 ********************************
029A,12 02 3C,READ_E2,READ_E2:LCALL RST
029D,74 CC,, MOV A,#0CCH ;跳过ROM匹配
029F,12 02 C5,, LCALL WRITE
02A2,74 B8,, MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
02A4,12 02 C5,, LCALL WRITE
02A7,22,, RET
,,,
,,,;************************ 将自定义字符写入LCD的CGRAM中 *********************
02A8,,STORE_DATA,STORE_DATA:
02A8,74 40,, MOV A,#40H
02AA,12 05 23,, LCALL WCOM
02AD,7A 08,, MOV R2,#08H
02AF,90 02 BD,, MOV DPTR,#D_DATA
02B2,7B 00,, MOV R3,#00H
02B4,EB,S_DATA,S_DATA: MOV A,R3
02B5,93,, MOVC A,@A+DPTR
02B6,12 05 31,, LCALL WDATA ;写入数据
02B9,0B,, INC R3
02BA,DA F8,, DJNZ R2,S_DATA
02BC,22,, RET
02BD,0C 12 12 0C,D_DATA,D_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H
,,,;*********************** DS18B20数据写入操作子程序 ************************
02C5,7A 08,WRITE,WRITE: MOV R2,#8 ;一共8位数据
02C7,C3,, CLR C
02C8,C2 B3,WR1,WR1: CLR DQ ;开始写入DS18B20总线要处于复位(低)状态
02CA,7B 07,, MOV R3,#07
02CC,DB FE,, DJNZ R3,$ ;总线复位保持16微妙以上
02CE,13,, RRC A ;把一个字节DATA 分成8个BIT环移给C
02CF,92 B3,, MOV DQ,C ;写入一位
02D1,7B 3C,, MOV R3,#3CH
02D3,DB FE,, DJNZ R3,$ ;等待100微妙
02D5,D2 B3,, SETB DQ ;重新释放总线
02D7,00,, NOP
02D8,DA EE,, DJNZ R2,WR1 ;写入下一位
02DA,D2 B3,, SETB DQ
02DC,22,, RET
,,,
,,,;********************** DS18B20数据读取操作子程序 **************************
02DD,7C 04,READ,READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出
02DF,79 25,, MOV R1,#TEMPL ;存入25H、26H、27H、28H单元
02E1,7A 08,RE00,RE00: MOV R2,#8
02E3,C2 D7,RE01,RE01: CLR CY
02E5,D2 B3,, SETB DQ
02E7,00,, NOP
02E8,00,, NOP
02E9,C2 B3,, CLR DQ ;读前总线保持为低
02EB,00,, NOP
02EC,00,, NOP
02ED,00,, NOP
02EE,D2 B3,, SETB DQ ;开始读总线释放
02F0,7B 09,, MOV R3,#09 ;延时18微妙
02F2,DB FE,, DJNZ R3,$
02F4,A2 B3,, MOV C,DQ ;从DS18B20总线读得一位
02F6,7B 3C,, MOV R3,#3CH
02F8,DB FE,, DJNZ R3,$ ;等待100微妙
02FA,13,, RRC A ;把读得的位值环移给A
02FB,DA E6,, DJNZ R2,RE01 ;读下一位
02FD,F7,, MOV @R1,A
02FE,09,, INC R1
02FF,DC E0,, DJNZ R4,RE00
0301,22,, RET
,,,
,,,;************************ 温度值 BCD 码处理子程序 *************************
0302,E5 26,CONVTEMP,CONVTEMP: MOV A,TEMPH ;判温度是否零下
0304,54 08,, ANL A,#08H
0306,60 17,, JZ TEMPC1 ;温度零上转
0308,C3,, CLR C
0309,E5 25,, MOV A,TEMPL ;二进制数求补(双字节)
030B,F4,, CPL A ;取反加1
030C,24 01,, ADD A,#01H
030E,F5 25,, MOV TEMPL,A
0310,E5 26,, MOV A,TEMPH
0312,F4,, CPL A
0313,34 00,, ADDC A,#00H
0315,F5 26,, MOV TEMPH,A
0317,75 29 0B,, MOV TEMPHC,#0BH ;负温度标志
031A,75 2B 0B,, MOV TEMPFC,#0BH
031D,80 06,, SJMP TEMPC11
031F,75 29 0A,TEMPC1,TEMPC1: MOV TEMPHC,#0AH ;正温度标志
0322,75 2B 0A,, MOV TEMPFC,#0AH
0325,E5 29,TEMPC11,TEMPC11: MOV A,TEMPHC
0327,C4,, SWAP A
0328,F5 29,, MOV TEMPHC,A
032A,E5 25,, MOV A,TEMPL
032C,54 0F,, ANL A,#0FH ;乘0.0625
032E,90 03 76,, MOV DPTR,#TEMPDOTTAB
0331,93,, MOVC A,@A+DPTR
0332,F5 2A,, MOV TEMPLC,A ;TEMPLC LOW=小数部分 BCD
0334,E5 25,, MOV A,TEMPL ;整数部分
0336,54 F0,, ANL A,#0F0H ;取出高四位
0338,C4,, SWAP A
0339,F5 25,, MOV TEMPL,A
033B,E5 26,, MOV A,TEMPH ;取出低四位
033D,54 0F,, ANL A,#0FH
033F,C4,, SWAP A
0340,45 25,, ORL A,TEMPL ;重新组合
0342,F5 24,, MOV TEMP_ZH,A
0344,12 03 68,, LCALL HEX2BCD1
0347,F5 25,, MOV TEMPL,A
0349,54 F0,, ANL A,#0F0H
034B,C4,, SWAP A
034C,45 29,, ORL A,TEMPHC ;TEMPHC LOW = 十位数 BCD
034E,F5 29,, MOV TEMPHC,A
0350,E5 25,, MOV A,TEMPL
0352,54 0F,, ANL A,#0FH
0354,C4,, SWAP A ;TEMPLC HI = 个位数 BCD
0355,45 2A,, ORL A,TEMPLC
0357,F5 2A,, MOV TEMPLC,A
0359,EC,, MOV A,R4
035A,60 0B,, JZ TEMPC12
035C,54 0F,, ANL A,#0FH
035E,C4,, SWAP A
035F,FC,, MOV R4,A
0360,E5 29,, MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD
0362,54 0F,, ANL A,#0FH
0364,4C,, ORL A,R4
0365,F5 29,, MOV TEMPHC,A
0367,22,TEMPC12,TEMPC12: RET
,,,
,,,;************************ 二-十进制转换子程序 *****************************
0368,75 F0 64,HEX2BCD1,HEX2BCD1: MOV B,#064H
036B,84,, DIV AB
036C,FC,, MOV R4,A
036D,74 0A,, MOV A,#0AH
036F,C5 F0,, XCH A,B
0371,84,, DIV AB
0372,C4,, SWAP A
0373,45 F0,, ORL A,B
0375,22,, RET
0376,00 00 01 01,TEMPDOTTAB,TEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表
037E,05 05 06 06,, DB 05H,05H,06H,06H,07H,08H,08H,09H
,,,
,,,;********************** 查询温度报警值子程序 ***************************
0386,90 03 BA,LOOK_ALARM,LOOK_ALARM: MOV DPTR,#M_ALAX2 ;指针指到显示信息区
0389,74 02,, MOV A,#2 ;显示在第二行
038B,12 04 E7,, LCALL LCD_PRINT
038E,74 C6,, MOV A,#0C6H
0390,12 03 CB,, LCALL TEMP_BJ1
0393,E5 27,, MOV A,TEMP_TH ;加载TH数据
0395,75 2F 03,, MOV LCD_X,#3 ;设置显示位置
0398,12 03 E0,, LCALL SHOW_DIG2H ;显示数据
039B,74 CE,, MOV A,#0CEH
039D,12 03 CB,, LCALL TEMP_BJ1
03A0,E5 28,, MOV A,TEMP_TL ;加载TL数据
03A2,75 2F 0C,, MOV LCD_X,#12 ;设置显示位置
03A5,12 04 10,, LCALL SHOW_DIG2L ;显示数据
03A8,22,, RET
03A9,20 4C 4F 4F,M_ALAX1,M_ALAX1: DB " LOOK ALERT CODE",0
03BA,54 48 3A 20,M_ALAX2,M_ALAX2: DB "TH: TL: ",0
03CB,12 05 23,TEMP_BJ1,TEMP_BJ1: LCALL WCOM
03CE,90 03 DE,, MOV DPTR,#BJ2 ;指针指到显示信息区
03D1,79 00,, MOV R1,#0
03D3,78 02,, MOV R0,#2
03D5,E9,BBJJ2,BBJJ2: MOV A,R1
03D6,93,, MOVC A,@A+DPTR
03D7,12 05 31,, LCALL WDATA
03DA,09,, INC R1
03DB,D8 F8,, DJNZ R0,BBJJ2
03DD,22,, RET
03DE,00 43,BJ2,BJ2: DB 00H,"C"
,,,
,,,;************************** LCD显示子程序 **********************************
03E0,75 F0 64,SHOW_DIG2H,SHOW_DIG2H: MOV B,#100
03E3,84,, DIV AB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -