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

📄 ds18b20.lst

📁 AVR-based single-chip temperature display system, so absolutely! DS18B20 sensors used
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0034 E5CF      LDI	R28,0x5F
    0035 E0D4      LDI	R29,4
    0036 BFCD      OUT	0x3D,R28
    0037 BFDE      OUT	0x3E,R29
    0038 51C0      SUBI	R28,0x10
    0039 40D0      SBCI	R29,0
    003A EA0A      LDI	R16,0xAA
    003B 8308      STD	Y+0,R16
    003C 2400      CLR	R0
    003D E7E4      LDI	R30,0x74
    003E E0F0      LDI	R31,0
    003F E010      LDI	R17,0
    0040 37EA      CPI	R30,0x7A
    0041 07F1      CPC	R31,R17
    0042 F011      BEQ	0x0045
    0043 9201      ST	R0,Z+
    0044 CFFB      RJMP	0x0040
    0045 8300      STD	Z+0,R16
    0046 E5E4      LDI	R30,0x54
    0047 E0F0      LDI	R31,0
    0048 E6A0      LDI	R26,0x60
    0049 E0B0      LDI	R27,0
    004A E010      LDI	R17,0
    004B 36E8      CPI	R30,0x68
    004C 07F1      CPC	R31,R17
    004D F021      BEQ	0x0052
    004E 95C8      LPM
    004F 9631      ADIW	R30,1
    0050 920D      ST	R0,X+
    0051 CFF9      RJMP	0x004B
    0052 940E014A  CALL	_main
_exit:
    0054 CFFF      RJMP	_exit
FILE: G:\ds18b20\ds18b20.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define DQ_IN	DDRA &= ~(1 << PA7)		/*设置输入*/
(0005) #define DQ_OUT	DDRA |= (1 << PA7)		/*设置输出*/
(0006) #define DQ_CLR	PORTA &= ~(1 << PA7)	/*置低电平*/
(0007) #define DQ_SET	PORTA |= (1 << PA7)		/*置高电平*/
(0008) #define DQ_R	PINA & (1 << PA7)		/*读了电平*/
(0009) unsigned char led_7[] = {0X3f,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x40,0x00,};
(0010) unsigned char flag;						/*中断标志缓存*/
(0011) unsigned char position[4]={0X07,0X0B,0X0D,0X0E};
(0012) //unsigned char time[2];//显示时,分,
(0013) unsigned char   dis_buff[4];   // 显示缓冲区    
(0014) unsigned char   posit;
(0015) unsigned char led_buf[] = {0,0,0,0,};			/*显示信息*/
(0016) /*********************delay function********************/
(0017) void delay_1us(void)                 //1us延时函数
(0018)   {
(0019)    asm("nop");
_delay_1us:
    0055 0000      NOP
    0056 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0057 940E023C  CALL	push_gset2
    0059 01B8      MOVW	R22,R16
(0020)   }
(0021) 
(0022) void delay_nus(unsigned int n)       //N us延时函数
(0023)   {
(0024)    unsigned int i=0;
    005A 2744      CLR	R20
    005B 2755      CLR	R21
(0025)    for (i=0;i<n;i++)
    005C C003      RJMP	0x0060
(0026)    delay_1us();
    005D DFF7      RCALL	_delay_1us
    005E 5F4F      SUBI	R20,0xFF
    005F 4F5F      SBCI	R21,0xFF
    0060 1746      CP	R20,R22
    0061 0757      CPC	R21,R23
    0062 F3D0      BCS	0x005D
    0063 940E0233  CALL	pop_gset2
    0065 9508      RET
(0027)   }
(0028)   
(0029) void delay_1ms(void)                 //1ms延时函数
(0030)   {
(0031)    unsigned int i;
(0032)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    0066 2700      CLR	R16
    0067 2711      CLR	R17
    0068 C002      RJMP	0x006B
    0069 5F0F      SUBI	R16,0xFF
    006A 4F1F      SBCI	R17,0xFF
    006B 3704      CPI	R16,0x74
    006C E0E4      LDI	R30,4
    006D 071E      CPC	R17,R30
    006E F3D0      BCS	0x0069
    006F 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0070 940E023C  CALL	push_gset2
    0072 01B8      MOVW	R22,R16
(0033)   }
(0034)   
(0035) void delay_nms(unsigned int n)       //N ms延时函数
(0036)   {
(0037)    unsigned int i=0;
    0073 2744      CLR	R20
    0074 2755      CLR	R21
(0038)    for (i=0;i<n;i++)
    0075 C003      RJMP	0x0079
(0039)    delay_1ms();
    0076 DFEF      RCALL	_delay_1ms
    0077 5F4F      SUBI	R20,0xFF
    0078 4F5F      SBCI	R21,0xFF
    0079 1746      CP	R20,R22
    007A 0757      CPC	R21,R23
    007B F3D0      BCS	0x0076
    007C 940E0233  CALL	pop_gset2
    007E 9508      RET
_ds1820_reset:
  i                    --> R20
    007F 940E023E  CALL	push_gset1
(0040)   }
(0041) 
(0042) /*DS18B20复位函数*/
(0043) unsigned char ds1820_reset(void) {
(0044) 
(0045) 	unsigned char i;
(0046) 	flag = SREG;				/*中断保护*/
    0081 B62F      IN	R2,0x3F
    0082 92200079  STS	flag,R2
(0047) 	CLI();						/*关中断*/
    0084 94F8      BCLR	7
(0048) 	DQ_OUT;
    0085 9AD7      SBI	0x1A,7
(0049) 	DQ_CLR;
    0086 98DF      CBI	0x1B,7
(0050) 	delay_nus(500);				/*延时500uS(480-960)*/
    0087 EF04      LDI	R16,0xF4
    0088 E011      LDI	R17,1
    0089 DFCD      RCALL	_delay_nus
(0051) 	DQ_SET;
    008A 9ADF      SBI	0x1B,7
(0052) 	DQ_IN;
    008B 98D7      CBI	0x1A,7
(0053) 	delay_nus(80);			/*延时80uS*/
    008C E500      LDI	R16,0x50
    008D E010      LDI	R17,0
    008E DFC8      RCALL	_delay_nus
(0054) 	i = DQ_R;
    008F B349      IN	R20,0x19
    0090 7840      ANDI	R20,0x80
(0055) 	delay_nus(490);				/*延时500uS(保持>480uS)*/
    0091 EE0A      LDI	R16,0xEA
    0092 E011      LDI	R17,1
    0093 DFC3      RCALL	_delay_nus
(0056) 	if (flag & 0x80) {			/*恢复中断状态*/
    0094 90200079  LDS	R2,flag
    0096 FE27      SBRS	R2,7
    0097 C001      RJMP	0x0099
(0057) 		SEI();
    0098 9478      BSET	7
(0058) 		}
(0059) 	if (i) {
    0099 2344      TST	R20
    009A F011      BEQ	0x009D
(0060) 		return 0x00;
    009B 2700      CLR	R16
    009C C001      RJMP	0x009E
(0061) 		}
(0062) 	else {
(0063) 		return 0x01;
    009D E001      LDI	R16,1
    009E 940E0241  CALL	pop_gset1
    00A0 9508      RET
_ds1820_read_byte:
  value                --> R20
  i                    --> R22
    00A1 940E023C  CALL	push_gset2
(0064) 		}
(0065) }
(0066) 
(0067) /*DS18B20字节读取函数*/
(0068) unsigned char ds1820_read_byte(void) {
(0069) 
(0070) 	unsigned char i;
(0071) 	unsigned char value = 0;
    00A3 2744      CLR	R20
(0072) 	flag = SREG;				/*中断保护*/
    00A4 B62F      IN	R2,0x3F
    00A5 92200079  STS	flag,R2
(0073) 	CLI();						/*关中断*/
    00A7 94F8      BCLR	7
(0074) 	for (i = 8; i != 0; i--) {
    00A8 E068      LDI	R22,0x8
    00A9 C012      RJMP	0x00BC
(0075) 		value >>= 1;
    00AA 9546      LSR	R20
(0076) 		DQ_OUT;
    00AB 9AD7      SBI	0x1A,7
(0077) 		DQ_CLR;
    00AC 98DF      CBI	0x1B,7
(0078) 		delay_nus(10);
    00AD E00A      LDI	R16,0xA
    00AE E010      LDI	R17,0
    00AF DFA7      RCALL	_delay_nus
(0079) 		DQ_SET;
    00B0 9ADF      SBI	0x1B,7
(0080) 		DQ_IN;
    00B1 98D7      CBI	0x1A,7
(0081) 		delay_nus(10);
    00B2 E00A      LDI	R16,0xA
    00B3 E010      LDI	R17,0
    00B4 DFA2      RCALL	_delay_nus
(0082) 		if (DQ_R) {
    00B5 9BCF      SBIS	0x19,7
    00B6 C001      RJMP	0x00B8
(0083) 			value|=0x80;
    00B7 6840      ORI	R20,0x80
(0084) 			}
(0085) 		delay_nus(60);		/*延时60uS*/
    00B8 E30C      LDI	R16,0x3C
    00B9 E010      LDI	R17,0
    00BA DF9C      RCALL	_delay_nus
    00BB 956A      DEC	R22
    00BC 2366      TST	R22
    00BD F761      BNE	0x00AA
(0086) 		}
(0087) 	if (flag & 0x80) {			/*恢复中断状态*/
    00BE 90200079  LDS	R2,flag
    00C0 FE27      SBRS	R2,7
    00C1 C001      RJMP	0x00C3
(0088) 		SEI();
    00C2 9478      BSET	7
(0089) 		}
(0090) 	return(value);
    00C3 2F04      MOV	R16,R20
    00C4 940E0233  CALL	pop_gset2
    00C6 9508      RET
_ds1820_write_byte:
  i                    --> R20
  value                --> R22
    00C7 940E023C  CALL	push_gset2
    00C9 2F60      MOV	R22,R16
(0091) }
(0092) 
(0093) /*DS18B20字节写入函数*/
(0094) void ds1820_write_byte(unsigned char value) {
(0095) 
(0096) 	unsigned char i;
(0097) 	flag = SREG;				/*中断保护*/
    00CA B62F      IN	R2,0x3F
    00CB 92200079  STS	flag,R2
(0098) 	CLI();						/*关中断*/
    00CD 94F8      BCLR	7
(0099) 	for (i = 8; i != 0; i--) {
    00CE E048      LDI	R20,0x8
    00CF C00D      RJMP	0x00DD
(0100) 		DQ_OUT;
    00D0 9AD7      SBI	0x1A,7
(0101) 		DQ_CLR;
    00D1 98DF      CBI	0x1B,7
(0102) 		delay_nus(4);
    00D2 E004      LDI	R16,4
    00D3 E010      LDI	R17,0
    00D4 DF82      RCALL	_delay_nus
(0103) 		if (value & 0x01) {
    00D5 FD60      SBRC	R22,0
(0104) 			DQ_SET;
    00D6 9ADF      SBI	0x1B,7
(0105) 			}
(0106) 		delay_nus(80);	/*延时80uS*/
    00D7 E500      LDI	R16,0x50
    00D8 E010      LDI	R17,0
    00D9 DF7D      RCALL	_delay_nus
(0107) 		DQ_SET;					/*位结束*/
    00DA 9ADF      SBI	0x1B,7
(0108) 		value >>= 1;
    00DB 9566      LSR	R22
    00DC 954A      DEC	R20
    00DD 2344      TST	R20
    00DE F789      BNE	0x00D0
(0109) 		}
(0110) 	if (flag & 0x80) {			/*恢复中断状态*/
    00DF 90200079  LDS	R2,flag
    00E1 FE27      SBRS	R2,7
    00E2 C001      RJMP	0x00E4
(0111) 		SEI();
    00E3 9478      BSET	7
(0112) 		}
    00E4 940E0233  CALL	pop_gset2
    00E6 9508      RET
(0113) }
(0114) 
(0115) /*启动ds1820转换*/
(0116) void ds1820_start(void) {
(0117) 
(0118) 	ds1820_reset();
_ds1820_start:
    00E7 DF97      RCALL	_ds1820_reset
(0119) 	ds1820_write_byte(0xCC);	/*勿略地址*/
    00E8 EC0C      LDI	R16,0xCC
    00E9 DFDD      RCALL	_ds1820_write_byte
(0120) 	ds1820_write_byte(0x44);	/*启动转换*/
    00EA E404      LDI	R16,0x44
    00EB DFDB      RCALL	_ds1820_write_byte
    00EC 9508      RET
_ds1820_read_temp:
  buf                  --> Y+0
  i                    --> R20
    00ED 940E023E  CALL	push_gset1
    00EF 9729      SBIW	R28,0x9
(0121) }
(0122) 
(0123) /*DS8B20读取温度信息*/
(0124) unsigned int ds1820_read_temp(void) {
(0125) 
(0126) 	unsigned int i;
(0127) 	unsigned char buf[9];
(0128) 
(0129) 	ds1820_reset();
    00F0 DF8E      RCALL	_ds1820_reset
(0130) 	ds1820_write_byte(0xCC);	/*勿略地址*/
    00F1 EC0C      LDI	R16,0xCC
    00F2 DFD4      RCALL	_ds1820_write_byte
(0131) 	ds1820_write_byte(0xBE);	/*读取温度*/
    00F3 EB0E      LDI	R16,0xBE
    00F4 DFD2      RCALL	_ds1820_write_byte
(0132) 	for (i = 0; i < 9; i++) {
    00F5 2744      CLR	R20
    00F6 2755      CLR	R21
    00F7 C008      RJMP	0x0100
(0133) 		buf[i] = ds1820_read_byte();
    00F8 DFA8      RCALL	_ds1820_read_byte
    00F9 01CE      MOVW	R24,R28
    00FA 01FA      MOVW	R30,R20
    00FB 0FE8      ADD	R30,R24
    00FC 1FF9      ADC	R31,R25
    00FD 8300      STD	Z+0,R16
    00FE 5F4F      SUBI	R20,0xFF
    00FF 4F5F      SBCI	R21,0xFF
    0100 3049      CPI	R20,0x9
    0101 E0E0      LDI	R30,0
    0102 075E      CPC	R21,R30
    0103 F3A0      BCS	0x00F8
(0134) 		}
(0135) 	i = buf[1];
    0104 8149      LDD	R20,Y+1
    0105 2755      CLR	R21
(0136) 	i <<= 8;
    0106 2F54      MOV	R21,R20
    0107 2744      CLR	R20
(0137) 	i |= buf[0];
    0108 8028      LDD	R2,Y+0
    0109 2433      CLR	R3
    010A 2942      OR	R20,R2
    010B 2953      OR	R21,R3
(0138) 	
(0139) 	return i;
    010C 018A      MOVW	R16,R20
    010D 9629      ADIW	R28,0x9
    010E 940E0241  CALL	pop_gset1
    0110 9508      RET
(0140) }
(0141) void time_to_disbuffer(int a,int b,int c,int d)//时间送显示缓冲区函数
(0142) {   
(0143)   
(0144)     dis_buff[0] = a;
_time_to_disbuffer:
  d                    --> Y+2
  c                    --> Y+0
  b                    --> R18
  a                    --> R16
    0111 93000075  STS	dis_buff,R16
(0145)     dis_buff[1] =b;
    0113 93200076  STS	dis_buff+1,R18
(0146) 	dis_buff[2] = c;
    0115 8028      LDD	R2,Y+0
    0116 8039      LDD	R3,Y+1
    0117 92200077  STS	dis_buff+2,R2
(0147)     dis_buff[3] =d;
    0119 802A      LDD	R2,Y+2
    011A 803B      LDD	R3,Y+3
    011B 92200078  STS	dis_buff+3,R2
    011D 9508      RET
(0148) 
(0149) }
(0150) void display(void)//数码管显示程序
(0151) {     PORTD = 0xff;
_display:
    011E EF8F      LDI	R24,0xFF
    011F BB82      OUT	0x12,R24
(0152)   PORTC = led_7[dis_buff[posit]];

⌨️ 快捷键说明

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