📄 18b20.lst
字号:
__start:
__text_start:
0043 E5CF LDI R28,0x5F
0044 E0D4 LDI R29,4
0045 BFCD OUT 0x3D,R28
0046 BFDE OUT 0x3E,R29
0047 51C0 SUBI R28,0x10
0048 40D0 SBCI R29,0
0049 EA0A LDI R16,0xAA
004A 8308 STD Y+0,R16
004B 2400 CLR R0
004C E6E0 LDI R30,0x60
004D E0F0 LDI R31,0
004E E010 LDI R17,0
004F 36E4 CPI R30,0x64
0050 07F1 CPC R31,R17
0051 F011 BEQ 0x0054
0052 9201 ST R0,Z+
0053 CFFB RJMP 0x004F
0054 8300 STD Z+0,R16
0055 E8E6 LDI R30,0x86
0056 E0F0 LDI R31,0
0057 E6A0 LDI R26,0x60
0058 E0B0 LDI R27,0
0059 E010 LDI R17,0
005A 38E6 CPI R30,0x86
005B 07F1 CPC R31,R17
005C F021 BEQ 0x0061
005D 95C8 LPM
005E 9631 ADIW R30,1
005F 920D ST R0,X+
0060 CFF9 RJMP 0x005A
0061 940E00F7 CALL _main
_exit:
0063 CFFF RJMP _exit
FILE: C:\DOCUME~1\administrator\桌面\教程\18B20\delay.c
(0001) /**********************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 www.avrvi.com **
(0005) ** Time 2007-1-31 **
(0006) ***********************************/
(0007) #include "config.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015) asm("nop");
_delay_1us:
0064 0000 NOP
0065 9508 RET
(0016) }
(0017)
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025) unsigned int i;
(0026) for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
i --> R16
0066 E706 LDI R16,0x76
0067 E014 LDI R17,4
0068 C002 RJMP 0x006B
0069 5001 SUBI R16,1
006A 4010 SBCI R17,0
006B 3000 CPI R16,0
006C 0701 CPC R16,R17
006D F7D9 BNE 0x0069
006E 9508 RET
_delay_1s:
i --> R20
006F 940E034E CALL push_gset1
(0027) ;
(0028) }
(0029)
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036) unsigned int i;
(0037) for(i=250;i>0;i--) //250ms*4=1000ms
0071 EF4A LDI R20,0xFA
0072 E050 LDI R21,0
0073 C003 RJMP 0x0077
(0038) delay_1ms();
0074 DFF1 RCALL _delay_1ms
0075 5041 SUBI R20,1
0076 4050 SBCI R21,0
0077 3040 CPI R20,0
0078 0745 CPC R20,R21
0079 F7D1 BNE 0x0074
(0039) for(i=250;i>0;i--)
007A EF4A LDI R20,0xFA
007B E050 LDI R21,0
007C C003 RJMP 0x0080
(0040) delay_1ms();
007D DFE8 RCALL _delay_1ms
007E 5041 SUBI R20,1
007F 4050 SBCI R21,0
0080 3040 CPI R20,0
0081 0745 CPC R20,R21
0082 F7D1 BNE 0x007D
(0041) for(i=250;i>0;i--)
0083 EF4A LDI R20,0xFA
0084 E050 LDI R21,0
0085 C003 RJMP 0x0089
(0042) delay_1ms();
0086 DFDF RCALL _delay_1ms
0087 5041 SUBI R20,1
0088 4050 SBCI R21,0
0089 3040 CPI R20,0
008A 0745 CPC R20,R21
008B F7D1 BNE 0x0086
(0043) for(i=250;i>0;i--)
008C EF4A LDI R20,0xFA
008D E050 LDI R21,0
008E C003 RJMP 0x0092
(0044) delay_1ms();
008F DFD6 RCALL _delay_1ms
0090 5041 SUBI R20,1
0091 4050 SBCI R21,0
0092 3040 CPI R20,0
0093 0745 CPC R20,R21
0094 F7D1 BNE 0x008F
0095 940E0351 CALL pop_gset1
0097 9508 RET
_delay_us:
i --> R20
n --> R22
0098 940E034C CALL push_gset2
009A 01B8 MOVW R22,R16
(0045) }
(0046)
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052) unsigned int i;
(0053) for(i=n;i>0;i--)
009B 01AB MOVW R20,R22
009C C003 RJMP 0x00A0
(0054) delay_1us();
009D DFC6 RCALL _delay_1us
009E 5041 SUBI R20,1
009F 4050 SBCI R21,0
00A0 3040 CPI R20,0
00A1 0745 CPC R20,R21
00A2 F7D1 BNE 0x009D
00A3 940E033D CALL pop_gset2
00A5 9508 RET
_delay_ms:
i --> R20
n --> R22
00A6 940E034C CALL push_gset2
00A8 01B8 MOVW R22,R16
(0055) }
(0056)
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062) unsigned int i;
(0063) for(i=n;i>0;i--)
00A9 01AB MOVW R20,R22
00AA C003 RJMP 0x00AE
(0064) delay_1ms();
00AB DFBA RCALL _delay_1ms
00AC 5041 SUBI R20,1
00AD 4050 SBCI R21,0
00AE 3040 CPI R20,0
00AF 0745 CPC R20,R21
00B0 F7D1 BNE 0x00AB
00B1 940E033D CALL pop_gset2
00B3 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
00B4 940E034C CALL push_gset2
00B6 01B8 MOVW R22,R16
(0065) }
(0066)
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072) unsigned int i,j;
(0073) for(j=n;j>0;j--)
00B7 01AB MOVW R20,R22
00B8 C026 RJMP 0x00DF
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
00B9 EF6A LDI R22,0xFA
00BA E070 LDI R23,0
00BB C003 RJMP 0x00BF
(0076) delay_1ms();
00BC DFA9 RCALL _delay_1ms
00BD 5061 SUBI R22,1
00BE 4070 SBCI R23,0
00BF 3060 CPI R22,0
00C0 0767 CPC R22,R23
00C1 F7D1 BNE 0x00BC
(0077) for(i=250;i>0;i--)
00C2 EF6A LDI R22,0xFA
00C3 E070 LDI R23,0
00C4 C003 RJMP 0x00C8
(0078) delay_1ms();
00C5 DFA0 RCALL _delay_1ms
00C6 5061 SUBI R22,1
00C7 4070 SBCI R23,0
00C8 3060 CPI R22,0
00C9 0767 CPC R22,R23
00CA F7D1 BNE 0x00C5
(0079) for(i=250;i>0;i--)
00CB EF6A LDI R22,0xFA
00CC E070 LDI R23,0
00CD C003 RJMP 0x00D1
(0080) delay_1ms();
00CE DF97 RCALL _delay_1ms
00CF 5061 SUBI R22,1
00D0 4070 SBCI R23,0
00D1 3060 CPI R22,0
00D2 0767 CPC R22,R23
00D3 F7D1 BNE 0x00CE
(0081) for(i=250;i>0;i--)
00D4 EF6A LDI R22,0xFA
00D5 E070 LDI R23,0
00D6 C003 RJMP 0x00DA
(0082) delay_1ms();
00D7 DF8E RCALL _delay_1ms
00D8 5061 SUBI R22,1
00D9 4070 SBCI R23,0
00DA 3060 CPI R22,0
00DB 0767 CPC R22,R23
00DC F7D1 BNE 0x00D7
00DD 5041 SUBI R20,1
00DE 4050 SBCI R21,0
00DF 3040 CPI R20,0
00E0 0745 CPC R20,R21
00E1 F6B9 BNE 0x00B9
00E2 940E033D CALL pop_gset2
00E4 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\教程\18B20\main.c
(0001) // ICC-AVR application builder : 2007-2-14 21:34:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 18B20 演示程序
(0005)
(0006) #include "config.h"
(0007)
(0008) extern unsigned char count;
(0009)
(0010) void port_init(void)
(0011) {
(0012) PORTA = 0x00;
_port_init:
00E5 2422 CLR R2
00E6 BA2B OUT 0x1B,R2
(0013) DDRA = 0x00;
00E7 BA2A OUT 0x1A,R2
(0014) PORTB = 0x00;
00E8 BA28 OUT 0x18,R2
(0015) DDRB = 0x00;
00E9 BA27 OUT 0x17,R2
(0016) PORTC = 0x00; //m103 output only
00EA BA25 OUT 0x15,R2
(0017) DDRC = 0x00;
00EB BA24 OUT 0x14,R2
(0018) PORTD = 0x00;
00EC BA22 OUT 0x12,R2
(0019) DDRD = 0x00;
00ED BA21 OUT 0x11,R2
00EE 9508 RET
(0020) }
(0021)
(0022) //call this routine to initialize all peripherals
(0023) void init_devices(void)
(0024) {
(0025) //stop errant interrupts until set up
(0026) CLI(); //disable all interrupts
_init_devices:
00EF 94F8 BCLR 7
(0027) port_init();
00F0 DFF4 RCALL _port_init
(0028)
(0029) MCUCR = 0x00;
00F1 2422 CLR R2
00F2 BE25 OUT 0x35,R2
(0030) GICR = 0x00;
00F3 BE2B OUT 0x3B,R2
(0031) TIMSK = 0x00; //timer interrupt sources
00F4 BE29 OUT 0x39,R2
(0032) SEI(); //re-enable interrupts
00F5 9478 BSET 7
00F6 9508 RET
(0033) //all peripherals are now initialized
(0034) }
(0035)
(0036) void main(void)
(0037) {
(0038) unsigned int temp1;
(0039) init_devices();
_main:
temp1 --> Y+1
00F7 DFF7 RCALL _init_devices
00F8 C008 RJMP 0x0101
(0040) while(1)
(0041) {
(0042) gettemp();
00F9 940E015A CALL _gettemp
(0043) display(count,0); //补零模式显示温度
00FB 2722 CLR R18
00FC 91000060 LDS R16,count
00FE 2711 CLR R17
00FF 940E0274 CALL _display
0101 CFF7 RJMP 0x00F9
0102 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\教程\18B20\18b20.c
(0001) /**************************************
(0002) ** Filename: 18b20.c
(0003) ** Describe: 18b20 温度传感器
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time : 2007-2-15
(0006) **************************************/
(0007)
(0008) #include "config.h"
(0009)
(0010) unsigned char wmh,wml,flag,count; //flag温度为负标志,count为实际温度
(0011) void init_1820(void)
(0012) {
(0013) SET_DIR_1WIRE; //设置PC2 为输出
_init_1820:
0103 9ABC SBI 0x17,4
(0014) SET_OP_1WIRE;
0104 9AC4 SBI 0x18,4
(0015) CLR_OP_1WIRE;
0105 98C4 CBI 0x18,4
(0016) delay_us(480); //480us以上
0106 EE00 LDI R16,0xE0
0107 E011 LDI R17,1
0108 940E0098 CALL _delay_us
(0017) SET_OP_1WIRE;
010A 9AC4 SBI 0x18,4
(0018) CLR_DIR_1WIRE;
010B 98BC CBI 0x17,4
(0019) delay_us(20); //15~60us
010C E104 LDI R16,0x14
010D E010 LDI R17,0
010E 940E0098 CALL _delay_us
(0020) while(CHECK_IP_1WIRE);
0110 99B4 SBIC 0x16,4
0111 CFFE RJMP 0x0110
(0021) SET_DIR_1WIRE;
0112 9ABC SBI 0x17,4
(0022) SET_OP_1WIRE;
0113 9AC4 SBI 0x18,4
(0023) delay_us(140); //60~240us
0114 E80C LDI R16,0x8C
0115 E010 LDI R17,0
0116 940E0098 CALL _delay_us
0118 9508 RET
_write_1820:
m --> R20
x --> R22
0119 940E034C CALL push_gset2
011B 2F60 MOV R22,R16
(0024) }
(0025) void write_1820(unsigned char x)
(0026) {
(0027) unsigned char m;
(0028) for(m=0;m<8;m++)
011C 2744 CLR R20
011D C011 RJMP 0x012F
(0029) {
(0030) CLR_OP_1WIRE;
011E 98C4 CBI 0x18,4
(0031) if(x&(1<<m)) //写数据了,先写低位的!
011F E001 LDI R16,1
0120 2F14 MOV R17,R20
0121 940E0382 CALL lsl8
0123 2E26 MOV R2,R22
0124 2220 AND R2,R16
0125 F011 BEQ 0x0128
(0032) SET_OP_1WIRE;
0126 9AC4 SBI 0x18,4
0127 C001 RJMP 0x0129
(0033) else
(0034) {CLR_OP_1WIRE;}
0128 98C4 CBI 0x18,4
(0035) delay_us(40); //15~60us
0129 E208 LDI R16,0x28
012A E010 LDI R17,0
012B 940E0098 CALL _delay_us
(0036) SET_OP_1WIRE;
012D 9AC4 SBI 0x18,4
012E 9543 INC R20
012F 3048 CPI R20,0x8
0130 F368 BCS 0x011E
(0037) }
(0038) SET_OP_1WIRE;
0131 9AC4 SBI 0x18,4
0132 940E033D CALL pop_gset2
0134 9508 RET
_read_1820:
temp --> R20
k --> R22
n --> R10
0135 940E034A CALL push_gset3
(0039) }
(0040) unsigned char read_1820(void)
(0041) {
(0042) unsigned char temp,k,n;
(0043) temp=0;
0137 2744 CLR R20
(0044) for(n=0;n<8;n++)
0138 24AA CLR R10
0139 C019 RJMP 0x0153
(0045) {
(0046) CLR_OP_1WIRE;
013A 98C4 CBI 0x18,4
(0047) SET_OP_1WIRE;
013B 9AC4 SBI 0x18,4
(0048) CLR_DIR_1WIRE;
013C 98BC CBI 0x17,4
(0049) k=(CHECK_IP_1WIRE); //读数据,从低位开始
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -