📄 18b20.lst
字号:
__start:
__text_start:
3C E5CF LDI R28,0x5F
3D E0D4 LDI R29,4
3E BFCD OUT 0x3D,R28
3F BFDE OUT 0x3E,R29
40 51C0 SUBI R28,0x10
41 40D0 SBCI R29,0
42 EA0A LDI R16,0xAA
43 8308 STD Y+0,R16
44 2400 CLR R0
45 E8E0 LDI R30,0x80
46 E0F0 LDI R31,0
47 E010 LDI R17,0
48 38E4 CPI R30,0x84
49 07F1 CPC R31,R17
4A F011 BEQ 0x004D
4B 9201 ST R0,Z+
4C CFFB RJMP 0x0048
4D 8300 STD Z+0,R16
4E E5E8 LDI R30,0x58
4F E0F0 LDI R31,0
50 E6A0 LDI R26,0x60
51 E0B0 LDI R27,0
52 E010 LDI R17,0
53 E000 LDI R16,0
54 BF0B OUT 0x3B,R16
55 37E8 CPI R30,0x78
56 07F1 CPC R31,R17
57 F021 BEQ 0x005C
58 95C8 LPM
59 9631 ADIW R30,1
5A 920D ST R0,X+
5B CFF9 RJMP 0x0055
5C 940E 00EF CALL _main
_exit:
5E CFFF RJMP _exit
FILE: F:\单片机资料\AVR单片机\制作ds18b20\18B20\delay.c
(0001) /**********************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 www.avrvi.com **
(0005) ** Time 2007-1-31 **
(0006) ***********************************/
(0007) #include "config.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015) asm("nop");
_delay_1us:
5F 0000 NOP
60 9508 RET
(0016) }
(0017)
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025) unsigned int i;
(0026) for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
i --> R16
61 E706 LDI R16,0x76
62 E014 LDI R17,4
63 C002 RJMP 0x0066
64 5001 SUBI R16,1
65 4010 SBCI R17,0
66 3000 CPI R16,0
67 0701 CPC R16,R17
68 F7D9 BNE 0x0064
69 9508 RET
_delay_1s:
i --> R20
6A 934A ST R20,-Y
6B 935A ST R21,-Y
(0027) ;
(0028) }
(0029)
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036) unsigned int i;
(0037) for(i=250;i>0;i--) //250ms*4=1000ms
6C EF4A LDI R20,0xFA
6D E050 LDI R21,0
6E C003 RJMP 0x0072
(0038) delay_1ms();
6F DFF1 RCALL _delay_1ms
70 5041 SUBI R20,1
71 4050 SBCI R21,0
72 3040 CPI R20,0
73 0745 CPC R20,R21
74 F7D1 BNE 0x006F
(0039) for(i=250;i>0;i--)
75 EF4A LDI R20,0xFA
76 E050 LDI R21,0
77 C003 RJMP 0x007B
(0040) delay_1ms();
78 DFE8 RCALL _delay_1ms
79 5041 SUBI R20,1
7A 4050 SBCI R21,0
7B 3040 CPI R20,0
7C 0745 CPC R20,R21
7D F7D1 BNE 0x0078
(0041) for(i=250;i>0;i--)
7E EF4A LDI R20,0xFA
7F E050 LDI R21,0
80 C003 RJMP 0x0084
(0042) delay_1ms();
81 DFDF RCALL _delay_1ms
82 5041 SUBI R20,1
83 4050 SBCI R21,0
84 3040 CPI R20,0
85 0745 CPC R20,R21
86 F7D1 BNE 0x0081
(0043) for(i=250;i>0;i--)
87 EF4A LDI R20,0xFA
88 E050 LDI R21,0
89 C003 RJMP 0x008D
(0044) delay_1ms();
8A DFD6 RCALL _delay_1ms
8B 5041 SUBI R20,1
8C 4050 SBCI R21,0
8D 3040 CPI R20,0
8E 0745 CPC R20,R21
8F F7D1 BNE 0x008A
90 9159 LD R21,Y+
91 9149 LD R20,Y+
92 9508 RET
_delay_us:
i --> R20
n --> R10
93 940E 02B2 CALL push_xgset300C
95 0158 MOVW R10,R16
(0045) }
(0046)
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052) unsigned int i;
(0053) for(i=n;i>0;i--)
96 01A5 MOVW R20,R10
97 C003 RJMP 0x009B
(0054) delay_1us();
98 DFC6 RCALL _delay_1us
99 5041 SUBI R20,1
9A 4050 SBCI R21,0
9B 3040 CPI R20,0
9C 0745 CPC R20,R21
9D F7D1 BNE 0x0098
9E 940C 02B7 JMP pop_xgset300C
_delay_ms:
i --> R20
n --> R10
A0 940E 02B2 CALL push_xgset300C
A2 0158 MOVW R10,R16
(0055) }
(0056)
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062) unsigned int i;
(0063) for(i=n;i>0;i--)
A3 01A5 MOVW R20,R10
A4 C003 RJMP 0x00A8
(0064) delay_1ms();
A5 DFBB RCALL _delay_1ms
A6 5041 SUBI R20,1
A7 4050 SBCI R21,0
A8 3040 CPI R20,0
A9 0745 CPC R20,R21
AA F7D1 BNE 0x00A5
AB 940C 02B7 JMP pop_xgset300C
_delay_s:
j --> R20
i --> R22
n --> R10
AD 940E 02BC CALL push_xgsetF00C
AF 0158 MOVW R10,R16
(0065) }
(0066)
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072) unsigned int i,j;
(0073) for(j=n;j>0;j--)
B0 01A5 MOVW R20,R10
B1 C026 RJMP 0x00D8
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
B2 EF6A LDI R22,0xFA
B3 E070 LDI R23,0
B4 C003 RJMP 0x00B8
(0076) delay_1ms();
B5 DFAB RCALL _delay_1ms
B6 5061 SUBI R22,1
B7 4070 SBCI R23,0
B8 3060 CPI R22,0
B9 0767 CPC R22,R23
BA F7D1 BNE 0x00B5
(0077) for(i=250;i>0;i--)
BB EF6A LDI R22,0xFA
BC E070 LDI R23,0
BD C003 RJMP 0x00C1
(0078) delay_1ms();
BE DFA2 RCALL _delay_1ms
BF 5061 SUBI R22,1
C0 4070 SBCI R23,0
C1 3060 CPI R22,0
C2 0767 CPC R22,R23
C3 F7D1 BNE 0x00BE
(0079) for(i=250;i>0;i--)
C4 EF6A LDI R22,0xFA
C5 E070 LDI R23,0
C6 C003 RJMP 0x00CA
(0080) delay_1ms();
C7 DF99 RCALL _delay_1ms
C8 5061 SUBI R22,1
C9 4070 SBCI R23,0
CA 3060 CPI R22,0
CB 0767 CPC R22,R23
CC F7D1 BNE 0x00C7
(0081) for(i=250;i>0;i--)
CD EF6A LDI R22,0xFA
CE E070 LDI R23,0
CF C003 RJMP 0x00D3
(0082) delay_1ms();
D0 DF90 RCALL _delay_1ms
D1 5061 SUBI R22,1
D2 4070 SBCI R23,0
D3 3060 CPI R22,0
D4 0767 CPC R22,R23
D5 F7D1 BNE 0x00D0
D6 5041 SUBI R20,1
D7 4050 SBCI R21,0
D8 3040 CPI R20,0
D9 0745 CPC R20,R21
DA F6B9 BNE 0x00B2
DB 940C 02C3 JMP pop_xgsetF00C
FILE: F:\单片机资料\AVR单片机\制作ds18b20\18B20\main.c
(0001) // ICC-AVR application builder : 2007-2-14 21:34:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 18B20 演示程序
(0005)
(0006) #include "config.h"
(0007)
(0008) extern unsigned char count;
(0009)
(0010) void port_init(void)
(0011) {
(0012) PORTA = 0x00;
_port_init:
DD 2422 CLR R2
DE BA2B OUT 0x1B,R2
(0013) DDRA = 0x00;
DF BA2A OUT 0x1A,R2
(0014) PORTB = 0x00;
E0 BA28 OUT 0x18,R2
(0015) DDRB = 0x00;
E1 BA27 OUT 0x17,R2
(0016) PORTC = 0x00; //m103 output only
E2 BA25 OUT 0x15,R2
(0017) DDRC = 0x00;
E3 BA24 OUT 0x14,R2
(0018) PORTD = 0x00;
E4 BA22 OUT 0x12,R2
(0019) DDRD = 0x00;
E5 BA21 OUT 0x11,R2
E6 9508 RET
(0020) }
(0021)
(0022) //call this routine to initialize all peripherals
(0023) void init_devices(void)
(0024) {
(0025) //stop errant interrupts until set up
(0026) CLI(); //disable all interrupts
_init_devices:
E7 94F8 BCLR 7
(0027) port_init();
E8 DFF4 RCALL _port_init
(0028)
(0029) MCUCR = 0x00;
E9 2422 CLR R2
EA BE25 OUT 0x35,R2
(0030) GICR = 0x00;
EB BE2B OUT 0x3B,R2
(0031) TIMSK = 0x00; //timer interrupt sources
EC BE29 OUT 0x39,R2
(0032) SEI(); //re-enable interrupts
ED 9478 BSET 7
EE 9508 RET
(0033) //all peripherals are now initialized
(0034) }
(0035)
(0036) void main(void)
(0037) {
(0038) unsigned int temp1;
(0039) init_devices();
_main:
temp1 --> Y,+1
EF DFF7 RCALL _init_devices
F0 C008 RJMP 0x00F9
(0040) while(1)
(0041) {
(0042) gettemp();
F1 940E 014F CALL _gettemp
(0043) display(count,0); //补零模式显示温度
F3 2722 CLR R18
F4 9100 0080 LDS R16,count
F6 2711 CLR R17
F7 940E 01F2 CALL _display
F9 CFF7 RJMP 0x00F1
FA 9508 RET
FILE: F:\单片机资料\AVR单片机\制作ds18b20\18B20\18b20.c
(0001) /**************************************
(0002) ** Filename: 18b20.c
(0003) ** Describe: 18b20 温度传感器
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time : 2007-2-15
(0006) **************************************/
(0007)
(0008) #include "config.h"
(0009)
(0010) unsigned char wmh,wml,flag,count; //flag温度为负标志,count为实际温度
(0011) void init_1820(void)
(0012) {
(0013) SET_DIR_1WIRE; //设置PC2 为输出
_init_1820:
FB 9ABC SBI 0x17,4
(0014) SET_OP_1WIRE;
FC 9AC4 SBI 0x18,4
(0015) CLR_OP_1WIRE;
FD 98C4 CBI 0x18,4
(0016) delay_us(480); //480us以上
FE EE00 LDI R16,0xE0
FF E011 LDI R17,1
100 940E 0093 CALL _delay_us
(0017) SET_OP_1WIRE;
102 9AC4 SBI 0x18,4
(0018) CLR_DIR_1WIRE;
103 98BC CBI 0x17,4
(0019) delay_us(20); //15~60us
104 E104 LDI R16,0x14
105 E010 LDI R17,0
106 940E 0093 CALL _delay_us
(0020) while(CHECK_IP_1WIRE);
108 99B4 SBIC 0x16,4
109 CFFE RJMP 0x0108
(0021) SET_DIR_1WIRE;
10A 9ABC SBI 0x17,4
(0022) SET_OP_1WIRE;
10B 9AC4 SBI 0x18,4
(0023) delay_us(140); //60~240us
10C E80C LDI R16,0x8C
10D E010 LDI R17,0
10E 940C 0093 JMP _delay_us
_write_1820:
m --> R20
x --> R10
110 92AA ST R10,-Y
111 934A ST R20,-Y
112 2EA0 MOV R10,R16
(0024) }
(0025) void write_1820(unsigned char x)
(0026) {
(0027) unsigned char m;
(0028) for(m=0;m<8;m++)
113 2744 CLR R20
114 C011 RJMP 0x0126
(0029) {
(0030) CLR_OP_1WIRE;
115 98C4 CBI 0x18,4
(0031) if(x&(1<<m)) //写数据了,先写低位的!
116 E001 LDI R16,1
117 2F14 MOV R17,R20
118 940E 0307 CALL lsl8
11A 2C2A MOV R2,R10
11B 2220 AND R2,R16
11C F011 BEQ 0x011F
(0032) SET_OP_1WIRE;
11D 9AC4 SBI 0x18,4
11E C001 RJMP 0x0120
(0033) else
(0034) {CLR_OP_1WIRE;}
11F 98C4 CBI 0x18,4
(0035) delay_us(40); //15~60us
120 E208 LDI R16,0x28
121 E010 LDI R17,0
122 940E 0093 CALL _delay_us
(0036) SET_OP_1WIRE;
124 9AC4 SBI 0x18,4
125 9543 INC R20
126 3048 CPI R20,0x8
127 F368 BCS 0x0115
(0037) }
(0038) SET_OP_1WIRE;
128 9AC4 SBI 0x18,4
129 9149 LD R20,Y+
12A 90A9 LD R10,Y+
12B 9508 RET
_read_1820:
temp --> R10
k --> R22
n --> R20
12C 940E 02BC CALL push_xgsetF00C
(0039) }
(0040) unsigned char read_1820(void)
(0041) {
(0042) unsigned char temp,k,n;
(0043) temp=0;
12E 24AA CLR R10
(0044) for(n=0;n<8;n++)
12F 2744 CLR R20
130 C019 RJMP 0x014A
(0045) {
(0046) CLR_OP_1WIRE;
131 98C4 CBI 0x18,4
(0047) SET_OP_1WIRE;
132 9AC4 SBI 0x18,4
(0048) CLR_DIR_1WIRE;
133 98BC CBI 0x17,4
(0049) k=(CHECK_IP_1WIRE); //读数据,从低位开始
134 B366 IN R22,0x16
135 7160 ANDI R22,0x10
(0050) if(k)
136 F031 BEQ 0x013D
(0051) temp|=(1<<n);
137 E001 LDI R16,1
138 2F14 MOV R17,R20
139 940E 0307 CALL lsl8
13B 2AA0 OR R10,R16
13C C007 RJMP 0x0144
(0052) else
(0053) temp&=~(1<<n);
13D E001 LDI R16,1
13E 2F14 MOV R17,R20
13F 940E 0307 CALL lsl8
141 2E20 MOV R2,R16
142 9420 COM R2
143 20A2 AND R10,R2
(0054) delay_us(50); //60~120us
144 E302 LDI R16,0x32
145 E010 LDI R17,0
146 940E 0093 CALL _delay_us
(0055) SET_DIR_1WIRE;
148 9ABC SBI 0x17,4
149 9543 INC R20
14A 3048 CPI R20,0x8
14B F328 BCS 0x0131
(0056) }
(0057) return (temp);
14C 2D0A MOV R16,R10
14D 940C 02C3 JMP pop_xgsetF00C
_gettemp:
wm3 --> R12
wm1 --> R10
wm0 --> R20
teml --> R12
wm2 --> R10
temh --> R22
14F 940E 02D8 CALL push_xgsetF03C
(0058) }
(0059)
(0060) void gettemp(void) //读取温度值
(0061) {
(0062) unsigned char temh,teml,wm0,wm1,wm2,wm3;
(0063) init_1820(); //复位18b20
151 DFA9 RCALL _init_1820
(0064) write_1820(0xcc); // 发出转换命令
152 EC0C LDI R16,0xCC
153 DFBC RCALL _write_1820
(0065) write_1820(0x44);
154 E404 LDI R16,0x44
155 DFBA RCALL _write_1820
(0066) // delay_nms(800); //不延时也好使,不知道怎么回事!
(0067) init_1820();
156 DFA4 RCALL _init_1820
(0068) write_1820(0xcc); //发出读命令
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -