📄 ds18b20.lst
字号:
__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 + -