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

📄 measure_temp.lst

📁 ATmega128单片机对SHT7x温湿度传感器的驱动程序。编译环境:ICC AVR
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0058 EFCF      LDI	R28,0xFF
    0059 E1D0      LDI	R29,0x10
    005A BFCD      OUT	0x3D,R28
    005B BFDE      OUT	0x3E,R29
    005C 51C0      SUBI	R28,0x10
    005D 40D0      SBCI	R29,0
    005E EA0A      LDI	R16,0xAA
    005F 8308      STD	Y+0,R16
    0060 2400      CLR	R0
    0061 E0E0      LDI	R30,0
    0062 E0F1      LDI	R31,1
    0063 E011      LDI	R17,1
    0064 30E8      CPI	R30,0x8
    0065 07F1      CPC	R31,R17
    0066 F011      BEQ	0x0069
    0067 9201      ST	R0,Z+
    0068 CFFB      RJMP	0x0064
    0069 8300      STD	Z+0,R16
    006A EBE0      LDI	R30,0xB0
    006B E0F0      LDI	R31,0
    006C E0A0      LDI	R26,0
    006D E0B1      LDI	R27,1
    006E E010      LDI	R17,0
    006F 3BE0      CPI	R30,0xB0
    0070 07F1      CPC	R31,R17
    0071 F021      BEQ	0x0076
    0072 95C8      LPM
    0073 9631      ADIW	R30,1
    0074 920D      ST	R0,X+
    0075 CFF9      RJMP	0x006F
    0076 940E038E  CALL	_main
_exit:
    0078 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\xzy_bupt\桌面\measure_temp\measure.c
