📄 ds18b20.lst
字号:
__text_start:
__start:
0026 E5CF LDI R28,0x5F
0027 E0D4 LDI R29,4
0028 BFCD OUT 0x3D,R28
0029 BFDE OUT 0x3E,R29
002A 51C0 SUBI R28,0x10
002B 40D0 SBCI R29,0
002C EA0A LDI R16,0xAA
002D 8308 STD Y+0,R16
002E 2400 CLR R0
002F E7E0 LDI R30,0x70
0030 E0F0 LDI R31,0
0031 E010 LDI R17,0
0032 37E0 CPI R30,0x70
0033 07F1 CPC R31,R17
0034 F011 BEQ 0x0037
0035 9201 ST R0,Z+
0036 CFFB RJMP 0x0032
0037 8300 STD Z+0,R16
0038 E3EC LDI R30,0x3C
0039 E0F0 LDI R31,0
003A E6A0 LDI R26,0x60
003B E0B0 LDI R27,0
003C E010 LDI R17,0
003D 34EC CPI R30,0x4C
003E 07F1 CPC R31,R17
003F F021 BEQ 0x0044
0040 95C8 LPM
0041 9631 ADIW R30,1
0042 920D ST R0,X+
0043 CFF9 RJMP 0x003D
0044 D0A6 RCALL _main
_exit:
0045 CFFF RJMP _exit
_reset_ov:
c --> R20
0046 D1B5 RCALL push_gset1
FILE: D:\开发板\source\ds18b20\dsi8b20.c
(0001) /******************************************/
(0002) /* 北京MCU学习之家 */
(0003) /* ADC通信演示程序 */
(0004) /* 作者:白如冰 */
(0005) /* 2005年10月1日 */
(0006) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0007) /******************************************/
(0008) // 1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
(0009) // 2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
(0010) #include <iom8v.h>
(0011) #include <macros.h>
(0012) extern void delay_us(unsigned int n);
(0013) extern void delay_ms(unsigned int n);
(0014) extern void uart_init(void);
(0015) extern void putchar(unsigned char c);
(0016) extern void puts(char *s);
(0017) extern void puts_hh(char *s);
(0018)
(0019) #define ds1820_data_s PORTD|=BIT(PORTD6)
(0020) #define ds1820_data_c PORTD&=~BIT(PORTD6)
(0021)
(0022)
(0023) unsigned char reset_ov(void) //18b20 复位函数
(0024) {
(0025) char c=0;
0047 2744 CLR R20
(0026) ds1820_data_s;
0048 9A96 SBI 0x12,6
(0027) delay_us(1);//6
0049 E001 LDI R16,1
004A E010 LDI R17,0
004B D131 RCALL _delay_us
(0028) ds1820_data_c;
004C 9896 CBI 0x12,6
(0029) delay_us(660);//500
004D E904 LDI R16,0x94
004E E012 LDI R17,2
004F D12D RCALL _delay_us
(0030) ds1820_data_s;
0050 9A96 SBI 0x12,6
(0031) delay_us(73);//60us
0051 E409 LDI R16,0x49
0052 E010 LDI R17,0
0053 D129 RCALL _delay_us
(0032) c=(PIND&=0x40);//dq_in;
0054 B380 IN R24,0x10
0055 7480 ANDI R24,0x40
0056 BB80 OUT 0x10,R24
0057 2F48 MOV R20,R24
(0033) if(c==0x40)
0058 3480 CPI R24,0x40
0059 F411 BNE 0x005C
(0034) return (0);
005A 2700 CLR R16
005B C004 RJMP 0x0060
(0035) else
(0036) {
(0037) delay_us(326);//250
005C E406 LDI R16,0x46
005D E011 LDI R17,1
005E D11E RCALL _delay_us
(0038) return (1);
005F E001 LDI R16,1
0060 D19E RCALL pop_gset1
0061 9508 RET
_write_data:
temp --> R20
i --> R22
data --> R10
0062 D195 RCALL push_gset3
0063 2EA0 MOV R10,R16
(0039) }
(0040) }
(0041)
(0042) void write_data(unsigned char data) //DS18B20写函数
(0043) {
(0044) unsigned char i,temp;
(0045) temp=data;
0064 2D4A MOV R20,R10
(0046)
(0047) for (i=0; i<8; i++)
0065 2766 CLR R22
0066 C016 RJMP 0x007D
(0048) {
(0049) if((temp&0x01)&&0x01)
0067 FF40 SBRS R20,0
0068 C009 RJMP 0x0072
(0050) {
(0051) ds1820_data_c;
0069 9896 CBI 0x12,6
(0052) delay_us(6);//10
006A E006 LDI R16,6
006B E010 LDI R17,0
006C D110 RCALL _delay_us
(0053) ds1820_data_s;
006D 9A96 SBI 0x12,6
(0054) delay_us(73);//60
006E E409 LDI R16,0x49
006F E010 LDI R17,0
0070 D10C RCALL _delay_us
(0055) }
0071 C008 RJMP 0x007A
(0056) else
(0057) {
(0058) ds1820_data_c;
0072 9896 CBI 0x12,6
(0059) delay_us(80);//70
0073 E500 LDI R16,0x50
0074 E010 LDI R17,0
0075 D107 RCALL _delay_us
(0060) ds1820_data_s;
0076 9A96 SBI 0x12,6
(0061) delay_us(1);//6
0077 E001 LDI R16,1
0078 E010 LDI R17,0
0079 D103 RCALL _delay_us
(0062) }
(0063) data>>=1;
007A 94A6 LSR R10
(0064) temp=data;
007B 2D4A MOV R20,R10
007C 9563 INC R22
007D 3068 CPI R22,0x8
007E F340 BCS 0x0067
007F D172 RCALL pop_gset3
0080 9508 RET
_read_data:
value --> R20
i --> R22
0081 D178 RCALL push_gset2
(0065) }
(0066)
(0067) }
(0068)
(0069) unsigned char read_data(void) //DS18B20 读函数
(0070) {
(0071) unsigned char i;
(0072)
(0073) char value = 0;
0082 2744 CLR R20
(0074) for (i=0;i<8;i++)
0083 2766 CLR R22
0084 C013 RJMP 0x0098
(0075) {
(0076) value>>=1;
0085 9546 LSR R20
(0077) ds1820_data_c;
0086 9896 CBI 0x12,6
(0078) delay_us(1);//6
0087 E001 LDI R16,1
0088 E010 LDI R17,0
0089 D0F3 RCALL _delay_us
(0079) ds1820_data_s;
008A 9A96 SBI 0x12,6
(0080) delay_us(1); //6
008B E001 LDI R16,1
008C E010 LDI R17,0
008D D0EF RCALL _delay_us
(0081)
(0082)
(0083) if((PIND&=0x40)==0x40)
008E B380 IN R24,0x10
008F 7480 ANDI R24,0x40
0090 BB80 OUT 0x10,R24
0091 3480 CPI R24,0x40
0092 F409 BNE 0x0094
(0084) value|=0x80;
0093 6840 ORI R20,0x80
(0085) delay_us(73);//60
0094 E409 LDI R16,0x49
0095 E010 LDI R17,0
0096 D0E6 RCALL _delay_us
0097 9563 INC R22
0098 3068 CPI R22,0x8
0099 F358 BCS 0x0085
(0086) }
(0087)
(0088)
(0089) return(value);
009A 2F04 MOV R16,R20
009B D154 RCALL pop_gset2
009C 9508 RET
_init_ds1820:
i --> R20
009D D15E RCALL push_gset1
(0090) }
(0091)
(0092) void init_ds1820(void)
(0093) {
(0094) unsigned char i;
(0095) for(i=0;i<40;i++)
009E 2744 CLR R20
009F C005 RJMP 0x00A5
(0096) {if(reset_ov())
00A0 DFA5 RCALL _reset_ov
00A1 2300 TST R16
00A2 F009 BEQ 0x00A4
(0097) break;
00A3 C003 RJMP 0x00A7
00A4 9543 INC R20
00A5 3248 CPI R20,0x28
00A6 F3C8 BCS 0x00A0
(0098) }
(0099)
(0100) write_data(0xcc); //跳过ROM
00A7 EC0C LDI R16,0xCC
00A8 DFB9 RCALL _write_data
(0101) write_data(0x4e); //写配置寄存器指令
00A9 E40E LDI R16,0x4E
00AA DFB7 RCALL _write_data
(0102) write_data(0x00);
00AB 2700 CLR R16
00AC DFB5 RCALL _write_data
(0103) write_data(0x00);
00AD 2700 CLR R16
00AE DFB3 RCALL _write_data
(0104) write_data(0x7f); //配置转换位数为12位,转换时间为750ms
00AF E70F LDI R16,0x7F
00B0 DFB1 RCALL _write_data
(0105) for(i=0;i<40;i++)
00B1 2744 CLR R20
00B2 C005 RJMP 0x00B8
(0106) {if(reset_ov())
00B3 DF92 RCALL _reset_ov
00B4 2300 TST R16
00B5 F009 BEQ 0x00B7
(0107) break;
00B6 C003 RJMP 0x00BA
00B7 9543 INC R20
00B8 3248 CPI R20,0x28
00B9 F3C8 BCS 0x00B3
(0108) }
(0109) write_data(0xcc);
00BA EC0C LDI R16,0xCC
00BB DFA6 RCALL _write_data
(0110) write_data(0x44); //转换命令 开始第一次转换
00BC E404 LDI R16,0x44
00BD DFA4 RCALL _write_data
00BE D140 RCALL pop_gset1
00BF 9508 RET
_read_temper:
temph --> R20
templ --> R22
x --> R20
i --> R10
00C0 D137 RCALL push_gset3
(0111) }
(0112)
(0113) //读温度值
(0114) unsigned int read_temper(void)
(0115) {
(0116) unsigned int x;
(0117) unsigned char templ,temph,i;
(0118) for(i=0;i<40;i++)
00C1 24AA CLR R10
00C2 C005 RJMP 0x00C8
(0119) {if(reset_ov())
00C3 DF82 RCALL _reset_ov
00C4 2300 TST R16
00C5 F009 BEQ 0x00C7
(0120) break;
00C6 C004 RJMP 0x00CB
00C7 94A3 INC R10
00C8 2D8A MOV R24,R10
00C9 3288 CPI R24,0x28
00CA F3C0 BCS 0x00C3
(0121) }
(0122)
(0123)
(0124) write_data(0xcc); //跳过ROM
00CB EC0C LDI R16,0xCC
00CC DF95 RCALL _write_data
(0125) write_data(0xbe); //读温度命令
00CD EB0E LDI R16,0xBE
00CE DF93 RCALL _write_data
(0126) templ=read_data();
00CF DFB1 RCALL _read_data
00D0 2F60 MOV R22,R16
(0127) temph=read_data();
00D1 DFAF RCALL _read_data
00D2 2F40 MOV R20,R16
(0128) for(i=0;i<40;i++)
00D3 24AA CLR R10
00D4 C005 RJMP 0x00DA
(0129) {if(reset_ov())
00D5 DF70 RCALL _reset_ov
00D6 2300 TST R16
00D7 F009 BEQ 0x00D9
(0130) break;
00D8 C004 RJMP 0x00DD
00D9 94A3 INC R10
00DA 2D8A MOV R24,R10
00DB 3288 CPI R24,0x28
00DC F3C0 BCS 0x00D5
(0131) }
(0132) write_data(0xcc);
00DD EC0C LDI R16,0xCC
00DE DF83 RCALL _write_data
(0133) write_data(0x44); //转换命令
00DF E404 LDI R16,0x44
00E0 DF81 RCALL _write_data
(0134) x=temph;
00E1 2755 CLR R21
(0135) x<<=8;
00E2 2F54 MOV R21,R20
00E3 2744 CLR R20
(0136) x+=templ;
00E4 2E26 MOV R2,R22
00E5 2433 CLR R3
00E6 0D42 ADD R20,R2
00E7 1D53 ADC R21,R3
(0137) return x;
00E8 018A MOVW R16,R20
00E9 D108 RCALL pop_gset3
00EA 9508 RET
_main:
temper_data --> R20
temp --> Y+0
00EB 9729 SBIW R28,0x9
(0138) }
(0139) void main(void)
(0140) {
(0141) unsigned char temp[5];
(0142) unsigned int temper_data;
(0143) DDRD=0XFF;
00EC EF8F LDI R24,0xFF
00ED BB81 OUT 0x11,R24
(0144) PORTD=0Xff;
00EE BB82 OUT 0x12,R24
(0145) uart_init();
00EF D0D6 RCALL _uart_init
(0146) init_ds1820();
00F0 DFAC RCALL _init_ds1820
00F1 C088 RJMP 0x017A
(0147)
(0148) while(1)
(0149) {
(0150) delay_ms(1000);
00F2 EE08 LDI R16,0xE8
00F3 E013 LDI R17,3
00F4 D09C RCALL _delay_ms
(0151)
(0152) temper_data=read_temper();
00F5 DFCA RCALL _read_temper
00F6 01A8 MOVW R20,R16
(0153) temper_data*=0.625;
00F7 E20E LDI R16,0x2E
00F8 E010 LDI R17,0
00F9 D122 RCALL lpm32
00FA 933A ST R19,-Y
00FB 932A ST R18,-Y
00FC 931A ST R17,-Y
00FD 930A ST R16,-Y
00FE E20A LDI R16,0x2A
00FF E010 LDI R17,0
0100 D11B RCALL lpm32
0101 933A ST R19,-Y
0102 932A ST R18,-Y
0103 931A ST R17,-Y
0104 930A ST R16,-Y
0105 018A MOVW R16,R20
0106 9516 LSR R17
0107 9507 ROR R16
0108 D165 RCALL int2fp
0109 933A ST R19,-Y
010A 932A ST R18,-Y
010B 931A ST R17,-Y
010C 930A ST R16,-Y
010D D238 RCALL empy32fs
010E 018A MOVW R16,R20
010F 7001 ANDI R16,1
0110 7010 ANDI R17,0
0111 D15C RCALL int2fp
0112 933A ST R19,-Y
0113 932A ST R18,-Y
0114 931A ST R17,-Y
0115 930A ST R16,-Y
0116 D1AC RCALL add32fs
0117 D230 RCALL empy32f
0118 01FE MOVW R30,R28
0119 8305 STD Z+5,R16
011A 8316 STD Z+6,R17
011B 8327 STD Z+7,R18
011C 8730 STD Z+8,R19
011D 01FE MOVW R30,R28
011E 8025 LDD R2,Z+5
011F 8036 LDD R3,Z+6
0120 8047 LDD R4,Z+7
0121 8450 LDD R5,Z+8
0122 925A ST R5,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -