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

📄 ds18b20.lst

📁 16个单片机c语言实验程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
      32 E5CF      LDI	R28,0x5F
      33 E0D4      LDI	R29,4
      34 BFCD      OUT	0x3D,R28
      35 BFDE      OUT	0x3E,R29
      36 51CE      SUBI	R28,0x1E
      37 40D0      SBCI	R29,0
      38 EA0A      LDI	R16,0xAA
      39 8308      STD	Y+0,R16
      3A 2400      CLR	R0
      3B E6EF      LDI	R30,0x6F
      3C E0F0      LDI	R31,0
      3D E010      LDI	R17,0
      3E 37E0      CPI	R30,0x70
      3F 07F1      CPC	R31,R17
      40 F011      BEQ	0x0043
      41 9201      ST	R0,Z+
      42 CFFB      RJMP	0x003E
      43 8300      STD	Z+0,R16
      44 E5E4      LDI	R30,0x54
      45 E0F0      LDI	R31,0
      46 E6A0      LDI	R26,0x60
      47 E0B0      LDI	R27,0
      48 E010      LDI	R17,0
      49 E000      LDI	R16,0
      4A BF0B      OUT	0x3B,R16
      4B 36E3      CPI	R30,0x63
      4C 07F1      CPC	R31,R17
      4D F021      BEQ	0x0052
      4E 95C8      LPM
      4F 9631      ADIW	R30,1
      50 920D      ST	R0,X+
      51 CFF9      RJMP	0x004B
      52 940E 0296 CALL	_main
_exit:
      54 CFFF      RJMP	_exit
_s_10us:
  aa                   --> R20
  ms                   --> R16
      55 934A      ST	R20,-Y
      56 935A      ST	R21,-Y
FILE: E:\单片机\16实验程序\DS18B20\DS18B20\18B20.h
(0001) //DS18B20连接在端口C的第7引脚
(0002) 
(0003) //设置成输入
(0004) #define DQ_INPUT DDRC &= ~(1 << PC7)    
(0005) //设置成输出
(0006) #define DQ_OUT DDRC |= (1 << PC7)    
(0007) //设置成低电平
(0008) #define DQ_LO PORTC &= ~(1 << PC7)  
(0009) //设置成高电平
(0010) #define DQ_HI PORTC |= (1 << PC7)   
(0011) //读出
(0012) #define DQ_R PINC & (1 << PC7)      
(0013) 
(0014) //中断标志
(0015) unsigned char init_f;     
(0016) 
(0017) //延时函数
(0018) void s_10us(unsigned int ms)
(0019) {
(0020)     unsigned int aa;
(0021) 	for(;ms>=1;ms--)
      57 C00C      RJMP	0x0064
(0022) 	{
(0023) 	for(aa=0;aa<=17;aa++)
      58 2744      CLR	R20
      59 2755      CLR	R21
      5A C002      RJMP	0x005D
      5B 5F4F      SUBI	R20,0xFF
      5C 4F5F      SBCI	R21,0xFF
      5D E181      LDI	R24,0x11
      5E E090      LDI	R25,0
      5F 1784      CP	R24,R20
      60 0795      CPC	R25,R21
      61 F7C8      BCC	0x005B
      62 5001      SUBI	R16,1
      63 4010      SBCI	R17,0
      64 3001      CPI	R16,1
      65 E0E0      LDI	R30,0
      66 071E      CPC	R17,R30
      67 F780      BCC	0x0058
      68 9159      LD	R21,Y+
      69 9149      LD	R20,Y+
      6A 9508      RET
_ds1820_reset:
  i                    --> R20
      6B 934A      ST	R20,-Y
(0024) 	{;}
(0025) 	}
(0026) }	
(0027) 
(0028) //DS18B20复位
(0029) void ds1820_reset(void) 
(0030) {
(0031)  unsigned char i;
(0032)  //中断保护
(0033)  init_f = SREG;    
      6C B62F      IN	R2,0x3F
      6D 9220 006F STS	init_f,R2
(0034)  //关中断
(0035)  CLI();      
      6F 94F8      BCLR	7
(0036)  DQ_OUT;
      70 9AA7      SBI	0x14,7
(0037)  DQ_LO;
      71 98AF      CBI	0x15,7
(0038)  s_10us(50);    //延时500us
      72 E302      LDI	R16,0x32
      73 E010      LDI	R17,0
      74 DFE0      RCALL	_s_10us
(0039)  DQ_HI;
      75 9AAF      SBI	0x15,7
(0040)  DQ_INPUT;
      76 98A7      CBI	0x14,7
(0041)  s_10us(8);     //延时80us
      77 E008      LDI	R16,0x8
      78 E010      LDI	R17,0
      79 DFDB      RCALL	_s_10us
(0042)  i = DQ_R;
      7A B343      IN	R20,0x13
      7B 7840      ANDI	R20,0x80
(0043)  s_10us(50);    //延时500us
      7C E302      LDI	R16,0x32
      7D E010      LDI	R17,0
      7E DFD6      RCALL	_s_10us
(0044)  if (init_f & 0x80)  //恢复中断状态
      7F 9020 006F LDS	R2,init_f
      81 FE27      SBRS	R2,7
      82 C001      RJMP	0x0084
(0045)   {   
(0046)   SEI();        
      83 9478      BSET	7
(0047)   }
      84 9149      LD	R20,Y+
      85 9508      RET
_ds1820_read_byte:
  value                --> R20
  i                    --> R22
      86 934A      ST	R20,-Y
      87 936A      ST	R22,-Y
(0048) }
(0049) 
(0050) //DS18B20字节读取
(0051) unsigned char ds1820_read_byte(void) 
(0052) {
(0053)  unsigned char i;
(0054)  unsigned char value = 0;
      88 2744      CLR	R20
(0055)  //中断保护
(0056)  init_f = SREG;
      89 B62F      IN	R2,0x3F
      8A 9220 006F STS	init_f,R2
(0057)  //关中断    
(0058)  CLI();      
      8C 94F8      BCLR	7
(0059)  for (i = 8; i != 0; i--) {
      8D E068      LDI	R22,0x8
      8E C012      RJMP	0x00A1
(0060)   value >>= 1;
      8F 9546      LSR	R20
(0061)   DQ_OUT;
      90 9AA7      SBI	0x14,7
(0062)   DQ_LO;
      91 98AF      CBI	0x15,7
(0063)   s_10us(1);
      92 E001      LDI	R16,1
      93 E010      LDI	R17,0
      94 DFC0      RCALL	_s_10us
(0064)   DQ_HI;
      95 9AAF      SBI	0x15,7
(0065)   DQ_INPUT;
      96 98A7      CBI	0x14,7
(0066)   s_10us(1);
      97 E001      LDI	R16,1
      98 E010      LDI	R17,0
      99 DFBB      RCALL	_s_10us
(0067)   if (DQ_R) {
      9A 9B9F      SBIS	0x13,7
      9B C001      RJMP	0x009D
(0068)    value|=0x80;
      9C 6840      ORI	R20,0x80
(0069)    }
(0070)   s_10us(5);   //延时60us
      9D E005      LDI	R16,5
      9E E010      LDI	R17,0
      9F DFB5      RCALL	_s_10us
      A0 956A      DEC	R22
      A1 2366      TST	R22
      A2 F761      BNE	0x008F
(0071)   }
(0072)  if (init_f & 0x80) //恢复中断状态
      A3 9020 006F LDS	R2,init_f
      A5 FE27      SBRS	R2,7
      A6 C001      RJMP	0x00A8
(0073)  {   
(0074)   SEI();
      A7 9478      BSET	7
(0075)   }
(0076)  return(value);
      A8 2F04      MOV	R16,R20
      A9 9169      LD	R22,Y+
      AA 9149      LD	R20,Y+
      AB 9508      RET
_ds1820_write_byte:
  i                    --> R20
  value                --> R10
      AC 92AA      ST	R10,-Y
      AD 934A      ST	R20,-Y
      AE 2EA0      MOV	R10,R16
(0077) }
(0078) 
(0079) //DS18B20字节写入
(0080) void ds1820_write_byte(unsigned char value) 
(0081) {
(0082)  unsigned char i;
(0083)  //中断保护
(0084)  init_f = SREG;   
      AF B62F      IN	R2,0x3F
      B0 9220 006F STS	init_f,R2
(0085)  //关中断 
(0086)  CLI();      
      B2 94F8      BCLR	7
(0087)  for (i = 8; i != 0; i--) {
      B3 E048      LDI	R20,0x8
      B4 C00E      RJMP	0x00C3
(0088)   DQ_OUT;
      B5 9AA7      SBI	0x14,7
(0089)   DQ_LO;
      B6 98AF      CBI	0x15,7
(0090)   s_10us(1);
      B7 E001      LDI	R16,1
      B8 E010      LDI	R17,0
      B9 DF9B      RCALL	_s_10us
(0091)   if (value & 0x01) {
      BA FEA0      SBRS	R10,0
      BB C001      RJMP	0x00BD
(0092)    DQ_HI;
      BC 9AAF      SBI	0x15,7
(0093)    }
(0094)   s_10us(8);   //延时80us
      BD E008      LDI	R16,0x8
      BE E010      LDI	R17,0
      BF DF95      RCALL	_s_10us
(0095)   DQ_HI;     
      C0 9AAF      SBI	0x15,7
(0096)   value >>= 1;
      C1 94A6      LSR	R10
      C2 954A      DEC	R20
      C3 2344      TST	R20
      C4 F781      BNE	0x00B5
(0097)   }
(0098)  if (init_f & 0x80)//恢复中断状态
      C5 9020 006F LDS	R2,init_f
      C7 FE27      SBRS	R2,7
      C8 C001      RJMP	0x00CA
(0099)   {   
(0100)   SEI();
      C9 9478      BSET	7
(0101)   }
      CA 9149      LD	R20,Y+
      CB 90A9      LD	R10,Y+
      CC 9508      RET
(0102) }
(0103) 
(0104) //启动ds1820转换
(0105) void ds1820_start(void) 
(0106) {
(0107)  ds1820_reset();
_ds1820_start:
      CD DF9D      RCALL	_ds1820_reset
(0108)  ds1820_write_byte(0xCC); //勿略ROM
      CE EC0C      LDI	R16,0xCC
      CF DFDC      RCALL	_ds1820_write_byte
(0109)  ds1820_write_byte(0x44); //启动转换
      D0 E404      LDI	R16,0x44
      D1 CFDA      RJMP	_ds1820_write_byte
_ds1820_read_temp:
  buf                  --> Y,+0
  i                    --> R20
      D2 934A      ST	R20,-Y
      D3 935A      ST	R21,-Y
      D4 9729      SBIW	R28,0x9
(0110) }
(0111) 
(0112) //读温度
(0113) unsigned int ds1820_read_temp(void)
(0114)  {
(0115)  unsigned int i;
(0116)  unsigned char buf[9];
(0117)  ds1820_reset();
      D5 DF95      RCALL	_ds1820_reset
(0118)  ds1820_write_byte(0xCC); //勿略ROM
      D6 EC0C      LDI	R16,0xCC
      D7 DFD4      RCALL	_ds1820_write_byte
(0119)  ds1820_write_byte(0xBE); //读温度
      D8 EB0E      LDI	R16,0xBE
      D9 DFD2      RCALL	_ds1820_write_byte
(0120)  for (i = 0; i < 9; i++) {
      DA 2744      CLR	R20
      DB 2755      CLR	R21
      DC C008      RJMP	0x00E5
(0121)   buf[i] = ds1820_read_byte();
      DD DFA8      RCALL	_ds1820_read_byte
      DE 01CE      MOVW	R24,R28
      DF 01FA      MOVW	R30,R20
      E0 0FE8      ADD	R30,R24
      E1 1FF9      ADC	R31,R25
      E2 8300      STD	Z+0,R16
      E3 5F4F      SUBI	R20,0xFF
      E4 4F5F      SBCI	R21,0xFF
      E5 3049      CPI	R20,0x9
      E6 E0E0      LDI	R30,0
      E7 075E      CPC	R21,R30
      E8 F3A0      BCS	0x00DD
(0122)   }
(0123)  i = buf[1];
      E9 8149      LDD	R20,Y+1
      EA 2755      CLR	R21
(0124)  i <<= 8;
      EB 2F54      MOV	R21,R20
      EC 2744      CLR	R20
(0125)  i |= buf[0];
      ED 8028      LDD	R2,Y+0
      EE 2433      CLR	R3
      EF 2942      OR	R20,R2
      F0 2953      OR	R21,R3
(0126)  return i;
      F1 018A      MOVW	R16,R20
      F2 9629      ADIW	R28,0x9
      F3 9159      LD	R21,Y+
      F4 9149      LD	R20,Y+
      F5 9508      RET
FILE: E:\单片机\16实验程序\DS18B20\DS18B20\1602.h
(0001) #define uchar unsigned char 
(0002) #define uint unsigned int 
(0003) 
(0004) #define RS 5
(0005) #define RW 6
(0006) #define EN 7
(0007) 
(0008) void s_ms(uint ms)
(0009) {
(0010) 	for(;ms>1;ms--);
_s_ms:
  ms                   --> R16
      F6 C002      RJMP	0x00F9
      F7 5001      SUBI	R16,1
      F8 4010      SBCI	R17,0
      F9 E081      LDI	R24,1
      FA E090      LDI	R25,0
      FB 1780      CP	R24,R16
      FC 0791      CPC	R25,R17
      FD F3C8      BCS	0x00F7
      FE 9508      RET
_busy:
  temp                 --> R20
      FF 934A      ST	R20,-Y
(0011) }	
(0012) 
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016)     uchar temp;
(0017) 	s_ms(500);
     100 EF04      LDI	R16,0xF4
     101 E011      LDI	R17,1
     102 DFF3      RCALL	_s_ms
(0018) 	PORTA&=~(1<<RS);    //RS=0
     103 98DD      CBI	0x1B,5
(0019) 	s_ms(500);
     104 EF04      LDI	R16,0xF4
     105 E011      LDI	R17,1
     106 DFEF      RCALL	_s_ms
(0020) 	PORTA|=(1<<RW);     //RW=1
     107 9ADE      SBI	0x1B,6
(0021) 	s_ms(500);
     108 EF04      LDI	R16,0xF4
     109 E011      LDI	R17,1
     10A DFEB      RCALL	_s_ms
     10B C01A      RJMP	0x0126
(0022) 	while(temp)
(0023) 	{
(0024) 		PORTA|=(1<<EN); //EN=1
     10C 9ADF      SBI	0x1B,7
(0025) 		s_ms(500);
     10D EF04      LDI	R16,0xF4
     10E E011      LDI	R17,1
     10F DFE6      RCALL	_s_ms
(0026) 		DDRD=0x00;      //A口变输入
     110 2422      CLR	R2
     111 BA21      OUT	0x11,R2
(0027) 		PORTD=0xff;     //上拉使能
     112 EF8F      LDI	R24,0xFF
     113 BB82      OUT	0x12,R24
(0028) 		s_ms(500);
     114 EF04      LDI	R16,0xF4
     115 E011      LDI	R17,1
     116 DFDF      RCALL	_s_ms
(0029) 		temp = PIND&0x80;    //读取A口
     117 B340      IN	R20,0x10
     118 7840      ANDI	R20,0x80
(0030) 		s_ms(500);      
     119 EF04      LDI	R16,0xF4
     11A E011      LDI	R17,1
     11B DFDA      RCALL	_s_ms
(0031) 		DDRD=0xff;      
     11C EF8F      LDI	R24,0xFF
     11D BB81      OUT	0x11,R24
(0032) 		PORTD=0xff;        //A口变输出
     11E BB82      OUT	0x12,R24
(0033) 		s_ms(500);
     11F EF04      LDI	R16,0xF4
     120 E011      LDI	R17,1
     121 DFD4      RCALL	_s_ms
(0034) 		PORTA&=~(1<<EN);   //EN=0
     122 98DF      CBI	0x1B,7
(0035) 		s_ms(500);
     123 EF04      LDI	R16,0xF4
     124 E011      LDI	R17,1

⌨️ 快捷键说明

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