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

📄 ds18b20.lst

📁 AVR ds18b20 源代码 对学习温度控制的人很有帮助
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0026 E5CF      LDI	R28,0x5F
    0027 E0D4      LDI	R29,4
    0028 BFCD      OUT	0x3D,R28
    0029 BFDE      OUT	0x3E,R29
    002A 51C0      SUBI	R28,0x10
    002B 40D0      SBCI	R29,0
    002C EA0A      LDI	R16,0xAA
    002D 8308      STD	Y+0,R16
    002E 2400      CLR	R0
    002F E7E0      LDI	R30,0x70
    0030 E0F0      LDI	R31,0
    0031 E010      LDI	R17,0
    0032 37E0      CPI	R30,0x70
    0033 07F1      CPC	R31,R17
    0034 F011      BEQ	0x0037
    0035 9201      ST	R0,Z+
    0036 CFFB      RJMP	0x0032
    0037 8300      STD	Z+0,R16
    0038 E3EC      LDI	R30,0x3C
    0039 E0F0      LDI	R31,0
    003A E6A0      LDI	R26,0x60
    003B E0B0      LDI	R27,0
    003C E010      LDI	R17,0
    003D 34EC      CPI	R30,0x4C
    003E 07F1      CPC	R31,R17
    003F F021      BEQ	0x0044
    0040 95C8      LPM
    0041 9631      ADIW	R30,1
    0042 920D      ST	R0,X+
    0043 CFF9      RJMP	0x003D
    0044 D0A6      RCALL	_main
_exit:
    0045 CFFF      RJMP	_exit
_reset_ov:
  c                    --> R20
    0046 D1B5      RCALL	push_gset1
FILE: D:\开发板\source\ds18b20\dsi8b20.c
(0001) /******************************************/
(0002) /*             北京MCU学习之家            */
(0003) /*             ADC通信演示程序            */
(0004) /*             作者:白如冰                */
(0005) /*             2005年10月1日              */
(0006) /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
(0007) /******************************************/
(0008) //  1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
(0009) //  2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
(0010) #include <iom8v.h>
(0011) #include <macros.h>
(0012) extern void delay_us(unsigned int n);
(0013) extern void delay_ms(unsigned int n);
(0014) extern void uart_init(void);
(0015) extern void putchar(unsigned char c);
(0016) extern void puts(char *s);
(0017) extern void puts_hh(char *s);
(0018) 
(0019) #define ds1820_data_s PORTD|=BIT(PORTD6)
(0020) #define ds1820_data_c PORTD&=~BIT(PORTD6)
(0021)  							
(0022) 
(0023) unsigned char reset_ov(void)      //18b20 复位函数
(0024) { 
(0025)  char c=0; 
    0047 2744      CLR	R20
(0026)  ds1820_data_s;
    0048 9A96      SBI	0x12,6
(0027)  delay_us(1);//6
    0049 E001      LDI	R16,1
    004A E010      LDI	R17,0
    004B D131      RCALL	_delay_us
(0028)  ds1820_data_c;
    004C 9896      CBI	0x12,6
(0029)  delay_us(660);//500
    004D E904      LDI	R16,0x94
    004E E012      LDI	R17,2
    004F D12D      RCALL	_delay_us
(0030)  ds1820_data_s;
    0050 9A96      SBI	0x12,6
(0031)  delay_us(73);//60us
    0051 E409      LDI	R16,0x49
    0052 E010      LDI	R17,0
    0053 D129      RCALL	_delay_us
(0032)  c=(PIND&=0x40);//dq_in;
    0054 B380      IN	R24,0x10
    0055 7480      ANDI	R24,0x40
    0056 BB80      OUT	0x10,R24
    0057 2F48      MOV	R20,R24
(0033)  if(c==0x40)
    0058 3480      CPI	R24,0x40
    0059 F411      BNE	0x005C
(0034)  return (0);
    005A 2700      CLR	R16
    005B C004      RJMP	0x0060
(0035)  else 
(0036)  {
(0037)  delay_us(326);//250
    005C E406      LDI	R16,0x46
    005D E011      LDI	R17,1
    005E D11E      RCALL	_delay_us
(0038)   return (1);
    005F E001      LDI	R16,1
    0060 D19E      RCALL	pop_gset1
    0061 9508      RET
_write_data:
  temp                 --> R20
  i                    --> R22
  data                 --> R10
    0062 D195      RCALL	push_gset3
    0063 2EA0      MOV	R10,R16
(0039)  }  
(0040) }  
(0041) 
(0042) void write_data(unsigned char data)    //DS18B20写函数
(0043) {
(0044)     unsigned char i,temp;
(0045)     temp=data;
    0064 2D4A      MOV	R20,R10
(0046)    
(0047)     for (i=0; i<8; i++) 
    0065 2766      CLR	R22
    0066 C016      RJMP	0x007D
(0048)     {
(0049)       if((temp&0x01)&&0x01)
    0067 FF40      SBRS	R20,0
    0068 C009      RJMP	0x0072
(0050)       {
(0051) 	  ds1820_data_c;
    0069 9896      CBI	0x12,6
(0052)       delay_us(6);//10
    006A E006      LDI	R16,6
    006B E010      LDI	R17,0
    006C D110      RCALL	_delay_us
(0053)       ds1820_data_s;
    006D 9A96      SBI	0x12,6
(0054)       delay_us(73);//60
    006E E409      LDI	R16,0x49
    006F E010      LDI	R17,0
    0070 D10C      RCALL	_delay_us
(0055)       }
    0071 C008      RJMP	0x007A
(0056)       else
(0057)       {
(0058) 	   ds1820_data_c;
    0072 9896      CBI	0x12,6
(0059)        delay_us(80);//70
    0073 E500      LDI	R16,0x50
    0074 E010      LDI	R17,0
    0075 D107      RCALL	_delay_us
(0060)        ds1820_data_s;
    0076 9A96      SBI	0x12,6
(0061)        delay_us(1);//6
    0077 E001      LDI	R16,1
    0078 E010      LDI	R17,0
    0079 D103      RCALL	_delay_us
(0062)       }
(0063)       data>>=1;   
    007A 94A6      LSR	R10
(0064)       temp=data;
    007B 2D4A      MOV	R20,R10
    007C 9563      INC	R22
    007D 3068      CPI	R22,0x8
    007E F340      BCS	0x0067
    007F D172      RCALL	pop_gset3
    0080 9508      RET
_read_data:
  value                --> R20
  i                    --> R22
    0081 D178      RCALL	push_gset2
(0065)     }
(0066)       
(0067) }
(0068) 
(0069) unsigned char read_data(void)   //DS18B20	读函数
(0070) {
(0071) unsigned char i;
(0072) 
(0073) char value = 0;
    0082 2744      CLR	R20
(0074) for (i=0;i<8;i++)
    0083 2766      CLR	R22
    0084 C013      RJMP	0x0098
(0075) {
(0076) value>>=1;
    0085 9546      LSR	R20
(0077) ds1820_data_c;
    0086 9896      CBI	0x12,6
(0078) delay_us(1);//6
    0087 E001      LDI	R16,1
    0088 E010      LDI	R17,0
    0089 D0F3      RCALL	_delay_us
(0079) ds1820_data_s;
    008A 9A96      SBI	0x12,6
(0080) delay_us(1); //6
    008B E001      LDI	R16,1
    008C E010      LDI	R17,0
    008D D0EF      RCALL	_delay_us
(0081) 
(0082) 
(0083) if((PIND&=0x40)==0x40)
    008E B380      IN	R24,0x10
    008F 7480      ANDI	R24,0x40
    0090 BB80      OUT	0x10,R24
    0091 3480      CPI	R24,0x40
    0092 F409      BNE	0x0094
(0084) value|=0x80;
    0093 6840      ORI	R20,0x80
(0085) delay_us(73);//60 
    0094 E409      LDI	R16,0x49
    0095 E010      LDI	R17,0
    0096 D0E6      RCALL	_delay_us
    0097 9563      INC	R22
    0098 3068      CPI	R22,0x8
    0099 F358      BCS	0x0085
(0086) }
(0087) 
(0088) 
(0089) return(value);
    009A 2F04      MOV	R16,R20
    009B D154      RCALL	pop_gset2
    009C 9508      RET
_init_ds1820:
  i                    --> R20
    009D D15E      RCALL	push_gset1
(0090) }
(0091) 
(0092) void init_ds1820(void)
(0093) {
(0094)    unsigned char i;
(0095)    for(i=0;i<40;i++)
    009E 2744      CLR	R20
    009F C005      RJMP	0x00A5
(0096)    {if(reset_ov())
    00A0 DFA5      RCALL	_reset_ov
    00A1 2300      TST	R16
    00A2 F009      BEQ	0x00A4
(0097)     break;
    00A3 C003      RJMP	0x00A7
    00A4 9543      INC	R20
    00A5 3248      CPI	R20,0x28
    00A6 F3C8      BCS	0x00A0
(0098)    }
(0099)   
(0100)   write_data(0xcc);  //跳过ROM
    00A7 EC0C      LDI	R16,0xCC
    00A8 DFB9      RCALL	_write_data
(0101)   write_data(0x4e);  //写配置寄存器指令
    00A9 E40E      LDI	R16,0x4E
    00AA DFB7      RCALL	_write_data
(0102)   write_data(0x00);
    00AB 2700      CLR	R16
    00AC DFB5      RCALL	_write_data
(0103)   write_data(0x00);
    00AD 2700      CLR	R16
    00AE DFB3      RCALL	_write_data
(0104)   write_data(0x7f);  //配置转换位数为12位,转换时间为750ms
    00AF E70F      LDI	R16,0x7F
    00B0 DFB1      RCALL	_write_data
(0105)    for(i=0;i<40;i++)
    00B1 2744      CLR	R20
    00B2 C005      RJMP	0x00B8
(0106)    {if(reset_ov())
    00B3 DF92      RCALL	_reset_ov
    00B4 2300      TST	R16
    00B5 F009      BEQ	0x00B7
(0107)     break;
    00B6 C003      RJMP	0x00BA
    00B7 9543      INC	R20
    00B8 3248      CPI	R20,0x28
    00B9 F3C8      BCS	0x00B3
(0108)    }
(0109)    write_data(0xcc);
    00BA EC0C      LDI	R16,0xCC
    00BB DFA6      RCALL	_write_data
(0110)    write_data(0x44); //转换命令   开始第一次转换
    00BC E404      LDI	R16,0x44
    00BD DFA4      RCALL	_write_data
    00BE D140      RCALL	pop_gset1
    00BF 9508      RET
_read_temper:
  temph                --> R20
  templ                --> R22
  x                    --> R20
  i                    --> R10
    00C0 D137      RCALL	push_gset3
(0111)  }
(0112)  
(0113)  //读温度值
(0114) unsigned int read_temper(void)
(0115) {  
(0116)    unsigned int x;
(0117)    unsigned char templ,temph,i;
(0118)    for(i=0;i<40;i++)
    00C1 24AA      CLR	R10
    00C2 C005      RJMP	0x00C8
(0119)    {if(reset_ov())
    00C3 DF82      RCALL	_reset_ov
    00C4 2300      TST	R16
    00C5 F009      BEQ	0x00C7
(0120)     break;
    00C6 C004      RJMP	0x00CB
    00C7 94A3      INC	R10
    00C8 2D8A      MOV	R24,R10
    00C9 3288      CPI	R24,0x28
    00CA F3C0      BCS	0x00C3
(0121)    }
(0122)   
(0123)   
(0124)   write_data(0xcc);  //跳过ROM
    00CB EC0C      LDI	R16,0xCC
    00CC DF95      RCALL	_write_data
(0125)   write_data(0xbe); //读温度命令
    00CD EB0E      LDI	R16,0xBE
    00CE DF93      RCALL	_write_data
(0126)   templ=read_data();
    00CF DFB1      RCALL	_read_data
    00D0 2F60      MOV	R22,R16
(0127)   temph=read_data();
    00D1 DFAF      RCALL	_read_data
    00D2 2F40      MOV	R20,R16
(0128)   for(i=0;i<40;i++)
    00D3 24AA      CLR	R10
    00D4 C005      RJMP	0x00DA
(0129)    {if(reset_ov())
    00D5 DF70      RCALL	_reset_ov
    00D6 2300      TST	R16
    00D7 F009      BEQ	0x00D9
(0130)     break;
    00D8 C004      RJMP	0x00DD
    00D9 94A3      INC	R10
    00DA 2D8A      MOV	R24,R10
    00DB 3288      CPI	R24,0x28
    00DC F3C0      BCS	0x00D5
(0131)    }
(0132)    write_data(0xcc);
    00DD EC0C      LDI	R16,0xCC
    00DE DF83      RCALL	_write_data
(0133)    write_data(0x44); //转换命令
    00DF E404      LDI	R16,0x44
    00E0 DF81      RCALL	_write_data
(0134)    x=temph;
    00E1 2755      CLR	R21
(0135)    x<<=8;
    00E2 2F54      MOV	R21,R20
    00E3 2744      CLR	R20
(0136)    x+=templ;
    00E4 2E26      MOV	R2,R22
    00E5 2433      CLR	R3
    00E6 0D42      ADD	R20,R2
    00E7 1D53      ADC	R21,R3
(0137)    return x;
    00E8 018A      MOVW	R16,R20
    00E9 D108      RCALL	pop_gset3
    00EA 9508      RET
_main:
  temper_data          --> R20
  temp                 --> Y+0
    00EB 9729      SBIW	R28,0x9
(0138)  }  
(0139)  void main(void)
(0140)  {
(0141)   unsigned char temp[5];
(0142)   unsigned int temper_data;
(0143)   DDRD=0XFF;
    00EC EF8F      LDI	R24,0xFF
    00ED BB81      OUT	0x11,R24
(0144)   PORTD=0Xff;
    00EE BB82      OUT	0x12,R24
(0145)   uart_init();
    00EF D0D6      RCALL	_uart_init
(0146)   init_ds1820();
    00F0 DFAC      RCALL	_init_ds1820
    00F1 C088      RJMP	0x017A
(0147)   
(0148)   while(1)
(0149)   {
(0150)   delay_ms(1000);
    00F2 EE08      LDI	R16,0xE8
    00F3 E013      LDI	R17,3
    00F4 D09C      RCALL	_delay_ms
(0151)   
(0152)   temper_data=read_temper();
    00F5 DFCA      RCALL	_read_temper
    00F6 01A8      MOVW	R20,R16
(0153)   temper_data*=0.625;
    00F7 E20E      LDI	R16,0x2E
    00F8 E010      LDI	R17,0
    00F9 D122      RCALL	lpm32
    00FA 933A      ST	R19,-Y
    00FB 932A      ST	R18,-Y
    00FC 931A      ST	R17,-Y
    00FD 930A      ST	R16,-Y
    00FE E20A      LDI	R16,0x2A
    00FF E010      LDI	R17,0
    0100 D11B      RCALL	lpm32
    0101 933A      ST	R19,-Y
    0102 932A      ST	R18,-Y
    0103 931A      ST	R17,-Y
    0104 930A      ST	R16,-Y
    0105 018A      MOVW	R16,R20
    0106 9516      LSR	R17
    0107 9507      ROR	R16
    0108 D165      RCALL	int2fp
    0109 933A      ST	R19,-Y
    010A 932A      ST	R18,-Y
    010B 931A      ST	R17,-Y
    010C 930A      ST	R16,-Y
    010D D238      RCALL	empy32fs
    010E 018A      MOVW	R16,R20
    010F 7001      ANDI	R16,1
    0110 7010      ANDI	R17,0
    0111 D15C      RCALL	int2fp
    0112 933A      ST	R19,-Y
    0113 932A      ST	R18,-Y
    0114 931A      ST	R17,-Y
    0115 930A      ST	R16,-Y
    0116 D1AC      RCALL	add32fs
    0117 D230      RCALL	empy32f
    0118 01FE      MOVW	R30,R28
    0119 8305      STD	Z+5,R16
    011A 8316      STD	Z+6,R17
    011B 8327      STD	Z+7,R18
    011C 8730      STD	Z+8,R19
    011D 01FE      MOVW	R30,R28
    011E 8025      LDD	R2,Z+5
    011F 8036      LDD	R3,Z+6
    0120 8047      LDD	R4,Z+7
    0121 8450      LDD	R5,Z+8
    0122 925A      ST	R5,-Y

⌨️ 快捷键说明

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