📄 18b20.lst
字号:
Interrupt Vectors
00000 940C 0037 JMP __start|__text_start
Program Code (text area)
__start|__text_start:
00037 E5CF LDI R28,0x5F
00038 E0D4 LDI R29,4
00039 BFCD OUT 0x3D,R28
0003A BFDE OUT 0x3E,R29
0003B 51CE SUBI R28,0x1E
0003C 40D0 SBCI R29,0
0003D EA0A LDI R16,0xAA
0003E 8308 ST Y,R16
0003F 2400 CLR R0
00040 E7E9 LDI R30,0x79
00041 E0F0 LDI R31,0
00042 E010 LDI R17,0
00043 37EB CPI R30,0x7B
00044 07F1 CPC R31,R17
00045 F011 BEQ 0x0048
00046 9201 ST Z+,R0
00047 CFFB RJMP 0x0043
00048 8300 ST Z,R16
00049 E5E4 LDI R30,0x54
0004A E0F0 LDI R31,0
0004B E6A0 LDI R26,0x60
0004C E0B0 LDI R27,0
0004D E010 LDI R17,0
0004E E000 LDI R16,0
0004F BF0B OUT 0x3B,R16
00050 36ED CPI R30,0x6D
00051 07F1 CPC R31,R17
00052 F021 BEQ 0x0057
00053 95C8 LPM
00054 9631 ADIW R30,1
00055 920D ST X+,R0
00056 CFF9 RJMP 0x0050
00057 940E 012C CALL _main
_exit:
00059 CFFF RJMP _exit
_Delay_1ms:
j --> R20
x --> R22
i --> R16
0005A 940E 0176 CALL push_xgsetF000
0005C 2744 CLR R20
0005D 2755 CLR R21
0005E C00C RJMP 0x006B
0005F 2766 CLR R22
00060 2777 CLR R23
00061 C002 RJMP 0x0064
00062 5F6F SUBI R22,0xFF
00063 4F7F SBCI R23,0xFF
00064 E785 LDI R24,0x75
00065 E094 LDI R25,4
00066 1786 CP R24,R22
00067 0797 CPC R25,R23
00068 F7C8 BCC 0x0062
00069 5F4F SUBI R20,0xFF
0006A 4F5F SBCI R21,0xFF
0006B 1740 CP R20,R16
0006C 0751 CPC R21,R17
0006D F388 BCS 0x005F
0006E 940C 017B JMP pop_xgsetF000
FILE: F:\51&av配套光盘\51&avr配套程序\avr程序\24.DS18b20\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004)
(0005) /*************************************************************************
(0006) ds18b20头文件
(0007) M16 内部8M
(0008) *************************************************************************/
(0009) #define CLR_DIR_1WIRE DDRD&=~BIT(7) //只要修改这里的参数就可以了!呵呵!
(0010) #define SET_DIR_1WIRE DDRD|=BIT(7) //里面什么都不用该!
(0011) #define CLR_OP_1WIRE PORTD&=~BIT(7)
(0012) #define SET_OP_1WIRE PORTD|=BIT(7)
(0013) #define CHECK_IP_1WIRE (PIND & 0x80) //检测
(0014)
(0015)
(0016) unsigned char wmh,wml;
(0017)
(0018)
(0019) /*-----------------------------------------------------------------------
(0020) 延时函数
(0021) 系统时钟:8M
(0022) -----------------------------------------------------------------------*/
(0023) void delay_1us(void) //1us延时函数
(0024) {
(0025) asm("nop");
_delay_1us:
00070 0000 NOP
00071 9508 RET
_delay_nus:
i --> R20
n --> R10
00072 940E 016C CALL push_xgset300C
00074 0158 MOVW R10,R16
(0026) }
(0027)
(0028) void delay_nus(unsigned int n) //N us延时函数
(0029) {
(0030) unsigned int i=0;
(0031) for (i=0;i<n;i++)
00075 2744 CLR R20
00076 2755 CLR R21
00077 C003 RJMP 0x007B
(0032) delay_1us();
00078 DFF7 RCALL _delay_1us
00079 5F4F SUBI R20,0xFF
0007A 4F5F SBCI R21,0xFF
0007B 154A CP R20,R10
0007C 055B CPC R21,R11
0007D F3D0 BCS 0x0078
0007E 940C 0171 JMP pop_xgset300C
(0033) }
(0034)
(0035) void delay_1ms(void) //1ms延时函数
(0036) {
(0037) unsigned int i;
(0038) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
00080 2700 CLR R16
00081 2711 CLR R17
00082 C002 RJMP 0x0085
00083 5F0F SUBI R16,0xFF
00084 4F1F SBCI R17,0xFF
00085 3704 CPI R16,0x74
00086 E0E4 LDI R30,4
00087 071E CPC R17,R30
00088 F3D0 BCS 0x0083
00089 9508 RET
_delay_nms:
i --> R20
n --> R10
0008A 940E 016C CALL push_xgset300C
0008C 0158 MOVW R10,R16
(0039) }
(0040)
(0041) void delay_nms(unsigned int n) //N ms延时函数
(0042) {
(0043) unsigned int i=0;
(0044) for (i=0;i<n;i++)
0008D 2744 CLR R20
0008E 2755 CLR R21
0008F C003 RJMP 0x0093
(0045) delay_1ms();
00090 DFEF RCALL _delay_1ms
00091 5F4F SUBI R20,0xFF
00092 4F5F SBCI R21,0xFF
00093 154A CP R20,R10
00094 055B CPC R21,R11
00095 F3D0 BCS 0x0090
00096 940C 0171 JMP pop_xgset300C
(0046) }
(0047)
(0048)
(0049) void init_1820()
(0050) {
(0051) SET_DIR_1WIRE; //设置PC2 为输出
_init_1820:
00098 9A8F SBI 0x11,7
(0052) SET_OP_1WIRE;
00099 9A97 SBI 0x12,7
(0053) CLR_OP_1WIRE;
0009A 9897 CBI 0x12,7
(0054) delay_nus(480); //480us以上
0009B EE00 LDI R16,0xE0
0009C E011 LDI R17,1
0009D DFD4 RCALL _delay_nus
(0055) SET_OP_1WIRE;
0009E 9A97 SBI 0x12,7
(0056) CLR_DIR_1WIRE;
0009F 988F CBI 0x11,7
(0057) delay_nus(20); //15~60us
000A0 E104 LDI R16,0x14
000A1 E010 LDI R17,0
000A2 DFCF RCALL _delay_nus
(0058) while(CHECK_IP_1WIRE);
000A3 9987 SBIC 0x10,7
000A4 CFFE RJMP 0x00A3
(0059) SET_DIR_1WIRE;
000A5 9A8F SBI 0x11,7
(0060) SET_OP_1WIRE;
000A6 9A97 SBI 0x12,7
(0061) delay_nus(140); //60~240us
000A7 E80C LDI R16,0x8C
000A8 E010 LDI R17,0
000A9 CFC8 RJMP _delay_nus
_write_1820:
m --> R20
x --> R10
000AA 92AA ST -Y,R10
000AB 934A ST -Y,R20
000AC 2EA0 MOV R10,R16
(0062) }
(0063) void write_1820(unsigned char x)
(0064) {
(0065) unsigned char m;
(0066) for(m=0;m<8;m++)
000AD 2744 CLR R20
000AE C010 RJMP 0x00BF
(0067) {
(0068) CLR_OP_1WIRE;
000AF 9897 CBI 0x12,7
(0069) if(x&(1<<m)) //写数据了,先写低位的!
000B0 E001 LDI R16,1
000B1 2F14 MOV R17,R20
000B2 940E 01A0 CALL lsl8
000B4 2C2A MOV R2,R10
000B5 2220 AND R2,R16
000B6 F011 BEQ 0x00B9
(0070) SET_OP_1WIRE;
000B7 9A97 SBI 0x12,7
000B8 C001 RJMP 0x00BA
(0071) else
(0072) {CLR_OP_1WIRE;}
000B9 9897 CBI 0x12,7
(0073) delay_nus(40); //15~60us
000BA E208 LDI R16,0x28
000BB E010 LDI R17,0
000BC DFB5 RCALL _delay_nus
(0074) SET_OP_1WIRE;
000BD 9A97 SBI 0x12,7
000BE 9543 INC R20
000BF 3048 CPI R20,0x8
000C0 F370 BCS 0x00AF
(0075) }
(0076) SET_OP_1WIRE;
000C1 9A97 SBI 0x12,7
000C2 9149 LD R20,Y+
000C3 90A9 LD R10,Y+
000C4 9508 RET
_read_1820:
temp --> R10
k --> R22
n --> R20
000C5 940E 0180 CALL push_xgsetF00C
(0077) }
(0078) unsigned char read_1820()
(0079) {
(0080) unsigned char temp,k,n;
(0081) temp=0;
000C7 24AA CLR R10
(0082) for(n=0;n<8;n++)
000C8 2744 CLR R20
000C9 C018 RJMP 0x00E2
(0083) {
(0084) CLR_OP_1WIRE;
000CA 9897 CBI 0x12,7
(0085) SET_OP_1WIRE;
000CB 9A97 SBI 0x12,7
(0086) CLR_DIR_1WIRE;
000CC 988F CBI 0x11,7
(0087) k=(CHECK_IP_1WIRE); //读数据,从低位开始
000CD B360 IN R22,0x10
000CE 7860 ANDI R22,0x80
(0088) if(k)
000CF F031 BEQ 0x00D6
(0089) temp|=(1<<n);
000D0 E001 LDI R16,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -