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

📄 111.lst

📁 温度测量ds18b20.rar
💻 LST
字号:
__start:
__text_start:
      13 E5CF      LDI	R28,0x5F
      14 E0D4      LDI	R29,4
      15 BFCD      OUT	0x3D,R28
      16 BFDE      OUT	0x3E,R29
      17 51CE      SUBI	R28,0x1E
      18 40D0      SBCI	R29,0
      19 EA0A      LDI	R16,0xAA
      1A 8308      STD	Y+0,R16
      1B 2400      CLR	R0
      1C E6E0      LDI	R30,0x60
      1D E0F0      LDI	R31,0
      1E E010      LDI	R17,0
      1F 36E0      CPI	R30,0x60
      20 07F1      CPC	R31,R17
      21 F011      BEQ	0x0024
      22 9201      ST	R0,Z+
      23 CFFB      RJMP	0x001F
      24 8300      STD	Z+0,R16
      25 E2E6      LDI	R30,0x26
      26 E0F0      LDI	R31,0
      27 E6A0      LDI	R26,0x60
      28 E0B0      LDI	R27,0
      29 E010      LDI	R17,0
      2A E000      LDI	R16,0
      2B BF0B      OUT	0x3B,R16
      2C 32E6      CPI	R30,0x26
      2D 07F1      CPC	R31,R17
      2E F021      BEQ	0x0033
      2F 95C8      LPM
      30 9631      ADIW	R30,1
      31 920D      ST	R0,X+
      32 CFF9      RJMP	0x002C
      33 D027      RCALL	_main
_exit:
      34 CFFF      RJMP	_exit
_delay1s:
  i                    --> R16
  j                    --> R18
  k                    --> R20
      35 934A      ST	R20,-Y
FILE: D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\111.c
(0001) //ICC-AVR application builder : 2008/11/19 20:51:44
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include "mydelay.h"
(0008) #include "ds18b20.h"
(0009) 
(0010) void delay1s(void)
(0011) {
(0012)  unsigned char i,j,k;
(0013)  for (i=100;i>0;i--)
      36 E604      LDI	R16,0x64
      37 C00D      RJMP	0x0045
(0014)   for (j=100;j>0;j--)
      38 E624      LDI	R18,0x64
      39 C007      RJMP	0x0041
(0015)    for (k=20;k>0;k--)
      3A E144      LDI	R20,0x14
      3B C001      RJMP	0x003D
      3C 954A      DEC	R20
      3D E080      LDI	R24,0
      3E 1784      CP	R24,R20
      3F F3E0      BCS	0x003C
      40 952A      DEC	R18
      41 E080      LDI	R24,0
      42 1782      CP	R24,R18
      43 F3B0      BCS	0x003A
      44 950A      DEC	R16
      45 E080      LDI	R24,0
      46 1780      CP	R24,R16
      47 F380      BCS	0x0038
      48 9149      LD	R20,Y+
      49 9508      RET
(0016)     ;
(0017) }
(0018) void port_init(void)
(0019) {
(0020)  PORTB = 0x00;
_port_init:
      4A 2422      CLR	R2
      4B BA28      OUT	0x18,R2
(0021)  DDRB  = 0xff;
      4C EF8F      LDI	R24,0xFF
      4D BB87      OUT	0x17,R24
(0022)  PORTC = 0x00; //m103 output only
      4E BA25      OUT	0x15,R2
(0023)  DDRC  = 0x00;
      4F BA24      OUT	0x14,R2
(0024)  PORTD = 0x00;
      50 BA22      OUT	0x12,R2
(0025)  DDRD  = 0xff;
      51 BB81      OUT	0x11,R24
      52 9508      RET
(0026) }
(0027) 
(0028) //call this routine to initialize all peripherals
(0029) void init_devices(void)
(0030) {
(0031)  //stop errant interrupts until set up
(0032)  CLI(); //disable all interrupts
_init_devices:
      53 94F8      BCLR	7
(0033)  port_init();
      54 DFF5      RCALL	_port_init
(0034) 
(0035)  MCUCR = 0x00;
      55 2422      CLR	R2
      56 BE25      OUT	0x35,R2
(0036)  GICR  = 0x00;
      57 BE2B      OUT	0x3B,R2
(0037)  TIMSK = 0x00; //timer interrupt sources
      58 BE29      OUT	0x39,R2
(0038)  SEI(); //re-enable interrupts
      59 9478      BSET	7
      5A 9508      RET
(0039)  //all peripherals are now initialized
(0040) }
(0041) 
(0042) void main(void)
(0043) {
(0044)  unsigned int data;
(0045)  unsigned char dataL,dataH;
(0046)  init_devices(); 
_main:
  dataH                --> R10
  dataL                --> R12
  data                 --> R10
      5B DFF7      RCALL	_init_devices
      5C C007      RJMP	0x0064
(0047)  while(1)
(0048)  {
(0049)    convert();
      5D D079      RCALL	_convert
(0050)    data=rdtemp();
      5E D07E      RCALL	_rdtemp
      5F 0158      MOVW	R10,R16
(0051)    dataL=data;
      60 2CCA      MOV	R12,R10
(0052)    dataH=data>>8;
      61 2CAB      MOV	R10,R11
      62 24BB      CLR	R11
(0053)  delay1s();
      63 DFD1      RCALL	_delay1s
      64 CFF8      RJMP	0x005D
      65 9508      RET
FILE: D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\mydelay.c
(0001) #include "mydelay.h"
(0002) void delay0ms5us(void)
(0003) {
(0004) /*精确延时0ms 5us ,晶振8MHz*/
(0005) /*us级精确延时 766us/晶振以内 延时=1+n*3 */
(0006) // CLI;//屏蔽中断吗?
(0007) asm("LDI R18,10");//1t ,寄存器R15~R30
_delay0ms5us:
      66 E02A      LDI	R18,0xA
(0008) asm("CLZ");//1t
      67 9498      BCLR	1
(0009) asm("LOOP1:DEC R18");//1t
      68 952A      DEC	R18
(0010) asm("BRNE LOOP1");//1t或2t//标志位Z是0就转移
      69 F7F1      BNE	0x0068
(0011) asm("NOP");//1t
      6A 0000      NOP
(0012) asm("NOP");//1t
      6B 0000      NOP
      6C 9508      RET
(0013) // SEI;
(0014) /*us级精确延时 24543us以内,用nop补足了余数*/
(0015) //===精确延时 4.125us,晶振8MHz ===//
(0016) //===调用函数及返回花费0.875us==//
(0017) }
(0018) void delay0ms15us(void)
(0019) {
(0020) /*精确延时0ms 15us ,晶振8MHz*/
(0021) /*us级精确延时 766us/晶振以内 延时=1+n*3 */
(0022) // CLI;//屏蔽中断吗?
(0023) asm("LDI R18,37");//1t ,寄存器R15~R30
_delay0ms15us:
      6D E225      LDI	R18,0x25
(0024) asm("CLZ");//1t
      6E 9498      BCLR	1
(0025) asm("LOOP111:DEC R18");//1t
      6F 952A      DEC	R18
(0026) asm("BRNE LOOP111");//1t或2t//标志位Z是0就转移
      70 F7F1      BNE	0x006F
(0027) asm("NOP");//1t
      71 0000      NOP
      72 9508      RET
(0028) // SEI;
(0029) /*us级精确延时 24543us以内,用nop补足了余数*/
(0030) //===精确延时 14.125us,晶振8MHz ===//
(0031) //===调用函数及返回花费0.875us==//
(0032) }
(0033) void delay0ms60us(void)
(0034) {
(0035) /*精确延时0ms 60us ,晶振8MHz*/
(0036) /*us级精确延时 766us/晶振以内 延时=1+n*3 */
(0037) // CLI;//屏蔽中断吗?
(0038) asm("LDI R18,157");//1t ,寄存器R15~R30
_delay0ms60us:
      73 E92D      LDI	R18,0x9D
(0039) asm("CLZ");//1t
      74 9498      BCLR	1
(0040) asm("LOOP11:DEC R18");//1t
      75 952A      DEC	R18
(0041) asm("BRNE LOOP11");//1t或2t//标志位Z是0就转移
      76 F7F1      BNE	0x0075
(0042) asm("NOP");//1t
      77 0000      NOP
      78 9508      RET
(0043) // SEI;
(0044) /*us级精确延时 24543us以内,用nop补足了余数*/
(0045) //===精确延时 59.125us,晶振8MHz ===//
(0046) //===调用函数及返回花费0.875us==//
(0047) }
(0048) void delay0ms500us(void)
(0049) {
(0050) /*精确延时0ms 500us ,晶振8MHz*/
(0051) /*us级 196348us/晶振即196ms/晶振以内 延时=n*(m*3+5)*/
(0052) // CLI;//屏蔽中断吗?
(0053) asm("LDI R18,6");//外圈循环n
_delay0ms500us:
      79 E026      LDI	R18,6
(0054) asm("LOOP32:LDI R19,220");//内圈循环m
      7A ED3C      LDI	R19,0xDC
(0055) asm("CLZ");//1t
      7B 9498      BCLR	1
(0056) asm("LOOP22:DEC R19");//1t
      7C 953A      DEC	R19
(0057) asm("BRNE LOOP22");
      7D F7F1      BNE	0x007C
(0058) asm("CLZ");//1t
      7E 9498      BCLR	1
(0059) asm("DEC R18");//1t
      7F 952A      DEC	R18
(0060) asm("BRNE LOOP32");
      80 F7C9      BNE	0x007A
(0061) asm("NOP");//1t
      81 0000      NOP
(0062) asm("NOP");//1t
      82 0000      NOP
(0063) asm("NOP");//1t
      83 0000      NOP
      84 9508      RET
FILE: D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\ds18b20.c
(0001) /*
(0002) 我自己写的ds18b20的驱动,暂时固定PORTC0口当总线口好了
(0003) */
(0004) #include <iom8v.h>
(0005) #include <macros.h>
(0006) #include "mydelay.h"
(0007) #include "ds18b20.h"
(0008) //一。单点测量只要有presense应答就可以了,多点测量以后再搞
(0009) //1.reset
(0010) void reset(void)
(0011) {
(0012)   DDRC=DDRC|0x01;//输出
_reset:
      85 9AA0      SBI	0x14,0
(0013)   PORTC=PORTC&0xfe;//置0
      86 B385      IN	R24,0x15
      87 7F8E      ANDI	R24,0xFE
      88 BB85      OUT	0x15,R24
(0014)   delay0ms500us();
      89 CFEF      RJMP	_delay0ms500us
(0015) }
(0016) //2.读取presense应答信号
(0017) void ReadPresense(void)
(0018) {
(0019)   DDRC=DDRC&0xfe;//输入
_ReadPresense:
      8A B384      IN	R24,0x14
      8B 7F8E      ANDI	R24,0xFE
      8C BB84      OUT	0x14,R24
(0020)   delay0ms60us();
      8D DFE5      RCALL	_delay0ms60us
(0021)   while((PINC&0x01)==0x00) ;//检测到了应答信号
      8E 9B98      SBIS	0x13,0
      8F CFFE      RJMP	0x008E
      90 9508      RET
_rdbit:
  data                 --> R20
      91 934A      ST	R20,-Y
(0022)   //delay0ms60us();
(0023) }
(0024) unsigned char rdbit(void)
(0025) {
(0026)   unsigned char data;
(0027)   DDRC=DDRC|0x01;//输出
      92 9AA0      SBI	0x14,0
(0028)   PORTC=PORTC&0xfe;//置0
      93 B385      IN	R24,0x15
      94 7F8E      ANDI	R24,0xFE
      95 BB85      OUT	0x15,R24
(0029)   delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
      96 DFCF      RCALL	_delay0ms5us
(0030)   //PORTC=PORTC|0x01;//置1
(0031)   DDRC=DDRC&0xfe;//输入
      97 B384      IN	R24,0x14
      98 7F8E      ANDI	R24,0xFE
      99 BB84      OUT	0x14,R24
(0032)   data=PINC&0x01;
      9A B343      IN	R20,0x13
      9B 7041      ANDI	R20,1
(0033)   delay0ms15us();
      9C DFD0      RCALL	_delay0ms15us
(0034)   delay0ms60us();//读时隙不少于60us
      9D DFD5      RCALL	_delay0ms60us
(0035)  return (data);
      9E 2F04      MOV	R16,R20
      9F 9149      LD	R20,Y+
      A0 9508      RET
_rdbyte:
  j                    --> R12
  i                    --> R20
  data                 --> R10
      A1 D059      RCALL	push_xgset303C
(0036) }
(0037) unsigned char rdbyte(void)
(0038) {
(0039)   unsigned char data;
(0040)   unsigned char i,j;
(0041)   for(i=8;i>0;i--)
      A2 E048      LDI	R20,0x8
      A3 C00F      RJMP	0x00B3
(0042)   {
(0043)     j=rdbit();
      A4 DFEC      RCALL	_rdbit
      A5 2EC0      MOV	R12,R16
(0044)     data=(data>>1)|(j<<7);
      A6 2C2C      MOV	R2,R12
      A7 0C22      LSL	R2
      A8 0C22      LSL	R2
      A9 0C22      LSL	R2
      AA 0C22      LSL	R2
      AB 0C22      LSL	R2
      AC 0C22      LSL	R2
      AD 0C22      LSL	R2
      AE 2C3A      MOV	R3,R10
      AF 9436      LSR	R3
      B0 2832      OR	R3,R2
      B1 2CA3      MOV	R10,R3
      B2 954A      DEC	R20
      B3 E080      LDI	R24,0
      B4 1784      CP	R24,R20
      B5 F370      BCS	0x00A4
(0045)   }
(0046)   return (data);
      B6 2D0A      MOV	R16,R10
      B7 C04A      RJMP	pop_xgset303C
_wtbit:
  data                 --> R20
      B8 934A      ST	R20,-Y
      B9 2F40      MOV	R20,R16
(0047) }
(0048) void wtbit(unsigned char data)
(0049) {
(0050)   DDRC=DDRC|0x01;//输出
      BA 9AA0      SBI	0x14,0
(0051)   PORTC=PORTC&0xfe;//置0
      BB B385      IN	R24,0x15
      BC 7F8E      ANDI	R24,0xFE
      BD BB85      OUT	0x15,R24
(0052)   delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
      BE DFA7      RCALL	_delay0ms5us
(0053)   if (data==0x01) PORTC=PORTC|0x01;//置1
      BF 3041      CPI	R20,1
      C0 F409      BNE	0x00C2
      C1 9AA8      SBI	0x15,0
(0054)   delay0ms60us();
      C2 DFB0      RCALL	_delay0ms60us
(0055)   PORTC=PORTC|0x01;//拉高回来
      C3 9AA8      SBI	0x15,0
(0056)   delay0ms60us();//时隙不少于60us
      C4 DFAE      RCALL	_delay0ms60us
      C5 9149      LD	R20,Y+
      C6 9508      RET
_wtbyte:
  j                    --> R22
  i                    --> R20
  data                 --> R10
      C7 D025      RCALL	push_xgsetF00C
      C8 2EA0      MOV	R10,R16
(0057) }
(0058) void wtbyte(unsigned char data)
(0059) {
(0060)   unsigned char i,j;
(0061)   for (i=8;i>0;i--)
      C9 E048      LDI	R20,0x8
      CA C008      RJMP	0x00D3
(0062)   {
(0063)     j=(data>>i)&0x01;
      CB 2D0A      MOV	R16,R10
      CC 2F14      MOV	R17,R20
      CD D03B      RCALL	lsr8
      CE 2F60      MOV	R22,R16
      CF 7061      ANDI	R22,1
(0064) 	wtbit(j);
      D0 2F06      MOV	R16,R22
      D1 DFE6      RCALL	_wtbit
      D2 954A      DEC	R20
      D3 E080      LDI	R24,0
      D4 1784      CP	R24,R20
      D5 F3A8      BCS	0x00CB
      D6 C01D      RJMP	pop_xgsetF00C
(0065)   }
(0066) }
(0067) //启动温度转换
(0068) void convert(void)
(0069) {
(0070)  reset();
_convert:
      D7 DFAD      RCALL	_reset
(0071)  ReadPresense();
      D8 DFB1      RCALL	_ReadPresense
(0072)  wtbyte(0xcc);
      D9 EC0C      LDI	R16,0xCC
      DA DFEC      RCALL	_wtbyte
(0073)  wtbyte(0x44);
      DB E404      LDI	R16,0x44
      DC CFEA      RJMP	_wtbyte
_rdtemp:
  tmp                  --> Y,+1
  temp                 --> R10
      DD 92AA      ST	R10,-Y
      DE 92BA      ST	R11,-Y
(0074) }
(0075) //读温度值
(0076) unsigned int rdtemp(void)
(0077) {
(0078)  unsigned int temp,tmp;
(0079)  reset();
      DF DFA5      RCALL	_reset
(0080)  ReadPresense();
      E0 DFA9      RCALL	_ReadPresense
(0081)  wtbyte(0xcc);
      E1 EC0C      LDI	R16,0xCC
      E2 DFE4      RCALL	_wtbyte
(0082)  wtbyte(0xbe);
      E3 EB0E      LDI	R16,0xBE
      E4 DFE2      RCALL	_wtbyte
(0083)  //temp=rdbyte();
(0084)  //tmp=temp;
(0085)  //temp=rdbyte();
(0086)  //temp=(temp<<8)|tmp;
(0087)  PORTB=rdbyte();
      E5 DFBB      RCALL	_rdbyte
      E6 BB08      OUT	0x18,R16
(0088)  PORTD=rdbyte();
      E7 DFB9      RCALL	_rdbyte
      E8 BB02      OUT	0x12,R16
(0089)  return temp;
FILE: <library>
      E9 0185      MOVW	R16,R10
      EA 90B9      LD	R11,Y+
      EB 90A9      LD	R10,Y+
      EC 9508      RET
push_xgsetF00C:
      ED 937A      ST	R23,-Y
      EE 936A      ST	R22,-Y
      EF 935A      ST	R21,-Y
      F0 934A      ST	R20,-Y
      F1 92BA      ST	R11,-Y
      F2 92AA      ST	R10,-Y
      F3 9508      RET
pop_xgsetF00C:
      F4 90A9      LD	R10,Y+
      F5 90B9      LD	R11,Y+
      F6 9149      LD	R20,Y+
      F7 9159      LD	R21,Y+
      F8 9169      LD	R22,Y+
      F9 9179      LD	R23,Y+
      FA 9508      RET
push_xgset303C:
      FB 935A      ST	R21,-Y
      FC 934A      ST	R20,-Y
      FD 92DA      ST	R13,-Y
      FE 92CA      ST	R12,-Y
      FF 92BA      ST	R11,-Y
     100 92AA      ST	R10,-Y
     101 9508      RET
pop_xgset303C:
     102 90A9      LD	R10,Y+
     103 90B9      LD	R11,Y+
     104 90C9      LD	R12,Y+
     105 90D9      LD	R13,Y+
     106 9149      LD	R20,Y+
     107 9159      LD	R21,Y+
     108 9508      RET
lsr8:
     109 2311      TST	R17
     10A F019      BEQ	0x010E
     10B 9506      LSR	R16
     10C 951A      DEC	R17
     10D CFFB      RJMP	lsr8
     10E 9508      RET

⌨️ 快捷键说明

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