📄 18b20_1602.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E7 CPI R30,0x67
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E023D CALL _main
_exit:
004A CFFF RJMP _exit
FILE: E:\DS18B20\delay.c
(0001) /****************************************
(0002) ** 文 件 名: delay.c **
(0003) ** 日 期: 2007年04月08日 **
(0004) ** 描 述: 延时函数 **
(0005) ** 作 者:tonghe **
(0006) ** 版 本: V1.0 **
(0007) ** 主控芯片:M16 **
(0008) ** 晶振频率:7.3728MHZ, 波特率9600 **
(0009) ****************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) #include <E:\DS18B20\define.h>
(0013) /****************************************
(0014) * 函数名称: void delay_us(uchar i) *
(0015) * 函数功能:延时函数 *
(0016) * 晶振频率:7.3728MHZ *
(0017) * 实际延时: *
(0018) * delay_us(1); //2.71us *
(0019) * delay_us(2); //3.53us *
(0020) * delay_us(4); //5.15us *
(0021) * delay_us(8); //8.41us *
(0022) * delay_us(16); //14.92us *
(0023) * delay_us(32); //27.94us *
(0024) * delay_us(64); //53.98us *
(0025) * delay_us(128); //106.07us *
(0026) * delay_us(255); //209.42us *
(0027) * delay_us(100); //83.28us *
(0028) * _NOP(); //0.14us *
(0029) ****************************************/
(0030) void delay_us(uint i)
(0031) {
(0032) while(i--);
_delay_us:
i --> R16
004B 0118 MOVW R2,R16
004C 5001 SUBI R16,1
004D 4010 SBCI R17,0
004E 2022 TST R2
004F F7D9 BNE 0x004B
0050 2033 TST R3
0051 F7C9 BNE 0x004B
0052 9508 RET
_delay_ms:
a --> R20
i --> R16
0053 940E02A9 CALL push_gset1
(0033) }
(0034)
(0035) /****************************************
(0036) * 函数名称: void delay_ms(uint i) *
(0037) * 函数功能:延时函数 *
(0038) * 晶振频率:7.3728MHZ *
(0039) * 实际延时:i mS *
(0040) ****************************************/
(0041) void delay_ms(uint i)
(0042) {
(0043) uint a;
(0044) for(;i;i--)
0055 C00A RJMP 0x0060
(0045) {
(0046) for(a=1220;a;a--)
0056 EC44 LDI R20,0xC4
0057 E054 LDI R21,4
0058 C002 RJMP 0x005B
0059 5041 SUBI R20,1
005A 4050 SBCI R21,0
005B 3040 CPI R20,0
005C 0745 CPC R20,R21
005D F7D9 BNE 0x0059
005E 5001 SUBI R16,1
005F 4010 SBCI R17,0
0060 3000 CPI R16,0
0061 0701 CPC R16,R17
0062 F799 BNE 0x0056
0063 940E02AC CALL pop_gset1
0065 9508 RET
FILE: E:\DS18B20\initial.c
(0001) /****************************************
(0002) ** 文 件 名: initial.c **
(0003) ** 日 期: 2007年04月08日 **
(0004) ** 描 述: 端口初始化函数 **
(0005) ** 作 者:tonghe **
(0006) ** 版 本: V1.0 **
(0007) ** 主控芯片:M16 **
(0008) ** 晶振频率:7.3728MHZ, 波特率9600 **
(0009) ****************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012)
(0013) void port_init(void)
(0014) {
(0015) PORTA = 0b00000010;
_port_init:
0066 E082 LDI R24,2
0067 BB8B OUT 0x1B,R24
(0016) DDRA = 0b11111101;
0068 EF8D LDI R24,0xFD
0069 BB8A OUT 0x1A,R24
(0017) PORTB = 0b00000000;
006A 2422 CLR R2
006B BA28 OUT 0x18,R2
(0018) DDRB = 0b11111111; //输出
006C EF8F LDI R24,0xFF
006D BB87 OUT 0x17,R24
(0019) PORTC = 0xFF;
006E BB85 OUT 0x15,R24
(0020) DDRC = 0b00000000; //输出
006F BA24 OUT 0x14,R2
(0021) DDRD = 0b11100000;
0070 EE80 LDI R24,0xE0
0071 BB81 OUT 0x11,R24
(0022) PORTD = 0b00001100;
0072 E08C LDI R24,0xC
0073 BB82 OUT 0x12,R24
0074 9508 RET
_rst_DS18B20:
errTime --> R20
0075 940E02A9 CALL push_gset1
FILE: E:\DS18B20\ds18b20.h
(0001) /****************************************
(0002) ** 文 件 名: DS18B20.c **
(0003) ** 日 期: 2007年04月08日 **
(0004) ** 描 述: DS18B20函数 **
(0005) ** 作 者:tonghe **
(0006) ** 版 本: V1.0 **
(0007) ** 主控芯片:M16 **
(0008) ** 晶振频率:7.3728MHZ, 波特率9600 **
(0009) ****************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) #include <E:\DS18B20\define.h>
(0013) #include <E:\DS18B20\function.h>
(0014)
(0015) /****************************************
(0016) * 函数名称: uchar rst_DS18B20(void) *
(0017) * 函数功能:DS18B20初始化 *
(0018) * 入 口:无 *
(0019) * 返 回:0x00为失败,0xFF为成功 *
(0020) ****************************************/
(0021) uchar rst_DS18B20(void)
(0022) {
(0023) uchar errTime=0;
0077 2744 CLR R20
(0024) RLS_DS18B20; //释放总线
0078 988D CBI 0x11,5
(0025) _NOP();
0079 0000 NOP
(0026) HLD_DS18B20; //Maga16控制总线
007A 9A8D SBI 0x11,5
(0027) CLR_DS18B20; //强制拉低
007B 9895 CBI 0x12,5
(0028) delay_us(255); //209.42us
007C EF0F LDI R16,0xFF
007D E010 LDI R17,0
007E 940E004B CALL _delay_us
(0029) delay_us(255); //209.42us
0080 EF0F LDI R16,0xFF
0081 E010 LDI R17,0
0082 940E004B CALL _delay_us
(0030) delay_us(255); //83.28us
0084 EF0F LDI R16,0xFF
0085 E010 LDI R17,0
0086 940E004B CALL _delay_us
(0031) //以上的三个延时大于480us
(0032) RLS_DS18B20; //释放总线,总线自动上拉
0088 988D CBI 0x11,5
(0033) _NOP();
0089 0000 NOP
008A C00A RJMP 0x0095
(0034) while(STU_DS18B20)
(0035) {
(0036) delay_us(4); //5.15us
008B E004 LDI R16,4
008C E010 LDI R17,0
008D 940E004B CALL _delay_us
(0037) errTime++;
008F 9543 INC R20
(0038) if(errTime>20)
0090 E184 LDI R24,0x14
0091 1784 CP R24,R20
0092 F410 BCC 0x0095
(0039) return(0x00); //如果等大于5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
0093 2700 CLR R16
0094 C011 RJMP 0x00A6
0095 9985 SBIC 0x10,5
0096 CFF4 RJMP 0x008B
(0040) }
(0041) errTime=0;
0097 2744 CLR R20
0098 C00A RJMP 0x00A3
(0042) while(!(STU_DS18B20))
(0043) {
(0044) delay_us(4); //5.15us
0099 E004 LDI R16,4
009A E010 LDI R17,0
009B 940E004B CALL _delay_us
(0045) errTime++;
009D 9543 INC R20
(0046) if(errTime>50)
009E E382 LDI R24,0x32
009F 1784 CP R24,R20
00A0 F410 BCC 0x00A3
(0047) return(0x00); //如果等大于5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
00A1 2700 CLR R16
00A2 C003 RJMP 0x00A6
00A3 9B85 SBIS 0x10,5
00A4 CFF4 RJMP 0x0099
(0048) }
(0049) return(0xff);
00A5 EF0F LDI R16,0xFF
00A6 940E02AC CALL pop_gset1
00A8 9508 RET
_read_DS18B20:
retVal --> R20
i --> R22
00A9 940E02A7 CALL push_gset2
(0050) }
(0051)
(0052) /****************************************
(0053) * 函数名称: uchar read_DS18B20(void) *
(0054) * 函数功能:读DS18B20一个字节 *
(0055) * 入 口:无 *
(0056) * 返 回:读出的数据字节 *
(0057) ****************************************/
(0058) uchar read_DS18B20(void)
(0059) {
(0060) uchar i;
(0061) uchar retVal=0;
00AB 2744 CLR R20
(0062) RLS_DS18B20; //释放总线
00AC 988D CBI 0x11,5
(0063) for(i=8;i>0;i--)
00AD E068 LDI R22,0x8
00AE C01D RJMP 0x00CC
(0064) {
(0065) retVal>>=1;
00AF 9546 LSR R20
(0066) HLD_DS18B20; //Maga16控制总线
00B0 9A8D SBI 0x11,5
(0067) CLR_DS18B20; //强制拉低
00B1 9895 CBI 0x12,5
(0068) delay_us(5); //延时大于1us
00B2 E005 LDI R16,5
00B3 E010 LDI R17,0
00B4 940E004B CALL _delay_us
(0069) RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
00B6 988D CBI 0x11,5
(0070) delay_us(2);
00B7 E002 LDI R16,2
00B8 E010 LDI R17,0
00B9 940E004B CALL _delay_us
(0071) if(STU_DS18B20)
00BB 9B85 SBIS 0x10,5
00BC C001 RJMP 0x00BE
(0072) retVal|=0x80;
00BD 6840 ORI R20,0x80
(0073) delay_us(16); //14.92us
00BE E100 LDI R16,0x10
00BF E010 LDI R17,0
00C0 940E004B CALL _delay_us
(0074) delay_us(16); //14.92us
00C2 E100 LDI R16,0x10
00C3 E010 LDI R17,0
00C4 940E004B CALL _delay_us
(0075) RLS_DS18B20; //释放总线
00C6 988D CBI 0x11,5
(0076) delay_us(35); //30.38us
00C7 E203 LDI R16,0x23
00C8 E010 LDI R17,0
00C9 940E004B CALL _delay_us
00CB 956A DEC R22
00CC E080 LDI R24,0
00CD 1786 CP R24,R22
00CE F300 BCS 0x00AF
(0077) }
(0078) delay_us(2); //2.71us(大于1us就行了)
00CF E002 LDI R16,2
00D0 E010 LDI R17,0
00D1 940E004B CALL _delay_us
(0079) return(retVal);
00D3 2F04 MOV R16,R20
00D4 940E029B CALL pop_gset2
00D6 9508 RET
_write_DS18B20:
temp --> R20
i --> R22
wb --> R10
00D7 940E02A5 CALL push_gset3
00D9 2EA0 MOV R10,R16
(0080) }
(0081)
(0082) /****************************************
(0083) * 函数名称: uchar write_DS18B20(void) *
(0084) * 函数功能:写DS18B20一个字节 *
(0085) * 入 口:需写入的字节数据wb *
(0086) * 返 回:无 *
(0087) ****************************************/
(0088) void write_DS18B20(uchar wb)
(0089) {
(0090) uchar i;
(0091) uchar temp;
(0092) RLS_DS18B20; //释放总线
00DA 988D CBI 0x11,5
(0093) for(i=0;i<8;i++)
00DB 2766 CLR R22
00DC C01E RJMP 0x00FB
(0094) {
(0095) HLD_DS18B20; //Maga16控制总线
00DD 9A8D SBI 0x11,5
(0096) CLR_DS18B20; //强制拉低
00DE 9895 CBI 0x12,5
(0097) delay_us(16); //14.92us
00DF E100 LDI R16,0x10
00E0 E010 LDI R17,0
00E1 940E004B CALL _delay_us
(0098) temp=wb>>i;
00E3 2D0A MOV R16,R10
00E4 2F16 MOV R17,R22
00E5 940E02C0 CALL lsr8
00E7 2F40 MOV R20,R16
(0099) temp&=0x01;
00E8 7041 ANDI R20,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -