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

📄 ds18b20.lst

📁 DS18B20温度监控程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
     14D E081      LDI	R24,1
     14E 9380 006E STS	0x006E,R24
(0145)  TCNT0=0xce;  //  (1024/16,000,000)*50=3.2ms
     150 EC8E      LDI	R24,0xCE
     151 BD86      OUT	0x26,R24
(0146)  TCCR0B=0x05; //   clk/1024
     152 E085      LDI	R24,5
     153 BD85      OUT	0x25,R24
(0147)  /*T/C1*/
(0148)  TCCR1A=0x00;
     154 9220 0080 STS	0x0080,R2
(0149)  TIMSK1=0x01;
     156 E081      LDI	R24,1
     157 9380 006F STS	0x006F,R24
(0150)  TCNT1=0xfd8f;  //10ms
     159 E88F      LDI	R24,0x8F
     15A EF9D      LDI	R25,0xFD
     15B 9390 0085 STS	0x0085,R25
     15D 9380 0084 STS	0x0084,R24
(0151)  TCCR1B=0x04; //  clk/256
     15F E084      LDI	R24,4
     160 9380 0081 STS	0x0081,R24
(0152)  /*通信口初始化*/
(0153)  UartInit();
     162 C0CF      RJMP	_UartInit
(0154) }
(0155) /*数据转换函数*/
(0156) void convert(void)
(0157) {timeb1=time1/100;
_convert:
     163 E614      LDI	R17,0x64
     164 9100 011A LDS	R16,time1
     166 D0ED      RCALL	div8u
     167 9300 0118 STS	timeb1,R16
(0158)  timeb2=time1%100/10;
     169 E614      LDI	R17,0x64
     16A 9100 011A LDS	R16,time1
     16C D0E5      RCALL	mod8u
     16D E01A      LDI	R17,0xA
     16E D0E5      RCALL	div8u
     16F 9300 0117 STS	timeb2,R16
(0159)  timeb3=time1%10;
     171 E01A      LDI	R17,0xA
     172 9100 011A LDS	R16,time1
     174 D0DD      RCALL	mod8u
     175 9300 0116 STS	timeb3,R16
(0160)  timeb4=time2/100;
     177 E614      LDI	R17,0x64
     178 9100 0119 LDS	R16,time2
     17A D0D9      RCALL	div8u
     17B 9300 0115 STS	timeb4,R16
(0161)  timeb5=time2%100/10;
     17D E614      LDI	R17,0x64
     17E 9100 0119 LDS	R16,time2
     180 D0D1      RCALL	mod8u
     181 E01A      LDI	R17,0xA
     182 D0D1      RCALL	div8u
     183 9300 0114 STS	timeb5,R16
(0162)  timeb6=time2%10;
     185 E01A      LDI	R17,0xA
     186 9100 0119 LDS	R16,time2
     188 D0C9      RCALL	mod8u
     189 9300 0113 STS	timeb6,R16
     18B 9508      RET
(0163) }
(0164) /*****************单总线时序**************/
(0165) /*初始化*/
(0166) void Init_1wire(void)
(0167) {flag = SREG;				/*中断保护*/
_Init_1wire:
     18C B62F      IN	R2,0x3F
     18D 9220 011B STS	flag,R2
(0168)  CLI();	
     18F 94F8      BCLR	7
(0169)  					/*关中断*/
(0170)  DRC(1);              //Out
     190 9A38      SBI	0x07,0
(0171)  DQ(1);
     191 9A40      SBI	0x08,0
(0172)  NOP();    //DQ拉低480-960US,接着将数据线拉高15-60US
     192 0000      NOP
(0173)  DQ(0);
     193 B188      IN	R24,0x08
     194 7F8E      ANDI	R24,0xFE
     195 B988      OUT	0x08,R24
(0174)  delay_10us(56);   
     196 E308      LDI	R16,0x38
     197 D05B      RCALL	_delay_10us
(0175)  DQ(1);
     198 9A40      SBI	0x08,0
(0176)  DRC(0);        //In  释放总线  此时上拉电阻使能
     199 B187      IN	R24,0x07
     19A 7F8E      ANDI	R24,0xFE
     19B B987      OUT	0x07,R24
(0177)  delay_10us(7);            
     19C E007      LDI	R16,7
     19D D055      RCALL	_delay_10us
(0178)  while(PINC & 0x01);
     19E 9930      SBIC	0x06,0
     19F CFFE      RJMP	0x019E
(0179)  delay_10us(50);     //presence pulse 60-240us  480us min
     1A0 E302      LDI	R16,0x32
     1A1 D051      RCALL	_delay_10us
(0180)  
(0181)  if (flag & 0x80) 
     1A2 9020 011B LDS	R2,flag
     1A4 FE27      SBRS	R2,7
     1A5 C001      RJMP	0x01A7
(0182)    {SEI();  /*恢复中断状态*/
     1A6 9478      BSET	7
(0183)    }
     1A7 9508      RET
_WriteByte_1wire:
  temp                 --> R10
  i                    --> R20
  data                 --> R12
     1A8 D0C1      RCALL	push_xgset303C
     1A9 2EC0      MOV	R12,R16
(0184) }
(0185) /*写字节*/                    
(0186) void WriteByte_1wire(uchar data)
(0187) {uchar i,temp;
(0188)  temp=data;
     1AA 2CAC      MOV	R10,R12
(0189)  
(0190)  flag = SREG;				/*中断保护*/
     1AB B62F      IN	R2,0x3F
     1AC 9220 011B STS	flag,R2
(0191)  CLI();	
     1AE 94F8      BCLR	7
(0192)  
(0193)  DRC(1);
     1AF 9A38      SBI	0x07,0
(0194)  for(i=0;i<8;i++)
     1B0 2744      CLR	R20
     1B1 C00E      RJMP	0x01C0
(0195)   {DQ(1);
     1B2 9A40      SBI	0x08,0
(0196)    NOP();
     1B3 0000      NOP
(0197)    DQ(0);               //写时间隙开始
     1B4 B188      IN	R24,0x08
     1B5 7F8E      ANDI	R24,0xFE
     1B6 B988      OUT	0x08,R24
(0198)    delay_10us(1);
     1B7 E001      LDI	R16,1
     1B8 D03A      RCALL	_delay_10us
(0199)    if(temp&0x01)DQ(1);
     1B9 FEA0      SBRS	R10,0
     1BA C001      RJMP	0x01BC
     1BB 9A40      SBI	0x08,0
(0200)    //else DQ(0);
(0201)    temp>>=1;             //LSB First
     1BC 94A6      LSR	R10
(0202)    delay_10us(7);
     1BD E007      LDI	R16,7
     1BE D034      RCALL	_delay_10us
     1BF 9543      INC	R20
     1C0 3048      CPI	R20,0x8
     1C1 F380      BCS	0x01B2
(0203)   }
(0204)  DQ(1);
     1C2 9A40      SBI	0x08,0
(0205)  
(0206)  if (flag & 0x80) 
     1C3 9020 011B LDS	R2,flag
     1C5 FE27      SBRS	R2,7
     1C6 C001      RJMP	0x01C8
(0207)    {SEI();  /*恢复中断状态*/
     1C7 9478      BSET	7
(0208)    }  
     1C8 C0A8      RJMP	pop_xgset303C
_ReadByte_1wire:
  data                 --> R20
  i                    --> R22
     1C9 934A      ST	R20,-Y
     1CA 936A      ST	R22,-Y
(0209) }
(0210) /*读字节*/                   
(0211) uchar ReadByte_1wire(void)
(0212) {uchar i,data=0;
     1CB 2744      CLR	R20
(0213) 
(0214)  flag = SREG;				/*中断保护*/
     1CC B62F      IN	R2,0x3F
     1CD 9220 011B STS	flag,R2
(0215)  CLI();
     1CF 94F8      BCLR	7
(0216)  
(0217)  for(i=0;i<8;i++)
     1D0 2766      CLR	R22
     1D1 C014      RJMP	0x01E6
(0218)   {data>>=1;            //处理方法:先右移  后将最高位与 0x80相或 !!!
     1D2 9546      LSR	R20
(0219)    DRC(1);              
     1D3 9A38      SBI	0x07,0
(0220)    DQ(1);
     1D4 9A40      SBI	0x08,0
(0221)    NOP();
     1D5 0000      NOP
(0222)    DQ(0);
     1D6 B188      IN	R24,0x08
     1D7 7F8E      ANDI	R24,0xFE
     1D8 B988      OUT	0x08,R24
(0223)    delay_1us();        //delay 3us
     1D9 D028      RCALL	_delay_1us
(0224)    delay_1us();
     1DA D027      RCALL	_delay_1us
(0225)    //DQ(1);
(0226)    DRC(0);
     1DB B187      IN	R24,0x07
     1DC 7F8E      ANDI	R24,0xFE
     1DD B987      OUT	0x07,R24
(0227)    delay_10us(1);
     1DE E001      LDI	R16,1
     1DF D013      RCALL	_delay_10us
(0228)    if(PINC&0x01)data|=0x80;
     1E0 9B30      SBIS	0x06,0
     1E1 C001      RJMP	0x01E3
     1E2 6840      ORI	R20,0x80
(0229)    delay_10us(6);
     1E3 E006      LDI	R16,6
     1E4 D00E      RCALL	_delay_10us
     1E5 9563      INC	R22
     1E6 3068      CPI	R22,0x8
     1E7 F350      BCS	0x01D2
(0230)    
(0231)   }
(0232)  DRC(1);
     1E8 9A38      SBI	0x07,0
(0233)  DQ(1);
     1E9 9A40      SBI	0x08,0
(0234)  
(0235)  if (flag & 0x80) 
     1EA 9020 011B LDS	R2,flag
     1EC FE27      SBRS	R2,7
     1ED C001      RJMP	0x01EF
(0236)    {SEI();  /*恢复中断状态*/
     1EE 9478      BSET	7
(0237)    } 
(0238)  return(data);   
     1EF 2F04      MOV	R16,R20
     1F0 9169      LD	R22,Y+
     1F1 9149      LD	R20,Y+
     1F2 9508      RET
_delay_10us:
  i                    --> R10
  j                    --> R20
  n                    --> R16
     1F3 92AA      ST	R10,-Y
     1F4 934A      ST	R20,-Y
(0239) }
(0240) /********************************************************/
(0241) 
(0242) /* n*10us  
(0243)  通过AVR Studio仿真*/
(0244) void delay_10us(uchar n)
(0245) {uchar i,j;
(0246)  for(i=0;i<n;i++)
     1F5 24AA      CLR	R10
     1F6 C006      RJMP	0x01FD
(0247)    for(j=0;j<38;j++);
     1F7 2744      CLR	R20
     1F8 C001      RJMP	0x01FA
     1F9 9543      INC	R20
     1FA 3246      CPI	R20,0x26
     1FB F3E8      BCS	0x01F9
     1FC 94A3      INC	R10
     1FD 16A0      CP	R10,R16
     1FE F3C0      BCS	0x01F7
     1FF 9149      LD	R20,Y+
     200 90A9      LD	R10,Y+
     201 9508      RET
(0248) }
(0249) /* 1.75us */
(0250) void delay_1us(void)
(0251) {uchar i;
(0252)  for(i=0;i<4;i++);
_delay_1us:
  i                    --> R16
     202 2700      CLR	R16
     203 C001      RJMP	0x0205
     204 9503      INC	R16
     205 3004      CPI	R16,4
     206 F3E8      BCS	0x0204
     207 9508      RET
_UartRece_int:
     208 922A      ST	R2,-Y
     209 923A      ST	R3,-Y
     20A 938A      ST	R24,-Y
     20B 939A      ST	R25,-Y
     20C 93EA      ST	R30,-Y
     20D 93FA      ST	R31,-Y
     20E B62F      IN	R2,0x3F
     20F 922A      ST	R2,-Y
(0253) }
(0254) /********************************通信部分*************************/
(0255) void UartRece_int(void)
(0256) {if(count3<2)Rece[count3++]=UDR0;
     210 9180 010C LDS	R24,count3
     212 3082      CPI	R24,2
     213 F478      BCC	0x0223
     214 2E28      MOV	R2,R24
     215 2433      CLR	R3
     216 5F8F      SUBI	R24,0xFF
     217 9380 010C STS	count3,R24
     219 E181      LDI	R24,0x11
     21A E091      LDI	R25,1
     21B 2DE2      MOV	R30,R2
     21C 27FF      CLR	R31
     21D 0FE8      ADD	R30,R24
     21E 1FF9      ADC	R31,R25
     21F 9020 00C6 LDS	R2,0x00C6
     221 8220      STD	Z+0,R2
     222 C006      RJMP	0x0229
(0257)  else 
(0258)    {count3=0;
     223 2422      CLR	R2
     224 9220 010C STS	count3,R2
(0259)     flag1=1;
     226 E081      LDI	R24,1
     227 9380 010D STS	flag1,R24
(0260)    }                	
     229 9029      LD	R2,Y+
     22A BE2F      OUT	0x3F,R2
     22B 91F9      LD	R31,Y+
     22C 91E9      LD	R30,Y+
     22D 9199      LD	R25,Y+
     22E 9189      LD	R24,Y+
     22F 9039      LD	R3,Y+
     230 9029      LD	R2,Y+
     231 9518      RETI
(0261) }
(0262) /**************串口初始化函数*****************/
(0263) void UartInit(void)
(0264) {
(0265)  /* 设置波特率*/
(0266)  UBRR0H = 0x00;   /*9600 U2X0=0  103*/
_UartInit:
     232 2422      CLR	R2
     233 9220 00C5 STS	0x00C5,R2
(0267)  UBRR0L = 0x67;
     235 E687      LDI	R24,0x67
     236 9380 00C4 STS	0x00C4,R24
(0268)  /* 接收中断使能  接收器与发送器使能*/
(0269)  UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
     238 E988      LDI	R24,0x98
     239 9380 00C1 STS	0x00C1,R24
(0270)  /* 设置帧格式: 8 个数据位, 1 个停止位 */
(0271)  UCSR0C = (3<<UCSZ00);
     23B E086      LDI	R24,6
     23C 9380 00C2 STS	0x00C2,R24
     23E 9508      RET
_UartSend:
  i                    --> R10
  length               --> R18
  a                    --> R16
     23F 92AA      ST	R10,-Y
(0272) }
(0273) /****************串行发送函数****************/
(0274) void UartSend(uchar a[],uchar length)
(0275) {uchar i;
(0276)  for(i=0;i<length;i++)
     240 24AA      CLR	R10
     241 C00C      RJMP	0x024E
(0277)   {/* 等待发送缓冲器为空*/
(0278)    while ( !( UCSR0A & (1<<UDRE0)) );
     242 9020 00C0 LDS	R2,0x00C0
     244 FE25      SBRS	R2,5
     245 CFFC      RJMP	0x0242
(0279)    /* 将数据放入缓冲器,发送数据*/
(0280)    UDR0=a[i];
FILE: <library>
     246 2DEA      MOV	R30,R10
     247 27FF      CLR	R31
     248 0FE0      ADD	R30,R16
     249 1FF1      ADC	R31,R17
     24A 8020      LDD	R2,Z+0
     24B 9220 00C6 STS	0x00C6,R2
     24D 94A3      INC	R10
     24E 16A2      CP	R10,R18
     24F F390      BCS	0x0242
     250 90A9      LD	R10,Y+
     251 9508      RET
mod8u:
     252 9468      BSET	6
     253 C001      RJMP	xdiv8u
div8u:
     254 94E8      BCLR	6
xdiv8u:
     255 932A      ST	R18,-Y
     256 92FA      ST	R15,-Y
     257 92EA      ST	R14,-Y
     258 24FF      CLR	R15
     259 24EE      CLR	R14
     25A E120      LDI	R18,0x10
     25B 0F00      LSL	R16
     25C 1CFF      ROL	R15
     25D 1CEE      ROL	R14
     25E 16E1      CP	R14,R17
     25F F010      BCS	0x0262
     260 1AE1      SUB	R14,R17
     261 9503      INC	R16
     262 952A      DEC	R18
     263 F7B9      BNE	0x025B
     264 F40E      BRTC	0x0266
     265 2D0E      MOV	R16,R14
     266 90E9      LD	R14,Y+
     267 90F9      LD	R15,Y+
     268 9129      LD	R18,Y+
     269 9508      RET
push_xgset303C:
     26A 935A      ST	R21,-Y
     26B 934A      ST	R20,-Y
     26C 92DA      ST	R13,-Y
     26D 92CA      ST	R12,-Y
     26E 92BA      ST	R11,-Y
     26F 92AA      ST	R10,-Y
     270 9508      RET
pop_xgset303C:
     271 90A9      LD	R10,Y+
     272 90B9      LD	R11,Y+
     273 90C9      LD	R12,Y+
     274 90D9      LD	R13,Y+
     275 9149      LD	R20,Y+
     276 9159      LD	R21,Y+
     277 9508      RET

⌨️ 快捷键说明

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