⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measure_temp.lst

📁 ATmega128单片机对SHT7x温湿度传感器的驱动程序。编译环境:ICC AVR
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0326)   }
(0327)   PORTF |=0x02;
    0303 91800062  LDS	R24,0x62
    0305 6082      ORI	R24,2
    0306 93800062  STS	0x62,R24
(0328)   DDRF &=0xfd;
    0308 91800061  LDS	R24,0x61
    030A 7F8D      ANDI	R24,0xFD
    030B 93800061  STS	0x61,R24
(0329)   for(k=0;k<65535u;k++)
    030D 24CC      CLR	R12
    030E 24DD      CLR	R13
    030F C01A      RJMP	0x032A
(0330)   {
(0331)   for (i=0;i<65535u;i++)
    0310 24EE      CLR	R14
    0311 24FF      CLR	R15
    0312 C00B      RJMP	0x031E
(0332)   {
(0333)   	j=PINF&0x02;//DATA_status();//PORTF&0x02;
    0313 B160      IN	R22,0x00
    0314 2777      CLR	R23
    0315 7062      ANDI	R22,2
    0316 7070      ANDI	R23,0
(0334)   	 if(j==0) break;
    0317 3060      CPI	R22,0
    0318 0767      CPC	R22,R23
    0319 F409      BNE	0x031B
    031A C008      RJMP	0x0323
    031B 01C7      MOVW	R24,R14
    031C 9601      ADIW	R24,1
    031D 017C      MOVW	R14,R24
    031E 01C7      MOVW	R24,R14
    031F 3F8F      CPI	R24,0xFF
    0320 EFEF      LDI	R30,0xFF
    0321 079E      CPC	R25,R30
    0322 F380      BCS	0x0313
(0335)   	} 
(0336)   	if(j==0)
    0323 3060      CPI	R22,0
    0324 0767      CPC	R22,R23
    0325 F409      BNE	0x0327
(0337)   	break;
    0326 C008      RJMP	0x032F
    0327 01C6      MOVW	R24,R12
    0328 9601      ADIW	R24,1
    0329 016C      MOVW	R12,R24
    032A 01C6      MOVW	R24,R12
    032B 3F8F      CPI	R24,0xFF
    032C EFEF      LDI	R30,0xFF
    032D 079E      CPC	R25,R30
    032E F308      BCS	0x0310
(0338)   }
(0339)   	
(0340)   
(0341)   
(0342)   if(j) error+=1;                // or timeout (~2 sec.) is reached
    032F 3060      CPI	R22,0
    0330 0767      CPC	R22,R23
    0331 F011      BEQ	0x0334
    0332 5F4F      SUBI	R20,0xFF
    0333 4F5F      SBCI	R21,0xFF
(0343)   cwendu1=s_read_byte(ACK);    //read the first byte (MSB)
    0334 E001      LDI	R16,1
    0335 DE90      RCALL	_s_read_byte
    0336 93000107  STS	cwendu1,R16
(0344)   cwendu2=s_read_byte(ACK);    //read the second byte (LSB)
    0338 E001      LDI	R16,1
    0339 DE8C      RCALL	_s_read_byte
    033A 93000106  STS	cwendu2,R16
(0345)   uwendu =cwendu1*256+cwendu2;
    033C 91200107  LDS	R18,cwendu1
    033E 2733      CLR	R19
    033F E000      LDI	R16,0
    0340 E011      LDI	R17,1
    0341 940E03F3  CALL	empy16s
    0343 0118      MOVW	R2,R16
    0344 90400106  LDS	R4,cwendu2
    0346 2455      CLR	R5
    0347 0C24      ADD	R2,R4
    0348 1C35      ADC	R3,R5
    0349 92300105  STS	uwendu+1,R3
    034B 92200104  STS	uwendu,R2
(0346)   *p_checksum =s_read_byte(noACK);
    034D 2700      CLR	R16
    034E DE77      RCALL	_s_read_byte
    034F 01F5      MOVW	R30,R10
    0350 8300      STD	Z+0,R16
(0347)   
(0348)   if(error>0)
    0351 3040      CPI	R20,0
    0352 0745      CPC	R20,R21
    0353 F009      BEQ	0x0355
(0349)   	 PORTA |=0x02;  //read checksum
    0354 9AD9      SBI	0x1B,1
(0350)   return error;
    0355 2F04      MOV	R16,R20
    0356 940E040E  CALL	pop_xgset5
    0358 9508      RET
_calc_sth11:
  t_C                  --> Y,+4
  t                    --> Y,+0
  p_temperature        --> R10
    0359 92AA      ST	R10,-Y
    035A 92BA      ST	R11,-Y
    035B 0158      MOVW	R10,R16
    035C 9728      SBIW	R28,0x8
(0351) } 
(0352) void calc_sth11(float *p_temperature)
(0353) //void calc_sth11(float *p_humidity ,float *p_temperature)
(0354) //----------------------------------------------------------------------------------------
(0355) // calculates temperature [癈] and humidity [%RH] 
(0356) // input :  humi [Ticks] (12 bit) 
(0357) //          temp [Ticks] (14 bit)
(0358) // output:  humi [%RH]
(0359) //          temp [癈]
(0360) { 
(0361) 
(0362)   //float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit 
(0363)   float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
    035D 01F5      MOVW	R30,R10
    035E 8020      LDD	R2,Z+0
    035F 8031      LDD	R3,Z+1
    0360 8042      LDD	R4,Z+2
    0361 8053      LDD	R5,Z+3
    0362 8228      STD	Y+0,R2
    0363 8239      STD	Y+1,R3
    0364 824A      STD	Y+2,R4
    0365 825B      STD	Y+3,R5
(0364)   //float rh_lin;                     // rh_lin:  Humidity linear
(0365)   //float rh_true;                    // rh_true: Temperature compensated humidity
(0366)   float t_C;                        // t_C   :  Temperature [癈]
(0367) 
(0368)   t_C=t*0.01 - 40;//-327.68;                  //calc. temperature from ticks to [癈]
    0366 EA0C      LDI	R16,0xAC
    0367 E010      LDI	R17,0
    0368 940E043D  CALL	lpm32
    036A 01CE      MOVW	R24,R28
    036B 939A      ST	R25,-Y
    036C 938A      ST	R24,-Y
    036D 940E05BC  CALL	fpmule1
    036F 0118      MOVW	R2,R16
    0370 0129      MOVW	R4,R18
    0371 EA08      LDI	R16,0xA8
    0372 E010      LDI	R17,0
    0373 940E043D  CALL	lpm32
    0375 933A      ST	R19,-Y
    0376 932A      ST	R18,-Y
    0377 931A      ST	R17,-Y
    0378 930A      ST	R16,-Y
    0379 0181      MOVW	R16,R2
    037A 0192      MOVW	R18,R4
    037B 940E04C4  CALL	fpsub2
    037D 830C      STD	Y+4,R16
    037E 831D      STD	Y+5,R17
    037F 832E      STD	Y+6,R18
    0380 833F      STD	Y+7,R19
(0369)   //rh_lin=C3*rh*rh + C2*rh + C1;     //calc. humidity from ticks to [%RH]
(0370)   //rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //calc. temperature compensated humidity [%RH]
(0371)   //if(rh_true>100)rh_true=100;       //cut if the value is outside of
(0372)   //if(rh_true<0.1)rh_true=0.1;       //the physical possible range
(0373) 
(0374)   *p_temperature=t_C;               //return temperature [癈]
    0381 802C      LDD	R2,Y+4
    0382 803D      LDD	R3,Y+5
    0383 804E      LDD	R4,Y+6
    0384 805F      LDD	R5,Y+7
    0385 01F5      MOVW	R30,R10
    0386 8220      STD	Z+0,R2
    0387 8231      STD	Z+1,R3
    0388 8242      STD	Z+2,R4
    0389 8253      STD	Z+3,R5
    038A 9628      ADIW	R28,0x8
    038B 90B9      LD	R11,Y+
    038C 90A9      LD	R10,Y+
    038D 9508      RET
_main:
  checksum             --> Y,+0
  error                --> R10
  i                    --> R10
    038E 9721      SBIW	R28,1
(0375)   //*p_humidity=rh_true;              //return humidity[%RH]
(0376) }
(0377) 
(0378) /*float calc_dewpoint(float h,float t)
(0379) //--------------------------------------------------------------------
(0380) // calculates dew point
(0381) // input:   humidity [%RH], temperature [癈]
(0382) // output:  dew point [癈]
(0383) { float logEx,dew_point;
(0384)   logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
(0385)   dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
(0386)   return dew_point;
(0387) }
(0388) */
(0389) 
(0390) 
(0391) 
(0392) void main()
(0393) //----------------------------------------------------------------------------------
(0394) // sample program that shows how to use SHT11 functions
(0395) // 1. connection reset 
(0396) // 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)
(0397) // 3. calculate humidity [%RH] and temperature [癈]
(0398) // 4. calculate dew point [癈]
(0399) // 5. print temperature, humidity, dew point  
(0400) 
(0401) { //value temp_val;//humi_val;
(0402) 	//unsigned int temp_new;
(0403)   //float dew_point;
(0404)   unsigned char error,checksum;
(0405)   unsigned int i;
(0406)  
(0407)   
(0408)   DDRA |=0x07;
    038F B38A      IN	R24,0x1A
    0390 6087      ORI	R24,7
    0391 BB8A      OUT	0x1A,R24
    0392 C05D      RJMP	0x03F0
(0409)    //delay();
(0410)    //delay();
(0411)    //newdelay();
(0412)   //init_uart();
(0413)   //while(1)
(0414)   
(0415) 
(0416)   
(0417)   
(0418)    //PORTA &=0xfb;
(0419) 
(0420)   
(0421)  
(0422)   while(1)
(0423)   {
(0424)   	shxx_config();
    0393 DCE5      RCALL	_shxx_config
(0425)   	s_connectionreset();
    0394 DF2C      RCALL	_s_connectionreset
(0426)    error=0;
    0395 24AA      CLR	R10
(0427)     //error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);  //measure humidity
(0428)     //error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  //measure temperature
(0429)     error+=s_measure(&checksum,TEMP); 
    0396 2722      CLR	R18
    0397 018E      MOVW	R16,R28
    0398 DF4B      RCALL	_s_measure
    0399 0EA0      ADD	R10,R16
(0430)     if(error!=0) 
    039A F011      BEQ	0x039D
(0431)     s_connectionreset();
    039B DF25      RCALL	_s_connectionreset
    039C C031      RJMP	0x03CE
(0432)     else
(0433)     {	
(0434)      //for (i=0;i<60000;i++);	
(0435)      
(0436)     //PORTA &=0xfb;                //in case of an error: connection reset
(0437)     
(0438)      //PORTA &=0xfb;
(0439)     	//PORTA =0x02;
(0440)     	//humi_val.f=(float)humi_val.i;                   //converts integer to float
(0441)       fwendu=(float)uwendu; 
    039D 90200104  LDS	R2,uwendu
    039F 90300105  LDS	R3,uwendu+1
    03A1 EA04      LDI	R16,0xA4
    03A2 E010      LDI	R17,0
    03A3 940E043D  CALL	lpm32
    03A5 0128      MOVW	R4,R16
    03A6 0139      MOVW	R6,R18
    03A7 0181      MOVW	R16,R2
    03A8 9516      LSR	R17
    03A9 9507      ROR	R16
    03AA 940E04CF  CALL	int2fp
    03AC 933A      ST	R19,-Y
    03AD 932A      ST	R18,-Y
    03AE 931A      ST	R17,-Y
    03AF 930A      ST	R16,-Y
    03B0 0182      MOVW	R16,R4
    03B1 0193      MOVW	R18,R6
    03B2 940E05C6  CALL	fpmule2
    03B4 0128      MOVW	R4,R16
    03B5 0139      MOVW	R6,R18
    03B6 0181      MOVW	R16,R2
    03B7 7001      ANDI	R16,1
    03B8 7010      ANDI	R17,0
    03B9 940E04CF  CALL	int2fp
    03BB 933A      ST	R19,-Y
    03BC 932A      ST	R18,-Y
    03BD 931A      ST	R17,-Y
    03BE 930A      ST	R16,-Y
    03BF 0182      MOVW	R16,R4
    03C0 0193      MOVW	R18,R6
    03C1 940E04B9  CALL	fpadd2
    03C3 93100101  STS	fwendu+1,R17
    03C5 93000100  STS	fwendu,R16
    03C7 93300103  STS	fwendu+3,R19
    03C9 93200102  STS	fwendu+2,R18
(0442)       calc_sth11(&fwendu);                   //converts integer to float
    03CB E000      LDI	R16,0
    03CC E011      LDI	R17,1
    03CD DF8B      RCALL	_calc_sth11
(0443)       //calc_sth11(&humi_val.f,&temp_val.f);            //calculate humidity, temperature
(0444)       //dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
(0445)       //printf("temp:%5.1fC humi:%5.1f%% dew point:%5.1fC\n",temp_val.f,humi_val.f,dew_point);
(0446)      }
(0447)     if(fwendu>30.0)
    03CE E080      LDI	R24,0
    03CF E091      LDI	R25,1
    03D0 EA00      LDI	R16,0xA0
    03D1 E010      LDI	R17,0
    03D2 940E043D  CALL	lpm32
    03D4 939A      ST	R25,-Y
    03D5 938A      ST	R24,-Y
    03D6 940E05DE  CALL	fpcmp1
    03D8 F414      BGE	0x03DB
(0448)      PORTA |=0x01;
    03D9 9AD8      SBI	0x1B,0
    03DA C003      RJMP	0x03DE
(0449)      else
(0450)      PORTA &=0xfe;
    03DB B38B      IN	R24,0x1B
    03DC 7F8E      ANDI	R24,0xFE
    03DD BB8B      OUT	0x1B,R24
(0451)     
(0452)     //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------      
(0453)     for (i=0;i<40000;i++);     //(be sure that the compiler doesn't eliminate this line!)
FILE: <library>
    03DE 24AA      CLR	R10
    03DF 24BB      CLR	R11
    03E0 C003      RJMP	0x03E4
    03E1 01C5      MOVW	R24,R10
    03E2 9601      ADIW	R24,1
    03E3 015C      MOVW	R10,R24
    03E4 E440      LDI	R20,0x40
    03E5 E95C      LDI	R21,0x9C
    03E6 E060      LDI	R22,0
    03E7 E070      LDI	R23,0
    03E8 0115      MOVW	R2,R10
    03E9 2444      CLR	R4
    03EA 2455      CLR	R5
    03EB 1624      CP	R2,R20
    03EC 0635      CPC	R3,R21
    03ED 0646      CPC	R4,R22
    03EE 0657      CPC	R5,R23
    03EF F38C      BLT	0x03E1
    03F0 CFA2      RJMP	0x0393
    03F1 9621      ADIW	R28,1
    03F2 9508      RET
empy16s:
    03F3 920A      ST	R0,-Y
    03F4 921A      ST	R1,-Y
    03F5 938A      ST	R24,-Y
    03F6 939A      ST	R25,-Y
    03F7 9F02      MUL	R16,R18
    03F8 01C0      MOVW	R24,R0
    03F9 9F12      MUL	R17,R18
    03FA 0D90      ADD	R25,R0
    03FB 9F03      MUL	R16,R19
    03FC 0D90      ADD	R25,R0
    03FD 018C      MOVW	R16,R24
    03FE 9199      LD	R25,Y+
    03FF 9189      LD	R24,Y+
    0400 9019      LD	R1,Y+
    0401 9009      LD	R0,Y+
    0402 9508      RET
push_xgset5:
    0403 937A      ST	R23,-Y
    0404 936A      ST	R22,-Y
push_xgset4:
    0405 935A      ST	R21,-Y
    0406 934A      ST	R20,-Y
push_xgset3:
    0407 92FA      ST	R15,-Y
    0408 92EA      ST	R14,-Y
push_xgset2:
    0409 92DA      ST	R13,-Y
    040A 92CA      ST	R12,-Y
push_xgset1:
    040B 92BA      ST	R11,-Y
    040C 92AA      ST	R10,-Y
    040D 9508      RET
pop_xgset5:
    040E 27EE      CLR	R30
    040F C007      RJMP	xpop
pop_xgset4:
    0410 E0E8      LDI	R30,0x8
    0411 C005      RJMP	xpop
pop_xgset3:
    0412 E0E4      LDI	R30,4
    0413 C003      RJMP	xpop
pop_xgset2:
    0414 E0E2      LDI	R30,2
    0415 C001      RJMP	xpop
pop_xgset1:
    0416 E0E1      LDI	R30,1
xpop:
    0417 90A9      LD	R10,Y+
    0418 90B9      LD	R11,Y+
    0419 FDE0      SBRC	R30,0
    041A 9508      RET
    041B 90C9      LD	R12,Y+
    041C 90D9      LD	R13,Y+
    041D FDE1      SBRC	R30,1
    041E 9508      RET
    041F 90E9      LD	R14,Y+
    0420 90F9      LD	R15,Y+
    0421 FDE2      SBRC	R30,2
    0422 9508      RET
    0423 9149      LD	R20,Y+
    0424 9159      LD	R21,Y+
    0425 FDE3      SBRC	R30,3
    0426 9508      RET
    0427 9169      LD	R22,Y+
    0428 9179      LD	R23,Y+
    0429 9508      RET
push_xgsetx:
    042A 92AA      ST	R10,-Y
    042B 92BA      ST	R11,-Y
    042C 934A      ST	R20,-Y
    042D 935A      ST	R21,-Y
    042E 9508      RET
pop_xgsetx:
    042F 9159      LD	R21,Y+
    0430 9149      LD	R20,Y+
    0431 90B9      LD	R11,Y+
    0432 90A9      LD	R10,Y+
    0433 9508      RET
neg32:
    0434 9500      COM	R16
    0435 9510      COM	R17
    0436 9520      COM	R18
    0437 9530      COM	R19
    0438 5F0F      SUBI	R16,0xFF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -