📄 smg_ds18b20.lst
字号:
121 1786 CP R24,R22
122 F360 BCS 0x010F
(0072) //delay_nus(30); //30.38us
(0073) }
(0074) Delay_Us(5); //2.71us(大于1us就行了)
123 E005 LDI R16,5
124 E010 LDI R17,0
125 DF59 RCALL _Delay_Us
(0075) return(retVal);
126 2F04 MOV R16,R20
127 9169 LD R22,Y+
128 9149 LD R20,Y+
129 9508 RET
_writeByteDS18B20:
temp --> R22
i --> R20
wb --> R10
12A 940E 03D9 CALL push_xgsetF00C
12C 2EA0 MOV R10,R16
(0076)
(0077) }
(0078)
(0079) /**********************************************************************
(0080) functionName: unsigned char readByteDS18B20(void)
(0081) description :写DS18B20一个字节
(0082) **********************************************************************/
(0083) void writeByteDS18B20(unsigned char wb)
(0084) {
(0085) unsigned char i;
(0086) unsigned char temp;
(0087) RLS_DS18B20; //释放总线
12D 9812 CBI 0x02,2
(0088) for(i=0;i<8;i++)
12E 2744 CLR R20
12F C017 RJMP 0x0147
(0089) {
(0090) HLD_DS18B20; //Maga16控制总线
130 9A12 SBI 0x02,2
(0091) CLR_DS18B20; //强制拉低
131 981A CBI 0x03,2
(0092) Delay_Us(4); //14.92us
132 E004 LDI R16,4
133 E010 LDI R17,0
134 DF4A RCALL _Delay_Us
(0093) //SET_DS18B20; //释放总线
(0094) //delay_nus(16); //14.92us
(0095) temp=wb>>i;
135 2D0A MOV R16,R10
136 2F14 MOV R17,R20
137 940E 03F6 CALL lsr8
139 2F60 MOV R22,R16
(0096) temp&=0x01;
13A 7061 ANDI R22,1
(0097) if(temp)
13B F011 BEQ 0x013E
(0098) SET_DS18B20; //释放总线
13C 9A1A SBI 0x03,2
13D C001 RJMP 0x013F
(0099) else
(0100) CLR_DS18B20; //强制拉低
13E 981A CBI 0x03,2
(0101) Delay_Us(50); //30.38us
13F E302 LDI R16,0x32
140 E010 LDI R17,0
141 DF3D RCALL _Delay_Us
(0102) //RLS_DS18B20; //释放总线
(0103) SET_DS18B20; //释放总线
142 9A1A SBI 0x03,2
(0104) Delay_Us(4); //2.71us(大于1us就行了)
143 E004 LDI R16,4
144 E010 LDI R17,0
145 DF39 RCALL _Delay_Us
146 9543 INC R20
147 3048 CPI R20,0x8
148 F338 BCS 0x0130
149 940C 03E0 JMP pop_xgsetF00C
_readTempDS18B20:
x --> R10
tempH --> R12
tempL --> R10
14B 940E 03CA CALL push_xgset003C
(0105)
(0106) }
(0107) }
(0108)
(0109) /**********************************************************************
(0110) functionName: unsigned int readTempDS18B20(void)
(0111) description :读DS18B20温度
(0112) **********************************************************************/
(0113) unsigned int readTempDS18B20(void)
(0114) {
(0115) unsigned char tempL,tempH;
(0116) unsigned int x;
(0117) //resetDS18B20();
(0118) //writeByteDS18B20(0xcc); //跳过ROM
(0119) //writeByteDS18B20(0x44); //启动温度转换
(0120) Delay_Ms(1); //等待1ms
14D E001 LDI R16,1
14E E010 LDI R17,0
14F DF48 RCALL _Delay_Ms
(0121) resetDS18B20();
150 DF91 RCALL _resetDS18B20
(0122) writeByteDS18B20(0xcc); //跳过ROM
151 EC0C LDI R16,0xCC
152 DFD7 RCALL _writeByteDS18B20
(0123) writeByteDS18B20(0xbe); //读数据
153 EB0E LDI R16,0xBE
154 DFD5 RCALL _writeByteDS18B20
(0124) tempL=readByteDS18B20();
155 DFB3 RCALL _readByteDS18B20
156 2EA0 MOV R10,R16
(0125) tempH=readByteDS18B20();
157 DFB1 RCALL _readByteDS18B20
158 2EC0 MOV R12,R16
(0126) x=(tempH<<8)|tempL;
159 2CBC MOV R11,R12
(0127) resetDS18B20();
15A DF87 RCALL _resetDS18B20
(0128) writeByteDS18B20(0xcc); //跳过ROM
15B EC0C LDI R16,0xCC
15C DFCD RCALL _writeByteDS18B20
(0129) writeByteDS18B20(0x44); //启动温度转换
15D E404 LDI R16,0x44
15E DFCB RCALL _writeByteDS18B20
(0130) return(x);
15F 0185 MOVW R16,R10
160 940C 03BF JMP pop_xgset003C
FILE: H:\mega128开发板rev1.1\开发板程序\ds18b20温度+数码管显示程序\MAIN.C
(0001) // Target : M128
(0002) // Crystal: 8.0000Mhz
(0003)
(0004) #include <iom128v.h>
(0005) #include <macros.h>
(0006) #include "define.h"
(0007) #include "delay.h"
(0008) #include "initrialm128.h"
(0009) #include "ds18b20.h"
(0010)
(0011) //#include
(0012) void Coding_led(void);//8位数码管译码程序
(0013)
(0014)
(0015) //TIMER0 initialize - prescale:1024
(0016) // WGM: Normal
(0017) // desired value: 3mSec
(0018) // actual value: 2.976mSec (0.2%)
(0019) void timer0_init(void)
(0020) {
(0021) TCCR0 = 0x00; //stop
_timer0_init:
162 2422 CLR R2
163 BE23 OUT 0x33,R2
(0022) ASSR = 0x00; //set async mode
164 BE20 OUT 0x30,R2
(0023) TCNT0 = 0xA3; //set count
165 EA83 LDI R24,0xA3
166 BF82 OUT 0x32,R24
(0024) OCR0 = 0x1F;
167 E18F LDI R24,0x1F
168 BF81 OUT 0x31,R24
(0025) TCCR0 = 0x06; //start timer
169 E086 LDI R24,6
16A BF83 OUT 0x33,R24
(0026) TIMSK |= 0x01; //timer interrupt sources
16B B787 IN R24,0x37
16C 6081 ORI R24,1
16D BF87 OUT 0x37,R24
16E 9508 RET
_timer0_ovf_isr:
16F 922A ST R2,-Y
170 923A ST R3,-Y
171 930A ST R16,-Y
172 931A ST R17,-Y
173 938A ST R24,-Y
174 939A ST R25,-Y
175 93EA ST R30,-Y
176 93FA ST R31,-Y
177 B62F IN R2,0x3F
178 922A ST R2,-Y
(0027) }
(0028)
(0029) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
(0030) void timer0_ovf_isr(void)
(0031) {
(0032) TCNT0 = 0xA3; //reload counter value
179 EA83 LDI R24,0xA3
17A BF82 OUT 0x32,R24
(0033) if(sbit_led == 8)
17B 9180 012F LDS R24,sbit_led
17D 3088 CPI R24,0x8
17E F419 BNE 0x0182
(0034) {
(0035) sbit_led = 0;
17F 2422 CLR R2
180 9220 012F STS sbit_led,R2
(0036) }
(0037) SMG_PORT = 0XFF;
182 EF8F LDI R24,0xFF
183 BB8B OUT 0x1B,R24
(0038) SMG_BIT_PORT = 0xff;
184 BB85 OUT 0x15,R24
(0039) SMG_BIT_PORT &=~ BIT(sbit_led);
185 9110 012F LDS R17,sbit_led
187 E001 LDI R16,1
188 940E 03F0 CALL lsl8
18A 2E20 MOV R2,R16
18B 9420 COM R2
18C B235 IN R3,0x15
18D 2032 AND R3,R2
18E BA35 OUT 0x15,R3
(0040) SMG_PORT = led_disbuf[sbit_led];
18F E287 LDI R24,0x27
190 E091 LDI R25,1
191 91E0 012F LDS R30,sbit_led
193 27FF CLR R31
194 0FE8 ADD R30,R24
195 1FF9 ADC R31,R25
196 8020 LDD R2,Z+0
197 BA2B OUT 0x1B,R2
(0041) sbit_led ++;
198 9180 012F LDS R24,sbit_led
19A 5F8F SUBI R24,0xFF
19B 9380 012F STS sbit_led,R24
19D 9029 LD R2,Y+
19E BE2F OUT 0x3F,R2
19F 91F9 LD R31,Y+
1A0 91E9 LD R30,Y+
1A1 9199 LD R25,Y+
1A2 9189 LD R24,Y+
1A3 9119 LD R17,Y+
1A4 9109 LD R16,Y+
1A5 9039 LD R3,Y+
1A6 9029 LD R2,Y+
1A7 9518 RETI
(0042) }
(0043)
(0044)
(0045) void main(void)
(0046) {
(0047) unsigned char n;
(0048) Init_Devices();
_main:
n --> Y,+1
1A8 DF21 RCALL _Init_Devices
(0049) timer0_init();
1A9 DFB8 RCALL _timer0_init
(0050) BELL_OFF();
1AA 9A1C SBI 0x03,4
1AB C13F RJMP 0x02EB
(0051)
(0052) while(1)
(0053) {
(0054) temperture = readTempDS18B20();
1AC DF9E RCALL _readTempDS18B20
1AD 940E 0490 CALL uint2fp
1AF 9310 011B STS temperture+1,R17
1B1 9300 011A STS temperture,R16
1B3 9330 011D STS temperture+3,R19
1B5 9320 011C STS temperture+2,R18
(0055) temperture = temperture * 0.0625*10;
1B7 E904 LDI R16,0x94
1B8 E010 LDI R17,0
1B9 940E 03AB CALL elpm32
1BB 0118 MOVW R2,R16
1BC 0129 MOVW R4,R18
1BD E900 LDI R16,0x90
1BE E010 LDI R17,0
1BF 940E 03AB CALL elpm32
1C1 E18A LDI R24,0x1A
1C2 E091 LDI R25,1
1C3 939A ST R25,-Y
1C4 938A ST R24,-Y
1C5 940E 0593 CALL fpmule1x
1C7 0181 MOVW R16,R2
1C8 0192 MOVW R18,R4
1C9 940E 0588 CALL fpmule2
1CB 9310 011B STS temperture+1,R17
1CD 9300 011A STS temperture,R16
1CF 9330 011D STS temperture+3,R19
1D1 9320 011C STS temperture+2,R18
(0056) if(temperture < 1000)//ds18b20由于进中断后干扰时序,最好加上校验数据
1D3 0118 MOVW R2,R16
1D4 0129 MOVW R4,R18
1D5 E80C LDI R16,0x8C
1D6 E010 LDI R17,0
1D7 940E 03AB CALL elpm32
1D9 933A ST R19,-Y
1DA 932A ST R18,-Y
1DB 931A ST R17,-Y
1DC 930A ST R16,-Y
1DD 0181 MOVW R16,R2
1DE 0192 MOVW R18,R4
1DF 940E 05AD CALL fpcmp2
1E1 F00C BLT 0x01E3
1E2 C0D7 RJMP 0x02BA
(0057) {
(0058) led_buf[0] = (int)temperture/10000000%10;
1E3 E840 LDI R20,0x80
1E4 E956 LDI R21,0x96
1E5 E968 LDI R22,0x98
1E6 E070 LDI R23,0
1E7 9120 011C LDS R18,temperture+2
1E9 9130 011D LDS R19,temperture+3
1EB 9100 011A LDS R16,temperture
1ED 9110 011B LDS R17,temperture+1
1EF 940E 0464 CALL fpint
1F1 2722 CLR R18
1F2 FD17 SBRC R17,7
1F3 9520 COM R18
1F4 2733 CLR R19
1F5 FD27 SBRC R18,7
1F6 9530 COM R19
1F7 937A ST R23,-Y
1F8 936A ST R22,-Y
1F9 935A ST R21,-Y
1FA 934A ST R20,-Y
1FB 940E 0347 CALL div32s
1FD E04A LDI R20,0xA
1FE E050 LDI R21,0
1FF E060 LDI R22,0
200 E070 LDI R23,0
201 937A ST R23,-Y
202 936A ST R22,-Y
203 935A ST R21,-Y
204 934A ST R20,-Y
205 940E 0349 CALL mod32s
207 9300 011F STS led_buf,R16
(0059) led_buf[1] = (int)temperture/1000000%10;
209 E440 LDI R20,0x40
20A E452 LDI R21,0x42
20B E06F LDI R22,0xF
20C E070 LDI R23,0
20D 9120 011C LDS R18,temperture+2
20F 9130 011D LDS R19,temperture+3
211 9100 011A LDS R16,temperture
213 9110 011B LDS R17,temperture+1
215 940E 0464 CALL fpint
217 2722 CLR R18
218 FD17 SBRC R17,7
219 9520 COM R18
21A 2733 CLR R19
21B FD27 SBRC R18,7
21C 9530 COM R19
21D 937A ST R23,-Y
21E 936A ST R22,-Y
21F 935A ST R21,-Y
220 934A ST R20,-Y
221 940E 0347 CALL div32s
223 E04A LDI R20,0xA
224 E050 LDI R21,0
225 E060 LDI R22,0
226 E070 LDI R23,0
227 937A ST R23,-Y
228 936A ST R22,-Y
229 935A ST R21,-Y
22A 934A ST R20,-Y
22B 940E 0349 CALL mod32s
22D 9300 0120 STS led_buf+1,R16
(0060) led_buf[2] = (int)temperture/100000%10;
22F EA40 LDI R20,0xA0
230 E856 LDI R21,0x86
231 E061 LDI R22,1
232 E070 LDI R23,0
233 9120 011C LDS R18,temperture+2
235 9130 011D LDS R19,temperture+3
237 9100 011A LDS R16,temperture
239 9110 011B LDS R17,temperture+1
23B 940E 0464 CALL fpint
23D 2722 CLR R18
23E FD17 SBRC R17,7
23F 9520 COM R18
240 2733 CLR R19
241 FD27 SBRC R18,7
242 9530 COM R19
243 937A ST R23,-Y
244 936A ST R22,-Y
245 935A ST R21,-Y
246 934A ST R20,-Y
247 940E 0347 CALL div32s
249 E04A LDI R20,0xA
24A E050 LDI R21,0
24B E060 LDI R22,0
24C E070 LDI R23,0
24D 937A ST R23,-Y
24E 936A ST R22,-Y
24F 935A ST R21,-Y
250 934A ST R20,-Y
251 940E 0349 CALL mod32s
253 9300 0121 STS led_buf+2,R16
(0061) led_buf[3] = (int)temperture/10000%10;
255 E180 LDI R24,0x10
256 E297 LDI R25,0x27
257 9120 011C LDS R18,temperture+2
259 9130 011D LDS R19,temperture+3
25B 9100 011A LDS R16,temperture
25D 9110 011B LDS R17,temperture+1
25F 940E 0464 CALL fpint
261 019C MOVW R18,R24
262 940E 030B CALL div16s
264 E02A LDI R18,0xA
265 E030 LDI R19,0
266 940E 0307 CALL mod16s
268 9300 0122 STS led_buf+3,R16
(0062) led_buf[4] = (int)temperture/1000%10;
26A EE88 LDI R24,0xE8
26B E093 LDI R25,3
26C 9120 011C LDS R18,temperture+2
26E 9130 011D LDS R19,temperture+3
270 9100 011A LDS R16,temperture
272 9110 011B LDS R17,temperture+1
274 940E 0464 CALL fpint
276 019C MOVW R18,R24
277 940E 030B CALL div16s
279 E02A LDI R18,0xA
27A E030 LDI R19,0
27B 940E 0307 CALL mod16s
27D 9300 0123 STS 0x0123,R16
(0063) led_buf[5] = (int)temperture/100%10;
27F E684 LDI R24,0x64
280 E090 LDI R25,0
281 9120 011C LDS R18,temperture+2
283 9130 011D LDS R19,temperture+3
285 9100 011A LDS R16,temperture
287 9110 011B LDS R17,temperture+1
289 940E 0464 CALL fpint
28B 019C MOVW R18,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -