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

📄 18b20ok.lst

📁 ds18b20多个时候的分辨函数
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
      2A E5CF      LDI	R28,0x5F
      2B E0D8      LDI	R29,0x8
      2C BFCD      OUT	0x3D,R28
      2D BFDE      OUT	0x3E,R29
      2E 51CE      SUBI	R28,0x1E
      2F 40D0      SBCI	R29,0
      30 EA0A      LDI	R16,0xAA
      31 8308      STD	Y+0,R16
      32 2400      CLR	R0
      33 E6E0      LDI	R30,0x60
      34 E0F0      LDI	R31,0
      35 E010      LDI	R17,0
      36 3DEF      CPI	R30,0xDF
      37 07F1      CPC	R31,R17
      38 F011      BEQ	0x003B
      39 9201      ST	R0,Z+
      3A CFFB      RJMP	0x0036
      3B 8300      STD	Z+0,R16
      3C E5E4      LDI	R30,0x54
      3D E0F0      LDI	R31,0
      3E E6A0      LDI	R26,0x60
      3F E0B0      LDI	R27,0
      40 E010      LDI	R17,0
      41 E000      LDI	R16,0
      42 BF0B      OUT	0x3B,R16
      43 35E4      CPI	R30,0x54
      44 07F1      CPC	R31,R17
      45 F021      BEQ	0x004A
      46 95C8      LPM
      47 9631      ADIW	R30,1
      48 920D      ST	R0,X+
      49 CFF9      RJMP	0x0043
      4A 940E 02B1 CALL	_main
_exit:
      4C CFFF      RJMP	_exit
FILE: D:\cood\18b20\main.c
(0001) #include <iom32v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define F_CPU 7372800
(0005) 
(0006) //数据类型的定义
(0007) #define     uint8   unsigned char                                         
(0008) #define   uint16   unsigned int
(0009) 
(0010) //位变量操作宏定义
(0011) #define     BIT_SET(a,b)   a|=BIT(b)
(0012) #define     BIT_CLR(a,b)   a&=~BIT(b)
(0013) #define     BIT_INV(a,b)     a^=BIT(b)
(0014) #define     BIT_STATUS(a,b) a&BIT(b)
(0015) 
(0016) //DS18B20操作定义
(0017) #define     CLR_DS18B20     BIT_CLR(PORTA,PA0)     //数据线强制拉低
(0018) #define     SET_DS18B20     BIT_SET(PORTA,PA0)     //数据线强制拉高,上拉
(0019) #define     HLD_DS18B20     BIT_SET(DDRA,PA0)     //Mega16控制总线
(0020) #define     RLS_DS18B20     BIT_CLR(DDRA,PA0)         //释放总线
(0021) #define     STU_DS18B20     BIT_STATUS(PINA,PA0)     //数据线的状态
(0022) #define     bit_0_1  0x00
(0023) #define     bit_0    0x01    //因为移位了,所以低在前,高位在后
(0024) #define     bit_1    0x02
(0025) #define     maxsize  7
(0026) unsigned char rom_seq[maxsize][8];
(0027) unsigned char B20_num;
(0028) unsigned char tep[maxsize][10];
(0029) 
(0030) 
(0031) 
(0032) void port_init(void)
(0033) {
(0034) PORTA = 0xFF;
_port_init:
      4D EF8F      LDI	R24,0xFF
      4E BB8B      OUT	0x1B,R24
(0035) DDRA = 0xFF;
      4F BB8A      OUT	0x1A,R24
(0036) PORTB = 0xFF;
      50 BB88      OUT	0x18,R24
(0037) DDRB = 0xFF; //输出
      51 BB87      OUT	0x17,R24
(0038) PORTC = 0xFF; //m103 output only
      52 BB85      OUT	0x15,R24
(0039) DDRC = 0xFF; //输出 
      53 BB84      OUT	0x14,R24
(0040) DDRD = 0xFF;
      54 BB81      OUT	0x11,R24
(0041) PORTD = 0xFF;
      55 BB82      OUT	0x12,R24
      56 9508      RET
(0042) }
(0043) 
(0044) /**********************************************************************
(0045) functionName: void delayUs(BYTE temp)
(0046) description :延时函数 晶振频率:7.3728MHZ
(0047) delayUs(1);       //2.71us
(0048) delayUs(2);       //3.53us
(0049) delayUs(4);       //5.15us
(0050) delayUs(8);       //8.41us
(0051) delayUs(16);       //14.92us
(0052) delayUs(32);       //27.94us
(0053) delayUs(64);       //53.98us
(0054) delayUs(128);       //106.07us
(0055) delayUs(255);     //209.42us
(0056) delayUs(18);       //16.55us
(0057) delayUs(34);       //29.57us
(0058) delayUs(35);       //30.38us
(0059) delayUs(100);       //83.28
(0060) _NOP();         //0.14us 
(0061) **********************************************************************/
(0062) void delayUs(uint8 temp)
(0063) {
(0064)     while(temp--);
_delayUs:
  temp                 --> R16
      57 2E20      MOV	R2,R16
      58 2433      CLR	R3
      59 5001      SUBI	R16,1
      5A 2022      TST	R2
      5B F7D9      BNE	0x0057
      5C 9508      RET
_longdelay:
  i                    --> R20
      5D 934A      ST	R20,-Y
      5E 935A      ST	R21,-Y
(0065) }
(0066) 
(0067) //延时约1s
(0068) void longdelay(void)
(0069) {
(0070) unsigned int i;
(0071) for(i=4761;i!=0;i--)
      5F E949      LDI	R20,0x99
      60 E152      LDI	R21,0x12
      61 C004      RJMP	0x0066
(0072) delayUs(255);
      62 EF0F      LDI	R16,0xFF
      63 DFF3      RCALL	_delayUs
      64 5041      SUBI	R20,1
      65 4050      SBCI	R21,0
      66 3040      CPI	R20,0
      67 0745      CPC	R20,R21
      68 F7C9      BNE	0x0062
      69 9159      LD	R21,Y+
      6A 9149      LD	R20,Y+
      6B 9508      RET
_resetDS18B20:
  errTime              --> R10
      6C 92AA      ST	R10,-Y
(0073) }
(0074) 
(0075) 
(0076) /*******************************************************************************
(0077) functionName: uint8 resetDS18B20(void)
(0078) description :DS18B20初始化
(0079) ********************************************************************************/
(0080) uint8 resetDS18B20(void)
(0081) {
(0082)   uint8 errTime=0;
      6D 24AA      CLR	R10
(0083)   RLS_DS18B20;     //释放总线
      6E 98D0      CBI	0x1A,0
(0084)   _NOP();
      6F 0000      NOP
(0085)   HLD_DS18B20;     //Maga16控制总线
      70 9AD0      SBI	0x1A,0
(0086)   CLR_DS18B20;     //强制拉低
      71 98D8      CBI	0x1B,0
(0087)   delayUs(255);     //209.42us
      72 EF0F      LDI	R16,0xFF
      73 DFE3      RCALL	_delayUs
(0088)   delayUs(255);     //209.42us
      74 EF0F      LDI	R16,0xFF
      75 DFE1      RCALL	_delayUs
(0089)   delayUs(255);     //83.28us
      76 EF0F      LDI	R16,0xFF
      77 DFDF      RCALL	_delayUs
(0090)   //以上的三个延时大于480us
(0091)   RLS_DS18B20;     //释放总线,总线自动上拉
      78 98D0      CBI	0x1A,0
(0092)   _NOP();         
      79 0000      NOP
      7A C008      RJMP	0x0083
(0093)   while(STU_DS18B20)   
(0094)   {
(0095)     delayUs(4);       //5.15us
      7B E004      LDI	R16,4
      7C DFDA      RCALL	_delayUs
(0096)     errTime++;
      7D 94A3      INC	R10
(0097)     if(errTime>20)
      7E E184      LDI	R24,0x14
      7F 158A      CP	R24,R10
      80 F410      BCC	0x0083
(0098)     return(0x00);     //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
      81 2700      CLR	R16
      82 C00F      RJMP	0x0092
      83 99C8      SBIC	0x19,0
      84 CFF6      RJMP	0x007B
(0099)   }
(0100)   errTime=0;
      85 24AA      CLR	R10
      86 C008      RJMP	0x008F
(0101)   while(!(STU_DS18B20))   
(0102)   {
(0103)     delayUs(4);       //5.15us
      87 E004      LDI	R16,4
      88 DFCE      RCALL	_delayUs
(0104)     errTime++;
      89 94A3      INC	R10
(0105)     if(errTime>50)
      8A E382      LDI	R24,0x32
      8B 158A      CP	R24,R10
      8C F410      BCC	0x008F
(0106)     return(0x00);     //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
      8D 2700      CLR	R16
      8E C003      RJMP	0x0092
      8F 9BC8      SBIS	0x19,0
      90 CFF6      RJMP	0x0087
(0107)   }
(0108)   return(0xff);
      91 EF0F      LDI	R16,0xFF
      92 90A9      LD	R10,Y+
      93 9508      RET
_write_a_bit:
  temp                 --> R10
      94 92AA      ST	R10,-Y
      95 2EA0      MOV	R10,R16
(0109) }
(0110) 
(0111) 
(0112) /*
(0113) 写一个位
(0114) */
(0115) void write_a_bit(unsigned char temp){
(0116)     HLD_DS18B20;     //Maga16控制总线
      96 9AD0      SBI	0x1A,0
(0117)     CLR_DS18B20;     //强制拉低
      97 98D8      CBI	0x1B,0
(0118)     delayUs(16);       //14.92us
      98 E100      LDI	R16,0x10
      99 DFBD      RCALL	_delayUs
(0119)     if(temp&0x01)
      9A FEA0      SBRS	R10,0
      9B C002      RJMP	0x009E
(0120)     RLS_DS18B20;     //释放总线
      9C 98D0      CBI	0x1A,0
      9D C001      RJMP	0x009F
(0121)     else
(0122)     CLR_DS18B20;     //强制拉低
      9E 98D8      CBI	0x1B,0
(0123)     delayUs(16);       //14.92us
      9F E100      LDI	R16,0x10
      A0 DFB6      RCALL	_delayUs
(0124)     delayUs(35);       //30.38us
      A1 E203      LDI	R16,0x23
      A2 DFB4      RCALL	_delayUs
(0125)     RLS_DS18B20;     //释放总线
      A3 98D0      CBI	0x1A,0
(0126)     delayUs(1);         //2.71us(大于1us就行了)
      A4 E001      LDI	R16,1
      A5 DFB1      RCALL	_delayUs
      A6 90A9      LD	R10,Y+
      A7 9508      RET
_read_a_bit:
  temp                 --> R20
      A8 934A      ST	R20,-Y
(0127) 	//HLD_DS18B20;   //Maga16控制总线
(0128) 
(0129) 
(0130) }
(0131) 
(0132) 
(0133) 
(0134) /*
(0135) 
(0136)  读一位
(0137) 
(0138) */
(0139) 
(0140) 
(0141) 
(0142) 
(0143) 
(0144) unsigned char  read_a_bit(void){
(0145)  unsigned char temp=0;
      A9 2744      CLR	R20
(0146)     HLD_DS18B20;   //Maga16控制总线
      AA 9AD0      SBI	0x1A,0
(0147)     CLR_DS18B20;   //强制拉低
      AB 98D8      CBI	0x1B,0
(0148)     NOP();
      AC 0000      NOP
(0149)     NOP();
      AD 0000      NOP
(0150)     NOP();
      AE 0000      NOP
(0151)     NOP();
      AF 0000      NOP
(0152)     NOP();
      B0 0000      NOP
(0153)     NOP();
      B1 0000      NOP
(0154)     NOP();   
      B2 0000      NOP
(0155)     NOP();         //延时大于1us   
      B3 0000      NOP
(0156)     RLS_DS18B20;     //释放总线
      B4 98D0      CBI	0x1A,0
(0157)     NOP();
      B5 0000      NOP
(0158)     NOP();
      B6 0000      NOP
(0159)     NOP();
      B7 0000      NOP
(0160)     if(STU_DS18B20)
      B8 9BC8      SBIS	0x19,0
      B9 C002      RJMP	0x00BC
(0161)     temp=1;
      BA E041      LDI	R20,1
      BB C001      RJMP	0x00BD
(0162) 	else
(0163) 	temp=0;
      BC 2744      CLR	R20
(0164)     delayUs(16);       //14.92us
      BD E100      LDI	R16,0x10
      BE DF98      RCALL	_delayUs
(0165)     delayUs(16);       //14.92us
      BF E100      LDI	R16,0x10
      C0 DF96      RCALL	_delayUs
(0166)     RLS_DS18B20;     //释放总线
      C1 98D0      CBI	0x1A,0
(0167)     delayUs(35);       //30.38us
      C2 E203      LDI	R16,0x23
      C3 DF93      RCALL	_delayUs
(0168) 	//HLD_DS18B20;   //Maga16控制总线
(0169)    return temp;
      C4 2F04      MOV	R16,R20
      C5 9149      LD	R20,Y+
      C6 9508      RET
_readuint8DS18B20:
  retVal               --> R20
  temp                 --> R10
  i                    --> R22
      C7 940E 034D CALL	push_xgsetF00C
(0170) }
(0171) 
(0172) 
(0173) 
(0174) 
(0175) 
(0176) /**********************************************************************
(0177) functionName: uint8 readuint8DS18B20(void)
(0178) description :读DS18B20一个字节
(0179) **********************************************************************/
(0180) uint8 readuint8DS18B20(void)
(0181) {
(0182)   uint8 i;
(0183)   uint8 retVal=0;
      C9 2744      CLR	R20
(0184)   uint8 temp=0;
      CA 24AA      CLR	R10
(0185)   RLS_DS18B20;     //释放总线
      CB 98D0      CBI	0x1A,0
(0186)   for(i=8;i>0;i--)
      CC E068      LDI	R22,0x8
      CD C007      RJMP	0x00D5
(0187)   {
(0188)       retVal>>=1;
      CE 9546      LSR	R20
(0189) 	  /*
(0190)         HLD_DS18B20;   //Maga16控制总线
(0191)     CLR_DS18B20;   //强制拉低
(0192)     NOP();
(0193)       NOP();
(0194)       NOP();
(0195)       NOP();
(0196)       NOP();
(0197)     NOP();
(0198)     NOP();   
(0199)     NOP();         //延时大于1us   
(0200)     RLS_DS18B20;     //释放总线
(0201)     NOP();
(0202)     NOP();
(0203)     NOP();
(0204)     if(STU_DS18B20)
(0205)     retVal|=0x80;
(0206)     delayUs(16);       //14.92us
(0207)     delayUs(16);       //14.92us
(0208)     RLS_DS18B20;     //释放总线
(0209)     delayUs(35);       //30.38us
(0210) 	*/
(0211) 	
(0212) 	temp=read_a_bit();
      CF DFD8      RCALL	_read_a_bit
      D0 2EA0      MOV	R10,R16
(0213) 	if(temp)
      D1 2300      TST	R16
      D2 F009      BEQ	0x00D4
(0214) 	retVal|=0x80;
      D3 6840      ORI	R20,0x80
      D4 956A      DEC	R22
      D5 E080      LDI	R24,0
      D6 1786      CP	R24,R22
      D7 F3B0      BCS	0x00CE
(0215) 	
(0216)   }
(0217)   delayUs(1);         //2.71us(大于1us就行了)
      D8 E001      LDI	R16,1
      D9 DF7D      RCALL	_delayUs
(0218)   return(retVal);
      DA 2F04      MOV	R16,R20
      DB 940C 0354 JMP	pop_xgsetF00C
_writeuint8DS18B20:
  temp                 --> R22
  i                    --> R20
  wb                   --> R10
      DD 940E 034D CALL	push_xgsetF00C
      DF 2EA0      MOV	R10,R16
(0219) }
(0220) 
(0221) 
(0222) /*******************************************************************************
(0223) functionName: uint8 readuint8DS18B20(void)
(0224) description :写DS18B20一个字节
(0225) ********************************************************************************/
(0226) void writeuint8DS18B20(uint8 wb)
(0227) {
(0228)   uint8 i;
(0229)   uint8 temp;
(0230)   RLS_DS18B20;     //释放总线
      E0 98D0      CBI	0x1A,0
(0231)   for(i=0;i<8;i++)
      E1 2744      CLR	R20
      E2 C009      RJMP	0x00EC
(0232)   {
(0233)     temp=wb>>i;
      E3 2D0A      MOV	R16,R10
      E4 2F14      MOV	R17,R20
      E5 940E 0379 CALL	lsr8
      E7 2F60      MOV	R22,R16
(0234)     temp&=0x01;
      E8 7061      ANDI	R22,1
(0235)     write_a_bit(temp);
      E9 2F06      MOV	R16,R22
      EA DFA9      RCALL	_write_a_bit
      EB 9543      INC	R20
      EC 3048      CPI	R20,0x8
      ED F3A8      BCS	0x00E3
      EE 940C 0354 JMP	pop_xgsetF00C
_readTempDS18B20:
  x                    --> R10
  tempH                --> R12
  tempL                --> R10
      F0 940E 033E CALL	push_xgset003C
(0236)    /*
(0237)     HLD_DS18B20;     //Maga16控制总线
(0238)     CLR_DS18B20;     //强制拉低
(0239)     delayUs(16);       //14.92us
(0240)     temp=wb>>i;
(0241)     temp&=0x01;
(0242)     if(temp)
(0243)     RLS_DS18B20;     //释放总线
(0244)     else
(0245)     CLR_DS18B20;     //强制拉低
(0246)     delayUs(16);       //14.92us
(0247)     delayUs(35);       //30.38us

⌨️ 快捷键说明

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