📄 18b20ok.lst
字号:
__start:
__text_start:
2A E5CF LDI R28,0x5F
2B E0D8 LDI R29,0x8
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51CE SUBI R28,0x1E
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 3DEF CPI R30,0xDF
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A 940E 02B1 CALL _main
_exit:
4C CFFF RJMP _exit
FILE: D:\cood\18b20\main.c
(0001) #include <iom32v.h>
(0002) #include <macros.h>
(0003)
(0004) #define F_CPU 7372800
(0005)
(0006) //数据类型的定义
(0007) #define uint8 unsigned char
(0008) #define uint16 unsigned int
(0009)
(0010) //位变量操作宏定义
(0011) #define BIT_SET(a,b) a|=BIT(b)
(0012) #define BIT_CLR(a,b) a&=~BIT(b)
(0013) #define BIT_INV(a,b) a^=BIT(b)
(0014) #define BIT_STATUS(a,b) a&BIT(b)
(0015)
(0016) //DS18B20操作定义
(0017) #define CLR_DS18B20 BIT_CLR(PORTA,PA0) //数据线强制拉低
(0018) #define SET_DS18B20 BIT_SET(PORTA,PA0) //数据线强制拉高,上拉
(0019) #define HLD_DS18B20 BIT_SET(DDRA,PA0) //Mega16控制总线
(0020) #define RLS_DS18B20 BIT_CLR(DDRA,PA0) //释放总线
(0021) #define STU_DS18B20 BIT_STATUS(PINA,PA0) //数据线的状态
(0022) #define bit_0_1 0x00
(0023) #define bit_0 0x01 //因为移位了,所以低在前,高位在后
(0024) #define bit_1 0x02
(0025) #define maxsize 7
(0026) unsigned char rom_seq[maxsize][8];
(0027) unsigned char B20_num;
(0028) unsigned char tep[maxsize][10];
(0029)
(0030)
(0031)
(0032) void port_init(void)
(0033) {
(0034) PORTA = 0xFF;
_port_init:
4D EF8F LDI R24,0xFF
4E BB8B OUT 0x1B,R24
(0035) DDRA = 0xFF;
4F BB8A OUT 0x1A,R24
(0036) PORTB = 0xFF;
50 BB88 OUT 0x18,R24
(0037) DDRB = 0xFF; //输出
51 BB87 OUT 0x17,R24
(0038) PORTC = 0xFF; //m103 output only
52 BB85 OUT 0x15,R24
(0039) DDRC = 0xFF; //输出
53 BB84 OUT 0x14,R24
(0040) DDRD = 0xFF;
54 BB81 OUT 0x11,R24
(0041) PORTD = 0xFF;
55 BB82 OUT 0x12,R24
56 9508 RET
(0042) }
(0043)
(0044) /**********************************************************************
(0045) functionName: void delayUs(BYTE temp)
(0046) description :延时函数 晶振频率:7.3728MHZ
(0047) delayUs(1); //2.71us
(0048) delayUs(2); //3.53us
(0049) delayUs(4); //5.15us
(0050) delayUs(8); //8.41us
(0051) delayUs(16); //14.92us
(0052) delayUs(32); //27.94us
(0053) delayUs(64); //53.98us
(0054) delayUs(128); //106.07us
(0055) delayUs(255); //209.42us
(0056) delayUs(18); //16.55us
(0057) delayUs(34); //29.57us
(0058) delayUs(35); //30.38us
(0059) delayUs(100); //83.28
(0060) _NOP(); //0.14us
(0061) **********************************************************************/
(0062) void delayUs(uint8 temp)
(0063) {
(0064) while(temp--);
_delayUs:
temp --> R16
57 2E20 MOV R2,R16
58 2433 CLR R3
59 5001 SUBI R16,1
5A 2022 TST R2
5B F7D9 BNE 0x0057
5C 9508 RET
_longdelay:
i --> R20
5D 934A ST R20,-Y
5E 935A ST R21,-Y
(0065) }
(0066)
(0067) //延时约1s
(0068) void longdelay(void)
(0069) {
(0070) unsigned int i;
(0071) for(i=4761;i!=0;i--)
5F E949 LDI R20,0x99
60 E152 LDI R21,0x12
61 C004 RJMP 0x0066
(0072) delayUs(255);
62 EF0F LDI R16,0xFF
63 DFF3 RCALL _delayUs
64 5041 SUBI R20,1
65 4050 SBCI R21,0
66 3040 CPI R20,0
67 0745 CPC R20,R21
68 F7C9 BNE 0x0062
69 9159 LD R21,Y+
6A 9149 LD R20,Y+
6B 9508 RET
_resetDS18B20:
errTime --> R10
6C 92AA ST R10,-Y
(0073) }
(0074)
(0075)
(0076) /*******************************************************************************
(0077) functionName: uint8 resetDS18B20(void)
(0078) description :DS18B20初始化
(0079) ********************************************************************************/
(0080) uint8 resetDS18B20(void)
(0081) {
(0082) uint8 errTime=0;
6D 24AA CLR R10
(0083) RLS_DS18B20; //释放总线
6E 98D0 CBI 0x1A,0
(0084) _NOP();
6F 0000 NOP
(0085) HLD_DS18B20; //Maga16控制总线
70 9AD0 SBI 0x1A,0
(0086) CLR_DS18B20; //强制拉低
71 98D8 CBI 0x1B,0
(0087) delayUs(255); //209.42us
72 EF0F LDI R16,0xFF
73 DFE3 RCALL _delayUs
(0088) delayUs(255); //209.42us
74 EF0F LDI R16,0xFF
75 DFE1 RCALL _delayUs
(0089) delayUs(255); //83.28us
76 EF0F LDI R16,0xFF
77 DFDF RCALL _delayUs
(0090) //以上的三个延时大于480us
(0091) RLS_DS18B20; //释放总线,总线自动上拉
78 98D0 CBI 0x1A,0
(0092) _NOP();
79 0000 NOP
7A C008 RJMP 0x0083
(0093) while(STU_DS18B20)
(0094) {
(0095) delayUs(4); //5.15us
7B E004 LDI R16,4
7C DFDA RCALL _delayUs
(0096) errTime++;
7D 94A3 INC R10
(0097) if(errTime>20)
7E E184 LDI R24,0x14
7F 158A CP R24,R10
80 F410 BCC 0x0083
(0098) return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
81 2700 CLR R16
82 C00F RJMP 0x0092
83 99C8 SBIC 0x19,0
84 CFF6 RJMP 0x007B
(0099) }
(0100) errTime=0;
85 24AA CLR R10
86 C008 RJMP 0x008F
(0101) while(!(STU_DS18B20))
(0102) {
(0103) delayUs(4); //5.15us
87 E004 LDI R16,4
88 DFCE RCALL _delayUs
(0104) errTime++;
89 94A3 INC R10
(0105) if(errTime>50)
8A E382 LDI R24,0x32
8B 158A CP R24,R10
8C F410 BCC 0x008F
(0106) return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
8D 2700 CLR R16
8E C003 RJMP 0x0092
8F 9BC8 SBIS 0x19,0
90 CFF6 RJMP 0x0087
(0107) }
(0108) return(0xff);
91 EF0F LDI R16,0xFF
92 90A9 LD R10,Y+
93 9508 RET
_write_a_bit:
temp --> R10
94 92AA ST R10,-Y
95 2EA0 MOV R10,R16
(0109) }
(0110)
(0111)
(0112) /*
(0113) 写一个位
(0114) */
(0115) void write_a_bit(unsigned char temp){
(0116) HLD_DS18B20; //Maga16控制总线
96 9AD0 SBI 0x1A,0
(0117) CLR_DS18B20; //强制拉低
97 98D8 CBI 0x1B,0
(0118) delayUs(16); //14.92us
98 E100 LDI R16,0x10
99 DFBD RCALL _delayUs
(0119) if(temp&0x01)
9A FEA0 SBRS R10,0
9B C002 RJMP 0x009E
(0120) RLS_DS18B20; //释放总线
9C 98D0 CBI 0x1A,0
9D C001 RJMP 0x009F
(0121) else
(0122) CLR_DS18B20; //强制拉低
9E 98D8 CBI 0x1B,0
(0123) delayUs(16); //14.92us
9F E100 LDI R16,0x10
A0 DFB6 RCALL _delayUs
(0124) delayUs(35); //30.38us
A1 E203 LDI R16,0x23
A2 DFB4 RCALL _delayUs
(0125) RLS_DS18B20; //释放总线
A3 98D0 CBI 0x1A,0
(0126) delayUs(1); //2.71us(大于1us就行了)
A4 E001 LDI R16,1
A5 DFB1 RCALL _delayUs
A6 90A9 LD R10,Y+
A7 9508 RET
_read_a_bit:
temp --> R20
A8 934A ST R20,-Y
(0127) //HLD_DS18B20; //Maga16控制总线
(0128)
(0129)
(0130) }
(0131)
(0132)
(0133)
(0134) /*
(0135)
(0136) 读一位
(0137)
(0138) */
(0139)
(0140)
(0141)
(0142)
(0143)
(0144) unsigned char read_a_bit(void){
(0145) unsigned char temp=0;
A9 2744 CLR R20
(0146) HLD_DS18B20; //Maga16控制总线
AA 9AD0 SBI 0x1A,0
(0147) CLR_DS18B20; //强制拉低
AB 98D8 CBI 0x1B,0
(0148) NOP();
AC 0000 NOP
(0149) NOP();
AD 0000 NOP
(0150) NOP();
AE 0000 NOP
(0151) NOP();
AF 0000 NOP
(0152) NOP();
B0 0000 NOP
(0153) NOP();
B1 0000 NOP
(0154) NOP();
B2 0000 NOP
(0155) NOP(); //延时大于1us
B3 0000 NOP
(0156) RLS_DS18B20; //释放总线
B4 98D0 CBI 0x1A,0
(0157) NOP();
B5 0000 NOP
(0158) NOP();
B6 0000 NOP
(0159) NOP();
B7 0000 NOP
(0160) if(STU_DS18B20)
B8 9BC8 SBIS 0x19,0
B9 C002 RJMP 0x00BC
(0161) temp=1;
BA E041 LDI R20,1
BB C001 RJMP 0x00BD
(0162) else
(0163) temp=0;
BC 2744 CLR R20
(0164) delayUs(16); //14.92us
BD E100 LDI R16,0x10
BE DF98 RCALL _delayUs
(0165) delayUs(16); //14.92us
BF E100 LDI R16,0x10
C0 DF96 RCALL _delayUs
(0166) RLS_DS18B20; //释放总线
C1 98D0 CBI 0x1A,0
(0167) delayUs(35); //30.38us
C2 E203 LDI R16,0x23
C3 DF93 RCALL _delayUs
(0168) //HLD_DS18B20; //Maga16控制总线
(0169) return temp;
C4 2F04 MOV R16,R20
C5 9149 LD R20,Y+
C6 9508 RET
_readuint8DS18B20:
retVal --> R20
temp --> R10
i --> R22
C7 940E 034D CALL push_xgsetF00C
(0170) }
(0171)
(0172)
(0173)
(0174)
(0175)
(0176) /**********************************************************************
(0177) functionName: uint8 readuint8DS18B20(void)
(0178) description :读DS18B20一个字节
(0179) **********************************************************************/
(0180) uint8 readuint8DS18B20(void)
(0181) {
(0182) uint8 i;
(0183) uint8 retVal=0;
C9 2744 CLR R20
(0184) uint8 temp=0;
CA 24AA CLR R10
(0185) RLS_DS18B20; //释放总线
CB 98D0 CBI 0x1A,0
(0186) for(i=8;i>0;i--)
CC E068 LDI R22,0x8
CD C007 RJMP 0x00D5
(0187) {
(0188) retVal>>=1;
CE 9546 LSR R20
(0189) /*
(0190) HLD_DS18B20; //Maga16控制总线
(0191) CLR_DS18B20; //强制拉低
(0192) NOP();
(0193) NOP();
(0194) NOP();
(0195) NOP();
(0196) NOP();
(0197) NOP();
(0198) NOP();
(0199) NOP(); //延时大于1us
(0200) RLS_DS18B20; //释放总线
(0201) NOP();
(0202) NOP();
(0203) NOP();
(0204) if(STU_DS18B20)
(0205) retVal|=0x80;
(0206) delayUs(16); //14.92us
(0207) delayUs(16); //14.92us
(0208) RLS_DS18B20; //释放总线
(0209) delayUs(35); //30.38us
(0210) */
(0211)
(0212) temp=read_a_bit();
CF DFD8 RCALL _read_a_bit
D0 2EA0 MOV R10,R16
(0213) if(temp)
D1 2300 TST R16
D2 F009 BEQ 0x00D4
(0214) retVal|=0x80;
D3 6840 ORI R20,0x80
D4 956A DEC R22
D5 E080 LDI R24,0
D6 1786 CP R24,R22
D7 F3B0 BCS 0x00CE
(0215)
(0216) }
(0217) delayUs(1); //2.71us(大于1us就行了)
D8 E001 LDI R16,1
D9 DF7D RCALL _delayUs
(0218) return(retVal);
DA 2F04 MOV R16,R20
DB 940C 0354 JMP pop_xgsetF00C
_writeuint8DS18B20:
temp --> R22
i --> R20
wb --> R10
DD 940E 034D CALL push_xgsetF00C
DF 2EA0 MOV R10,R16
(0219) }
(0220)
(0221)
(0222) /*******************************************************************************
(0223) functionName: uint8 readuint8DS18B20(void)
(0224) description :写DS18B20一个字节
(0225) ********************************************************************************/
(0226) void writeuint8DS18B20(uint8 wb)
(0227) {
(0228) uint8 i;
(0229) uint8 temp;
(0230) RLS_DS18B20; //释放总线
E0 98D0 CBI 0x1A,0
(0231) for(i=0;i<8;i++)
E1 2744 CLR R20
E2 C009 RJMP 0x00EC
(0232) {
(0233) temp=wb>>i;
E3 2D0A MOV R16,R10
E4 2F14 MOV R17,R20
E5 940E 0379 CALL lsr8
E7 2F60 MOV R22,R16
(0234) temp&=0x01;
E8 7061 ANDI R22,1
(0235) write_a_bit(temp);
E9 2F06 MOV R16,R22
EA DFA9 RCALL _write_a_bit
EB 9543 INC R20
EC 3048 CPI R20,0x8
ED F3A8 BCS 0x00E3
EE 940C 0354 JMP pop_xgsetF00C
_readTempDS18B20:
x --> R10
tempH --> R12
tempL --> R10
F0 940E 033E CALL push_xgset003C
(0236) /*
(0237) HLD_DS18B20; //Maga16控制总线
(0238) CLR_DS18B20; //强制拉低
(0239) delayUs(16); //14.92us
(0240) temp=wb>>i;
(0241) temp&=0x01;
(0242) if(temp)
(0243) RLS_DS18B20; //释放总线
(0244) else
(0245) CLR_DS18B20; //强制拉低
(0246) delayUs(16); //14.92us
(0247) delayUs(35); //30.38us
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -