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

📄 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 0297 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\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 DFDA      RCALL	_ds1820_write_byte
      D2 9508      RET
_ds1820_read_temp:
  buf                  --> Y,+0
  i                    --> R20
      D3 934A      ST	R20,-Y
      D4 935A      ST	R21,-Y
      D5 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();
      D6 DF94      RCALL	_ds1820_reset
(0118)  ds1820_write_byte(0xCC); //勿略ROM
      D7 EC0C      LDI	R16,0xCC
      D8 DFD3      RCALL	_ds1820_write_byte
(0119)  ds1820_write_byte(0xBE); //读温度
      D9 EB0E      LDI	R16,0xBE
      DA DFD1      RCALL	_ds1820_write_byte
(0120)  for (i = 0; i < 9; i++) {
      DB 2744      CLR	R20
      DC 2755      CLR	R21
      DD C008      RJMP	0x00E6
(0121)   buf[i] = ds1820_read_byte();
      DE DFA7      RCALL	_ds1820_read_byte
      DF 01CE      MOVW	R24,R28
      E0 01FA      MOVW	R30,R20
      E1 0FE8      ADD	R30,R24
      E2 1FF9      ADC	R31,R25
      E3 8300      STD	Z+0,R16
      E4 5F4F      SUBI	R20,0xFF
      E5 4F5F      SBCI	R21,0xFF
      E6 3049      CPI	R20,0x9
      E7 E0E0      LDI	R30,0
      E8 075E      CPC	R21,R30
      E9 F3A0      BCS	0x00DE
(0122)   }
(0123)  i = buf[1];
      EA 8149      LDD	R20,Y+1
      EB 2755      CLR	R21
(0124)  i <<= 8;
      EC 2F54      MOV	R21,R20
      ED 2744      CLR	R20
(0125)  i |= buf[0];
      EE 8028      LDD	R2,Y+0
      EF 2433      CLR	R3
      F0 2942      OR	R20,R2
      F1 2953      OR	R21,R3
(0126)  return i;
      F2 018A      MOVW	R16,R20
      F3 9629      ADIW	R28,0x9
      F4 9159      LD	R21,Y+
      F5 9149      LD	R20,Y+
      F6 9508      RET
FILE: E:\产品\开发板\光盘\16实验程序\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
      F7 C002      RJMP	0x00FA
      F8 5001      SUBI	R16,1
      F9 4010      SBCI	R17,0
      FA E081      LDI	R24,1
      FB E090      LDI	R25,0
      FC 1780      CP	R24,R16
      FD 0791      CPC	R25,R17
      FE F3C8      BCS	0x00F8
      FF 9508      RET
_busy:
  temp                 --> R20
     100 934A      ST	R20,-Y
(0011) }	
(0012) 
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016)     uchar temp;
(0017) 	s_ms(500);
     101 EF04      LDI	R16,0xF4
     102 E011      LDI	R17,1
     103 DFF3      RCALL	_s_ms
(0018) 	PORTA&=~(1<<RS);    //RS=0
     104 98DD      CBI	0x1B,5
(0019) 	s_ms(500);
     105 EF04      LDI	R16,0xF4
     106 E011      LDI	R17,1
     107 DFEF      RCALL	_s_ms
(0020) 	PORTA|=(1<<RW);     //RW=1
     108 9ADE      SBI	0x1B,6
(0021) 	s_ms(500);
     109 EF04      LDI	R16,0xF4
     10A E011      LDI	R17,1
     10B DFEB      RCALL	_s_ms
     10C C01A      RJMP	0x0127
(0022) 	while(temp)
(0023) 	{
(0024) 		PORTA|=(1<<EN); //EN=1
     10D 9ADF      SBI	0x1B,7
(0025) 		s_ms(500);
     10E EF04      LDI	R16,0xF4
     10F E011      LDI	R17,1
     110 DFE6      RCALL	_s_ms
(0026) 		DDRD=0x00;      //A口变输入
     111 2422      CLR	R2
     112 BA21      OUT	0x11,R2
(0027) 		PORTD=0xff;     //上拉使能
     113 EF8F      LDI	R24,0xFF
     114 BB82      OUT	0x12,R24
(0028) 		s_ms(500);
     115 EF04      LDI	R16,0xF4
     116 E011      LDI	R17,1
     117 DFDF      RCALL	_s_ms
(0029) 		temp = PIND&0x80;    //读取A口
     118 B340      IN	R20,0x10
     119 7840      ANDI	R20,0x80
(0030) 		s_ms(500);      
     11A EF04      LDI	R16,0xF4
     11B E011      LDI	R17,1
     11C DFDA      RCALL	_s_ms
(0031) 		DDRD=0xff;      
     11D EF8F      LDI	R24,0xFF
     11E BB81      OUT	0x11,R24
(0032) 		PORTD=0xff;        //A口变输出
     11F BB82      OUT	0x12,R24
(0033) 		s_ms(500);
     120 EF04      LDI	R16,0xF4
     121 E011      LDI	R17,1
     122 DFD4      RCALL	_s_ms
(0034) 		PORTA&=~(1<<EN);   //EN=0
     123 98DF      CBI	0x1B,7
(0035) 		s_ms(500);
     124 EF04      LDI	R16,0xF4

⌨️ 快捷键说明

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