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

📄 ds18b20_lcd.lst

📁 基于AVR单片机的DS18B20测温程序.
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0196) *  功能:向总线写一个字节                                      *
(0197) *  输入:需要写的字                                            *
(0198) ***************************************************************/
(0199) void WriteBits(char Byte)
(0200) {
(0201)    char i = 0;
    015A 2744      CLR	R20
(0202)    for (i=0;i<8;i++)
    015B C007      RJMP	0x0163
(0203)    {
(0204)       if (Byte & 0x01)
    015C FF60      SBRS	R22,0
    015D C002      RJMP	0x0160
(0205) 	  {
(0206) 	     Writr1();
    015E DFEF      RCALL	_Writr1
(0207) 	  }
    015F C001      RJMP	0x0161
(0208) 	  else
(0209) 	  {
(0210) 	     Writr0();
    0160 DFE2      RCALL	_Writr0
(0211) 	  }
(0212) 	  Byte>>=1;
    0161 9566      LSR	R22
    0162 9543      INC	R20
    0163 3048      CPI	R20,0x8
    0164 F3B8      BCS	0x015C
    0165 D129      RCALL	pop_gset2
    0166 9508      RET
(0213)    }
(0214) }
(0215) 
(0216) /***************************************************************
(0217) *  功能:DS18B20复位程序                                       *
(0218) *  返回:总线复位成功,返回1                                   *
(0219) ***************************************************************/
(0220) char Reset1820(void)
(0221) {
(0222)    static char CheckTimes = 0;
(0223)    static char CheckValue = 1;
(0224)    delayus(664);
_Reset1820:
    0167 E908      LDI	R16,0x98
    0168 E012      LDI	R17,2
    0169 DF69      RCALL	_delayus
    016A D2A0      RCALL	0x040B
(0225)    Set_DQ1;
(0226)    Set_DQ0;                                  //拉低总线480us
(0227)    delayus(332);
    016B E40C      LDI	R16,0x4C
    016C E011      LDI	R17,1
    016D DF65      RCALL	_delayus
    016E D2B4      RCALL	0x0423
(0228)    Set_DQ1;
(0229)    DDRC  &= 0xf7;                            //设置端口为输入状态,读取数据
(0230)    PORTC |= 0x08;  
(0231)    while(PINC&0x08);                         //等待,直至确认复位成功
    016F 999B      SBIC	0x13,3
    0170 CFFE      RJMP	0x016F
(0232)    CheckValue = Read_DQ; 
    0171 B383      IN	R24,0x13
    0172 7088      ANDI	R24,0x8
    0173 93800061  STS	CheckValue,R24
(0233)    delayus(150);
    0175 E906      LDI	R16,0x96
    0176 E010      LDI	R17,0
    0177 DF5B      RCALL	_delayus
(0234)    return CheckValue;
    0178 91000061  LDS	R16,CheckValue
    017A 9508      RET
(0235) }
(0236) 
(0237) void Init1820(void)
(0238) {
(0239)  /*  if (Reset1820() == 0x08)
(0240)    {
(0241) 	  DisplayListChar(0,0,"1820 Not Detect $");
(0242) 	  DisplayListChar(0,1,"                $");
(0243)    }
(0244)    else
(0245)    {
(0246) 	  DisplayListChar(0,0,"Init DS18B20 OK!$");
(0247) 	  DisplayListChar(0,1,"                $");
(0248)    }	  
(0249)  */
(0250) 	  WriteBits(MatchROM);
_Init1820:
    017B EC0C      LDI	R16,0xCC
    017C DFDB      RCALL	_WriteBits
(0251) 	  WriteBits(WriteMode);
    017D E40E      LDI	R16,0x4E
    017E DFD9      RCALL	_WriteBits
(0252) 	  WriteBits(TH);
    017F E604      LDI	R16,0x64
    0180 DFD7      RCALL	_WriteBits
(0253) 	  WriteBits(TL);
    0181 E80A      LDI	R16,0x8A
    0182 DFD5      RCALL	_WriteBits
(0254) 	  WriteBits(MatchTemp);
    0183 E70F      LDI	R16,0x7F
    0184 DFD3      RCALL	_WriteBits
    0185 9508      RET
_ReadBit:
  i                    --> R20
  Read_Value           --> R20
    0186 D116      RCALL	push_gset1
(0255) }
(0256)   
(0257) /***************************************************************
(0258) *  功能:从总线中读取数据位                                    *
(0259) *  返回:读取值                                                *
(0260) ***************************************************************/
(0261) char ReadBit(void)
(0262) {
(0263)    char i = 0;
    0187 2744      CLR	R20
    0188 D282      RCALL	0x040B
(0264)    char Read_Value = 0;
(0265)    Set_DQ1;
(0266)    Set_DQ0;
(0267)    asm("nop");
    0189 0000      NOP
(0268)    asm("nop");
    018A 0000      NOP
(0269)    asm("nop");
    018B 0000      NOP
    018C D25F      RCALL	<created procedures>
    018D D295      RCALL	0x0423
(0270)    asm("nop");
(0271)    asm("nop");
(0272)    asm("nop");
(0273)    asm("nop");
(0274)    asm("nop");
(0275)    asm("nop");
(0276)    asm("nop");
(0277)    asm("nop");
(0278) 
(0279)    Set_DQ1;
(0280)    
(0281)    DDRC  &= 0xf7;              //设置端口为输入状态,读取数据
(0282)    PORTC |= 0x08;
(0283) 
(0284)    Read_Value = Read_DQ;
    018E B343      IN	R20,0x13
    018F 7048      ANDI	R20,0x8
(0285)    asm("nop");
    0190 0000      NOP
(0286)    asm("nop");
    0191 0000      NOP
(0287)    delayus(30);
    0192 E10E      LDI	R16,0x1E
    0193 E010      LDI	R17,0
    0194 DF3E      RCALL	_delayus
(0288)    return Read_Value;
    0195 2F04      MOV	R16,R20
    0196 D109      RCALL	pop_gset1
    0197 9508      RET
_ReadBits:
  b                    --> R20
  i                    --> R22
  ReadBits_Value       --> R10
    0198 D100      RCALL	push_gset3
(0289) }
(0290) 
(0291) 
(0292) /***************************************************************
(0293) *  功能:从总线读取一个字节                                    *
(0294) *  返回:读取到的字符                                          *
(0295) ***************************************************************/
(0296) char ReadBits(void)
(0297) {
(0298)    char i = 0;
    0199 2766      CLR	R22
(0299)    char b = 0;
    019A 2744      CLR	R20
(0300)    char ReadBits_Value = 0;
    019B 24AA      CLR	R10
(0301)    for (i=8;i>0;i--)
    019C E068      LDI	R22,0x8
    019D C009      RJMP	0x01A7
(0302)    {
(0303)       ReadBits_Value = ReadBits_Value>>1;
    019E 94A6      LSR	R10
(0304) 	  b = ReadBit();
    019F DFE6      RCALL	_ReadBit
    01A0 2F40      MOV	R20,R16
(0305) 	  if(b)
    01A1 2300      TST	R16
    01A2 F019      BEQ	0x01A6
(0306) 	  {
(0307) 	     ReadBits_Value = ReadBits_Value|0x80;
    01A3 2D8A      MOV	R24,R10
    01A4 6880      ORI	R24,0x80
    01A5 2EA8      MOV	R10,R24
    01A6 956A      DEC	R22
    01A7 2422      CLR	R2
    01A8 1626      CP	R2,R22
    01A9 F3A0      BCS	0x019E
(0308) 	  }
(0309) 	  
(0310)    }
(0311)    //DEC_Num_Disp(0,1,ReadBits_Value,5);
(0312)    return ReadBits_Value;   
    01AA 2D0A      MOV	R16,R10
    01AB D0E5      RCALL	pop_gset3
    01AC 9508      RET
_Get_Temperature:
  i                    --> Y+3
    01AD 9722      SBIW	R28,2
(0313) }
(0314) 
(0315) /***************************************************************
(0316) *  功能:获得温度值                                            *
(0317) *  返回:温度值--摄氏温度                                      *
(0318) ***************************************************************/
(0319) void Get_Temperature(void)
(0320) {  
(0321)    uint i;
(0322)    static int TempLow = 0;
(0323)    static int TempHi = 0;
(0324)    static char Temp2 = 0;
(0325)    static long final = 0;
(0326)    Reset1820();
    01AE DFB8      RCALL	_Reset1820
(0327)    WriteBits(MatchROM);
    01AF EC0C      LDI	R16,0xCC
    01B0 DFA7      RCALL	_WriteBits
(0328)    WriteBits(ConverTem);
    01B1 E404      LDI	R16,0x44
    01B2 DFA5      RCALL	_WriteBits
(0329)    //for(i=0;i<20;i++)
(0330)    //delayus(66);
(0331)    
(0332)    Reset1820();
    01B3 DFB3      RCALL	_Reset1820
(0333)    WriteBits(MatchROM);
    01B4 EC0C      LDI	R16,0xCC
    01B5 DFA2      RCALL	_WriteBits
(0334)    WriteBits(Get_Value);
    01B6 EB0E      LDI	R16,0xBE
    01B7 DFA0      RCALL	_WriteBits
(0335)    //for(i=0;i<20;i++)
(0336)    delayus(70);
    01B8 E406      LDI	R16,0x46
    01B9 E010      LDI	R17,0
    01BA DF18      RCALL	_delayus
(0337)    TempLow = ReadBits();                //温度低位
    01BB DFDC      RCALL	_ReadBits
    01BC 2E20      MOV	R2,R16
    01BD 2433      CLR	R3
    01BE 92300063  STS	TempLow+1,R3
    01C0 92200062  STS	TempLow,R2
(0338)    delayus(70);
    01C2 E406      LDI	R16,0x46
    01C3 E010      LDI	R17,0
    01C4 DF0E      RCALL	_delayus
(0339)    TempHi = ReadBits();
    01C5 DFD2      RCALL	_ReadBits
    01C6 2E20      MOV	R2,R16
    01C7 2433      CLR	R3
    01C8 92300065  STS	TempHi+1,R3
    01CA 92200064  STS	TempHi,R2
(0340)                                        //温度高位
(0341)    
(0342) 
(0343)    final = (((TempHi)<<8)|TempLow)*0.0625;
    01CC E206      LDI	R16,0x26
    01CD E010      LDI	R17,0
    01CE D0EE      RCALL	lpm32
    01CF D24E      RCALL	0x041E
    01D0 90200062  LDS	R2,TempLow
    01D2 90300063  LDS	R3,TempLow+1
    01D4 91000064  LDS	R16,TempHi
    01D6 91100065  LDS	R17,TempHi+1
    01D8 2F10      MOV	R17,R16
    01D9 2700      CLR	R16
    01DA 2902      OR	R16,R2
    01DB 2913      OR	R17,R3
    01DC D12F      RCALL	int2fp
    01DD D240      RCALL	0x041E
    01DE D189      RCALL	empy32f
    01DF D0FC      RCALL	fp2long
    01E0 93100068  STS	final+1,R17
    01E2 93000067  STS	final,R16
    01E4 9330006A  STS	final+3,R19
    01E6 93200069  STS	final+2,R18
(0344) 
(0345) 
(0346)   
(0347)    process(final,data);
    01E8 EC80      LDI	R24,0xC0
    01E9 E090      LDI	R25,0
    01EA 8399      STD	Y+1,R25
    01EB 8388      STD	Y+0,R24
    01EC DE7D      RCALL	_process
(0348)    DisplayListChar(3,1,data);
    01ED EC80      LDI	R24,0xC0
    01EE D23B      RCALL	0x042A
    01EF E003      LDI	R16,3
    01F0 DF32      RCALL	_DisplayListChar
    01F1 9622      ADIW	R28,2
    01F2 9508      RET
(0349) }
(0350) 
(0351) //call this routine to initialize all peripherals
(0352) void init_devices(void)
(0353) {
(0354)     //stop errant interrupts until set up
(0355)     CLI(); //disable all interrupts
_init_devices:
    01F3 94F8      BCLR	7
(0356)     port_init();
    01F4 DEE5      RCALL	_port_init
(0357)     LCMInit(); 				  		      //清屏
    01F5 DF10      RCALL	_LCMInit
(0358)     MCUCR = 0x00;
    01F6 2422      CLR	R2
    01F7 BE25      OUT	0x35,R2
(0359)     GICR  = 0x00;
    01F8 BE2B      OUT	0x3B,R2
(0360)     TIMSK = 0x04; //timer interrupt sources
    01F9 E084      LDI	R24,4
    01FA BF89      OUT	0x39,R24
(0361)     SEI(); //re-enable interrupts
    01FB 9478      BSET	7
    01FC 9508      RET
_main:
  i                    --> R20
    01FD 9722      SBIW	R28,2
(0362)     //all peripherals are now initialized
(0363) }
(0364) 
(0365) void main(void)
(0366) {
(0367)    uchar i;
(0368)    init_devices();
    01FE DFF4      RCALL	_init_devices
(0369)    /*
(0370)    delayms(5);
(0371)    DisplayListChar(0,0,"Reset after sure$");
(0372)    DisplayListChar(0,1,"        C       $");
(0373)    Init1820();  
(0374)    delayms(10);
(0375)    */
(0376)    DisplayListChar(0,0,"DS18B20+LCD$");  
    01FF EB83      LDI	R24,0xB3
    0200 D217      RCALL	0x0418
    0201 DF21      RCALL	_DisplayListChar
(0377)    DisplayListChar(0,1,"Made by zhang_he$"); 
    0202 EA81      LDI	R24,0xA1
    0203 D226      RCALL	0x042A
    0204 2700      CLR	R16
    0205 DF1D      RCALL	_DisplayListChar
(0378)    delayms(80);
    0206 E500      LDI	R16,0x50
    0207 E010      LDI	R17,0
    0208 DEB8      RCALL	_delayms
(0379)    DisplayListChar(0,0,"Press the button$");
    0209 E88F      LDI	R24,0x8F
    020A D20D      RCALL	0x0418
    020B DF17      RCALL	_DisplayListChar
(0380)    while(PIND!=0xfe);		   
    020C B380      IN	R24,0x10
    020D 3F8E      CPI	R24,0xFE
    020E F7E9      BNE	0x020C
(0381)    DisplayListChar(0,0," Now Temp:      $");
    020F E78D      LDI	R24,0x7D
    0210 D207      RCALL	0x0418
    0211 DF11      RCALL	_DisplayListChar
(0382)    DisplayListChar(0,1,"        C       $");
    0212 E68B      LDI	R24,0x6B
    0213 D216      RCALL	0x042A
    0214 2700      CLR	R16
    0215 DF0D      RCALL	_DisplayListChar
(0383) 
(0384)   for(i=0;;i++)
    0216 2744      CLR	R20
(0385)    {
(0386) 	  Get_Temperature();
FILE: <library>
    0217 DF95      RCALL	_Get_Temperature
    0218 9543      INC	R20
    0219 CFFD      RJMP	0x0217
    021A 9622      ADIW	R28,2
    021B 9508      RET
push_arg4:
    021C D201      RCALL	0x041E
push_arg2:
    021D 9508      RET
div32u:
    021E 94E8      BCLR	6
    021F C001      RJMP	0x0221
mod32u:
    0220 9468      BSET	6
    0221 D02F      RCALL	long_div_prolog
    0222 24CC      CLR	R12
    0223 C008      RJMP	0x022C
div32s:
    0224 94E8      BCLR	6
    0225 C001      RJMP	0x0227
mod32s:
    0226 9468      BSET	6
    0227 D029      RCALL	long_div_prolog
    0228 FD37      SBRC	R19,7
    0229 D053      RCALL	neg_R16_R19
    022A FDB7      SBRC	R27,7
    022B D05A      RCALL	neg_R24_R27
    022C 2477      CLR	R7
    022D 2488      CLR	R8
    022E 2499      CLR	R9
    022F 24AA      CLR	R10
    0230 24BB      CLR	R11
    0231 D041      RCALL	tst_R16_R19
    0232 F0C1      BEQ	0x024B
    0233 D044      RCALL	tst_R24_R27
    0234 F0B1      BEQ	0x024B
    0235 E2E8      LDI	R30,0x28
    0236 0F00      LSL	R16
    0237 1F11      ROL	R17
    0238 1F22      ROL	R18
    0239 1F33      ROL	R19
    023A 1C77      ROL	R7
    023B 1C88      ROL	R8
    023C 1C99      ROL	R9
    023D 1CAA      ROL	R10
    023E 1CBB      ROL	R11
    023F 1688      CP	R8,R24
    0240 0699      CPC	R9,R25
    0241 06AA      CPC	R10,R26
    0242 06BB      CPC	R11,R27
    0243 F028      BCS	0x0249
    0244 1A88      SUB	R8,R24
    0245 0A99      SBC	R9,R25
    0246 0AAA      SBC	R10,R26
    0247 0ABB      SBC	R11,R27
    0248 9503      INC	R16
    0249 95EA      DEC	R30
    024A F759      BNE	0x0236
    024B F426      BRTC	0x0250
    024C 2D08      MOV	R16,R8
    024D 2D19      MOV	R17,R9
    024E 2D2A      MOV	R18,R10
    024F 2D3B      MOV	R19,R11
    0250 C013      RJMP	long_div_epilog
long_div_prolog:
    0251 927A      ST	R7,-Y
    0252 928A      ST	R8,-Y
    0253 929A      ST	R9,-Y
    0254 92AA      ST	R10,-Y
    0255 92BA      ST	R11,-Y
    0256 92CA      ST	R12,-Y
    0257 93EA      ST	R30,-Y
    0258 938A      ST	R24,-Y
    0259 939A      ST	R25,-Y
    025A 93AA      ST	R26,-Y
    025B 93BA      ST	R27,-Y
    025C 858B      LDD	R24,Y+11
    025D 859C      LDD	R25,Y+12
    025E 85AD      LDD	R26,Y+13
    025F 85BE      LDD	R27,Y+14
    0260 2EC3      MOV	R12,R19
    0261 F00E      BRTS	0x0263
    0262 26CB      EOR	R12,R27
    0263 9508      RET
long_div_epilog:
    0264 FCC7      SBRC	R12,7
    0265 D017      RCALL	neg_R16_R19
    0266 91B9      LD	R27,Y+
    0267 91A9      LD	R26,Y+
    0268 9199      LD	R25,Y+
    0269 9189      LD	R24,Y+
    026A 91E9      LD	R30,Y+
    026B 90C9      LD	R12,Y+
    026C 90B9      LD	R11,Y+
    026D 90A9      LD	R10,Y+
    026E 9099      LD	R9,Y+
    026F 9089      LD	R8,Y+
    0270 9079      LD	R7,Y+
    0271 9624      ADIW	R28,4
    0272 9508      RET
tst_R16_R19:
    0273 2FE0      MOV	R30,R16
    0274 2BE1      OR	R30,R17
    0275 2BE2      OR	R30,R18
    0276 2BE3      OR	R30,R19
    0277 9508      RET
tst_R24_R27:
    0278 2FE8      MOV	R30,R24
    0279 2BE9      OR	R30,R25
    027A 2BEA      OR	R30,R26
    027B 2BEB      OR	R30,R27
    027C 9508      RET
neg_R16_R19:
    027D 9500      COM	R16
    027E 9510      COM	R17
    027F 9520      COM	R18
    0280 9530      COM	R19
    0281 5F0F      SUBI	R16,0xFF
    0282 4F1F      SBCI	R17,0xFF
    0283 4F2F      SBCI	R18,0xFF

⌨️ 快捷键说明

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