(0001) #include <iom128v.h> //Microcontroller specific library, e.g. port definitions
(0002) 
(0003) #include <math.h>    //Keil library  
(0004) #include <stdio.h>   //Keil library
(0005) #include <macros.h>
(0006)   const float C1=-4.0;              // for 12 Bit
(0007)   const float C2=+0.0405;           // for 12 Bit
(0008)   const float C3=-0.0000028;        // for 12 Bit
(0009)   const float T1=+0.01;             // for 14 Bit @ 5V
(0010)   const float T2=+0.00008;           // for 14 Bit @ 5V	
(0011) 
(0012) unsigned char cwendu1,cwendu2;
(0013) unsigned int uwendu;
(0014) float fwendu;
(0015) 
(0016) 
(0017) enum {TEMP,HUMI};
(0018) 
(0019) 
(0020) 
(0021) #define noACK 0
(0022) #define ACK   1
(0023)                             //adr  command  r/w
(0024) #define STATUS_REG_W 0x06   //000   0011    0
(0025) #define STATUS_REG_R 0x07   //000   0011    1
(0026) #define MEASURE_TEMP 0x03   //000   0001    1
(0027) #define MEASURE_HUMI 0x05   //000   0010    1
(0028) #define RESET        0x1e   //000   1111    0
(0029) 
(0030) 
(0031) #define  DATA_SHTxx       (1<<1)                // PF0
(0032) #define  DATA_TO_1()      (PORTF |= DATA_SHTxx)   // PF0='0'        //置0
(0033) #define  DATA_TO_0()      (PORTF &= ~DATA_SHTxx)   // PF0='float'   //置1
(0034) #define  DATA_status()    (PINF & DATA_SHTxx)     // read PF0 pin 
(0035) 
(0036) #define  SCK_SHTxx       (1<<2)                // PF0
(0037) #define  SCK_TO_0()      (PORTF &= ~SCK_SHTxx)   // PF0='0'
(0038) #define  SCK_TO_1()      (PORTF |= SCK_SHTxx)     // PF0='float'   //置0
(0039) #define  SCK_status()    (PINF & SCK_SHTxx)     // read PF0 pin  //置1
(0040) //----------------------------------------------------------------------------------
(0041) 
(0042) void shxx_config()
(0043) { 
(0044)    //DDRF  &= ~DATA_SHTxx ;   // 输入模式(上电时为高电平)
(0045)   DDRF |= 0x02;//(1<<1)//DATA_SHTxx;       //配置为输出
_shxx_config:
    0079 91800061  LDS	R24,0x61
    007B 6082      ORI	R24,2
    007C 93800061  STS	0x61,R24
(0046)   PORTF |= 0x02;//(1<<1)//DATA_SHTxx ;   // 输出锁存器写0
    007E 91800062  LDS	R24,0x62
    0080 6082      ORI	R24,2
    0081 93800062  STS	0x62,R24
(0047)   
(0048)    
(0049)  // DDRF  &= ~SCK_SHTxx;   // 输入模式(上电时为高电平)  
(0050)   DDRF |=0x04;//(1<<2);// SCK_SHTxx;        //配置为输出
    0083 91800061  LDS	R24,0x61
    0085 6084      ORI	R24,4
    0086 93800061  STS	0x61,R24
(0051)   PORTF &= 0xfb;//~SCK_SHTxx;   // 输出锁存器写0
    0088 91800062  LDS	R24,0x62
    008A 7F8B      ANDI	R24,0xFB
    008B 93800062  STS	0x62,R24
    008D 9508      RET
_s_write_byte:
  merror               --> R20
  error                --> R10
  i                    --> R22
  value                --> R16
    008E 940E0403  CALL	push_xgset5
(0052)   
(0053) }
(0054) char s_write_byte(unsigned char value)
(0055) //----------------------------------------------------------------------------------
(0056) // writes a byte on the Sensibus and checks the acknowledge 
(0057) { 
(0058)   unsigned char i,error=0,merror=0;
    0090 24AA      CLR	R10
    0091 2744      CLR	R20
(0059)   DDRF |=0x06;  
    0092 91800061  LDS	R24,0x61
    0094 6086      ORI	R24,6
    0095 93800061  STS	0x61,R24
(0060)  // for (i=0x80;i>0;i/=2)
(0061) /*// while(i>0)             //shift bit for masking
(0062)   { if (i & value) PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
(0063)     else PORTF &=0xfd;//DATA=0;                        
(0064)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
(0065)     //_NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
(0066)     PORTF &=0xfb;//SCK=0;
(0067)     //i=i/2;
(0068)   }
(0069)   */
(0070)   PORTF |=0x02;
    0097 91800062  LDS	R24,0x62
    0099 6082      ORI	R24,2
    009A 93800062  STS	0x62,R24
(0071)   PORTF &=0xfb;
    009C 91800062  LDS	R24,0x62
    009E 7F8B      ANDI	R24,0xFB
    009F 93800062  STS	0x62,R24
(0072)   _NOP();_NOP();_NOP();
    00A1 0000      NOP
    00A2 0000      NOP
    00A3 0000      NOP
(0073)   i=0x80;             //shift bit for masking
    00A4 E860      LDI	R22,0x80
(0074)   { if (i & value) 
    00A5 2E26      MOV	R2,R22
    00A6 2220      AND	R2,R16
    00A7 F031      BEQ	0x00AE
(0075)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    00A8 91800062  LDS	R24,0x62
    00AA 6082      ORI	R24,2
    00AB 93800062  STS	0x62,R24
    00AD C005      RJMP	0x00B3
(0076)     else PORTF &=0xfd;//DATA=0;
    00AE 91800062  LDS	R24,0x62
    00B0 7F8D      ANDI	R24,0xFD
    00B1 93800062  STS	0x62,R24
(0077)     _NOP();_NOP();_NOP();                        
    00B3 0000      NOP
    00B4 0000      NOP
    00B5 0000      NOP
(0078)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    00B6 91800062  LDS	R24,0x62
    00B8 6084      ORI	R24,4
    00B9 93800062  STS	0x62,R24
(0079)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    00BB 0000      NOP
    00BC 0000      NOP
    00BD 0000      NOP
(0080)     PORTF &=0xfb;//SCK=0;
    00BE 91800062  LDS	R24,0x62
    00C0 7F8B      ANDI	R24,0xFB
    00C1 93800062  STS	0x62,R24
(0081)     
(0082)   }
(0083)   i=0x40;
    00C3 E460      LDI	R22,0x40
(0084)   { if (i & value) 
    00C4 2E26      MOV	R2,R22
    00C5 2220      AND	R2,R16
    00C6 F031      BEQ	0x00CD
(0085)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    00C7 91800062  LDS	R24,0x62
    00C9 6082      ORI	R24,2
    00CA 93800062  STS	0x62,R24
    00CC C005      RJMP	0x00D2
(0086)     else PORTF &=0xfd;//DATA=0; 
    00CD 91800062  LDS	R24,0x62
    00CF 7F8D      ANDI	R24,0xFD
    00D0 93800062  STS	0x62,R24
(0087)     _NOP();_NOP();_NOP();                       
    00D2 0000      NOP
    00D3 0000      NOP
    00D4 0000      NOP
(0088)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    00D5 91800062  LDS	R24,0x62
    00D7 6084      ORI	R24,4
    00D8 93800062  STS	0x62,R24
(0089)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    00DA 0000      NOP
    00DB 0000      NOP
    00DC 0000      NOP
(0090)     PORTF &=0xfb;//SCK=0;
    00DD 91800062  LDS	R24,0x62
    00DF 7F8B      ANDI	R24,0xFB
    00E0 93800062  STS	0x62,R24
(0091)     
(0092)   }
(0093)   i=0x20;
    00E2 E260      LDI	R22,0x20
(0094)   { if (i & value) 
    00E3 2E26      MOV	R2,R22
    00E4 2220      AND	R2,R16
    00E5 F031      BEQ	0x00EC
(0095)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    00E6 91800062  LDS	R24,0x62
    00E8 6082      ORI	R24,2
    00E9 93800062  STS	0x62,R24
    00EB C005      RJMP	0x00F1
(0096)     else PORTF &=0xfd;//DATA=0;
    00EC 91800062  LDS	R24,0x62
    00EE 7F8D      ANDI	R24,0xFD
    00EF 93800062  STS	0x62,R24
(0097)     _NOP();_NOP();_NOP();                       
    00F1 0000      NOP
    00F2 0000      NOP
    00F3 0000      NOP
(0098)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    00F4 91800062  LDS	R24,0x62
    00F6 6084      ORI	R24,4
    00F7 93800062  STS	0x62,R24
(0099)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    00F9 0000      NOP
    00FA 0000      NOP
    00FB 0000      NOP
(0100)     PORTF &=0xfb;//SCK=0;
    00FC 91800062  LDS	R24,0x62
    00FE 7F8B      ANDI	R24,0xFB
    00FF 93800062  STS	0x62,R24
(0101)    
(0102)   }
(0103)   i=0x10;
    0101 E160      LDI	R22,0x10
(0104)   { if (i & value) 
    0102 2E26      MOV	R2,R22
    0103 2220      AND	R2,R16
    0104 F031      BEQ	0x010B
(0105)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    0105 91800062  LDS	R24,0x62
    0107 6082      ORI	R24,2
    0108 93800062  STS	0x62,R24
    010A C005      RJMP	0x0110
(0106)     else PORTF &=0xfd;//DATA=0;
    010B 91800062  LDS	R24,0x62
    010D 7F8D      ANDI	R24,0xFD
    010E 93800062  STS	0x62,R24
(0107)     _NOP();_NOP();_NOP();                        
    0110 0000      NOP
    0111 0000      NOP
    0112 0000      NOP
(0108)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    0113 91800062  LDS	R24,0x62
    0115 6084      ORI	R24,4
    0116 93800062  STS	0x62,R24
(0109)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    0118 0000      NOP
    0119 0000      NOP
    011A 0000      NOP
(0110)     PORTF &=0xfb;//SCK=0;
    011B 91800062  LDS	R24,0x62
    011D 7F8B      ANDI	R24,0xFB
    011E 93800062  STS	0x62,R24
(0111)     
(0112)   }
(0113)   i=0x08;
    0120 E068      LDI	R22,0x8
(0114)   { if (i & value) 
    0121 2E26      MOV	R2,R22
    0122 2220      AND	R2,R16
    0123 F031      BEQ	0x012A
(0115)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    0124 91800062  LDS	R24,0x62
    0126 6082      ORI	R24,2
    0127 93800062  STS	0x62,R24
    0129 C005      RJMP	0x012F
(0116)     else PORTF &=0xfd;//DATA=0;
    012A 91800062  LDS	R24,0x62
    012C 7F8D      ANDI	R24,0xFD
    012D 93800062  STS	0x62,R24
(0117)     _NOP();_NOP();_NOP();                        
    012F 0000      NOP
    0130 0000      NOP
    0131 0000      NOP
(0118)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    0132 91800062  LDS	R24,0x62
    0134 6084      ORI	R24,4
    0135 93800062  STS	0x62,R24
(0119)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    0137 0000      NOP
    0138 0000      NOP
    0139 0000      NOP
(0120)     PORTF &=0xfb;//SCK=0;
    013A 91800062  LDS	R24,0x62
    013C 7F8B      ANDI	R24,0xFB
    013D 93800062  STS	0x62,R24
(0121)     
(0122)   }
(0123)   i=0x04;
    013F E064      LDI	R22,4
(0124)   { if (i & value) 
    0140 2E26      MOV	R2,R22
    0141 2220      AND	R2,R16
    0142 F031      BEQ	0x0149
(0125)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    0143 91800062  LDS	R24,0x62
    0145 6082      ORI	R24,2
    0146 93800062  STS	0x62,R24
    0148 C005      RJMP	0x014E
(0126)     else PORTF &=0xfd;//DATA=0;
    0149 91800062  LDS	R24,0x62
    014B 7F8D      ANDI	R24,0xFD
    014C 93800062  STS	0x62,R24
(0127)     _NOP();_NOP();_NOP();                        
    014E 0000      NOP
    014F 0000      NOP
    0150 0000      NOP
(0128)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    0151 91800062  LDS	R24,0x62
    0153 6084      ORI	R24,4
    0154 93800062  STS	0x62,R24
(0129)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    0156 0000      NOP
    0157 0000      NOP
    0158 0000      NOP
(0130)     PORTF &=0xfb;//SCK=0;
    0159 91800062  LDS	R24,0x62
    015B 7F8B      ANDI	R24,0xFB
    015C 93800062  STS	0x62,R24
(0131)     
(0132)   }
(0133)   i=0x02;
    015E E062      LDI	R22,2
(0134)   { if (i & value) 
    015F 2E26      MOV	R2,R22
    0160 2220      AND	R2,R16
    0161 F031      BEQ	0x0168
(0135)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    0162 91800062  LDS	R24,0x62
    0164 6082      ORI	R24,2
    0165 93800062  STS	0x62,R24
    0167 C005      RJMP	0x016D
(0136)     else PORTF &=0xfd;//DATA=0;
    0168 91800062  LDS	R24,0x62
    016A 7F8D      ANDI	R24,0xFD
    016B 93800062  STS	0x62,R24
(0137)     _NOP();_NOP();_NOP();                        
    016D 0000      NOP
    016E 0000      NOP
    016F 0000      NOP
(0138)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    0170 91800062  LDS	R24,0x62
    0172 6084      ORI	R24,4
    0173 93800062  STS	0x62,R24
(0139)     _NOP();_NOP();_NOP();        //pulswith approx. 5 us  	
    0175 0000      NOP
    0176 0000      NOP
    0177 0000      NOP
(0140)     PORTF &=0xfb;//SCK=0;
    0178 91800062  LDS	R24,0x62
    017A 7F8B      ANDI	R24,0xFB
    017B 93800062  STS	0x62,R24
(0141)     
(0142)   }
(0143)   i=0x01;
    017D E061      LDI	R22,1
(0144)   { if (i & value) 
    017E 2E26      MOV	R2,R22
    017F 2220      AND	R2,R16
    0180 F031      BEQ	0x0187
(0145)     PORTF |=0x02;//DATA=1;          //masking value with i , write to SENSI-BUS
    0181 91800062  LDS	R24,0x62
    0183 6082      ORI	R24,2
    0184 93800062  STS	0x62,R24
    0186 C005      RJMP	0x018C
(0146)     else PORTF &=0xfd;//DATA=0;                        
    0187 91800062  LDS	R24,0x62
    0189 7F8D      ANDI	R24,0xFD
    018A 93800062  STS	0x62,R24
(0147)     PORTF |=0x04;//SCK=1;                          //clk for SENSI-BUS
    018C 91800062  LDS	R24,0x62
    018E 6084      ORI	R24,4
    018F 93800062  STS	0x62,R24
(0148)     _NOP();_NOP();_NOP(); 
    0191 0000      NOP
    0192 0000      NOP
    0193 0000      NOP
(0149)        //pulswith approx. 5 us  	
(0150)     
(0151)     
(0152)   }
(0153)   
(0154)   PORTF |=0x02;//DATA=1;
    0194 91800062  LDS	R24,0x62
    0196 6082      ORI	R24,2
    0197 93800062  STS	0x62,R24
(0155)   DDRF &=0xfd;
    0199 91800061  LDS	R24,0x61
    019B 7F8D      ANDI	R24,0xFD
    019C 93800061  STS	0x61,R24
(0156)   _NOP();_NOP();_NOP();
    019E 0000      NOP
    019F 0000      NOP
    01A0 0000      NOP
(0157)   PORTF &=0xfb;//SCK=0;                           //release DATA-line
    01A1 91800062  LDS	R24,0x62
    01A3 7F8B      ANDI	R24,0xFB
    01A4 93800062  STS	0x62,R24
(0158)    
(0159)   _NOP();_NOP();_NOP();                           //clk #9 for ack 
    01A6 0000      NOP
    01A7 0000      NOP
    01A8 0000      NOP
(0160)   merror=PINF&0x02;//error=DATA;
    01A9 B140      IN	R20,0x00
    01AA 7042      ANDI	R20,2
(0161)   error=merror;
    01AB 2EA4      MOV	R10,R20
(0162)   PORTF |=0x04;//SCK=1;  
    01AC 91800062  LDS	R24,0x62
    01AE 6084      ORI	R24,4
    01AF 93800062  STS	0x62,R24
(0163)   _NOP();_NOP();_NOP();                     //check ack (DATA will be pulled down by SHT11)
    01B1 0000      NOP

⌨️ 快捷键说明

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