📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile main.c
0000 .dbfile F:\51&av配套光盘\51&avr配套程序\avr程序\24.DS18b20\main.c
0000 .dbfunc e delay_1us _delay_1us fV
.even
0000 _delay_1us::
0000 .dbline -1
0000 .dbline 24
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ;
0000 ; /*************************************************************************
0000 ; ds18b20头文件
0000 ; M16 内部8M
0000 ; *************************************************************************/
0000 ; #define CLR_DIR_1WIRE DDRD&=~BIT(7) //只要修改这里的参数就可以了!呵呵!
0000 ; #define SET_DIR_1WIRE DDRD|=BIT(7) //里面什么都不用该!
0000 ; #define CLR_OP_1WIRE PORTD&=~BIT(7)
0000 ; #define SET_OP_1WIRE PORTD|=BIT(7)
0000 ; #define CHECK_IP_1WIRE (PIND & 0x80) //检测
0000 ;
0000 ;
0000 ; unsigned char wmh,wml;
0000 ;
0000 ;
0000 ; /*-----------------------------------------------------------------------
0000 ; 延时函数
0000 ; 系统时钟:8M
0000 ; -----------------------------------------------------------------------*/
0000 ; void delay_1us(void) //1us延时函数
0000 ; {
0000 .dbline 25
0000 ; asm("nop");
0000 0000 nop
0002 .dbline -2
0002 L1:
0002 .dbline 0 ; func end
0002 0895 ret
0004 .dbend
0004 .dbfunc e delay_nus _delay_nus fV
0004 ; i -> R20,R21
0004 ; n -> R10,R11
.even
0004 _delay_nus::
0004 0E940000 xcall push_xgset300C
0008 5801 movw R10,R16
000A .dbline -1
000A .dbline 29
000A ; }
000A ;
000A ; void delay_nus(unsigned int n) //N us延时函数
000A ; {
000A .dbline 30
000A ; unsigned int i=0;
000A .dbline 31
000A ; for (i=0;i<n;i++)
000A 4427 clr R20
000C 5527 clr R21
000E 03C0 xjmp L6
0010 L3:
0010 .dbline 32
0010 ; delay_1us();
0010 F7DF xcall _delay_1us
0012 L4:
0012 .dbline 31
0012 4F5F subi R20,255 ; offset = 1
0014 5F4F sbci R21,255
0016 L6:
0016 .dbline 31
0016 4A15 cp R20,R10
0018 5B05 cpc R21,R11
001A D0F3 brlo L3
001C X0:
001C .dbline -2
001C L2:
001C .dbline 0 ; func end
001C 0C940000 xjmp pop_xgset300C
0020 .dbsym r i 20 i
0020 .dbsym r n 10 i
0020 .dbend
0020 .dbfunc e delay_1ms _delay_1ms fV
0020 ; i -> R16,R17
.even
0020 _delay_1ms::
0020 .dbline -1
0020 .dbline 36
0020 ; }
0020 ;
0020 ; void delay_1ms(void) //1ms延时函数
0020 ; {
0020 .dbline 38
0020 ; unsigned int i;
0020 ; for (i=0;i<1140;i++);
0020 0027 clr R16
0022 1127 clr R17
0024 02C0 xjmp L11
0026 L8:
0026 .dbline 38
0026 L9:
0026 .dbline 38
0026 0F5F subi R16,255 ; offset = 1
0028 1F4F sbci R17,255
002A L11:
002A .dbline 38
002A 0437 cpi R16,116
002C E4E0 ldi R30,4
002E 1E07 cpc R17,R30
0030 D0F3 brlo L8
0032 X1:
0032 .dbline -2
0032 L7:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbsym r i 16 i
0034 .dbend
0034 .dbfunc e delay_nms _delay_nms fV
0034 ; i -> R20,R21
0034 ; n -> R10,R11
.even
0034 _delay_nms::
0034 0E940000 xcall push_xgset300C
0038 5801 movw R10,R16
003A .dbline -1
003A .dbline 42
003A ; }
003A ;
003A ; void delay_nms(unsigned int n) //N ms延时函数
003A ; {
003A .dbline 43
003A ; unsigned int i=0;
003A .dbline 44
003A ; for (i=0;i<n;i++)
003A 4427 clr R20
003C 5527 clr R21
003E 03C0 xjmp L16
0040 L13:
0040 .dbline 45
0040 ; delay_1ms();
0040 EFDF xcall _delay_1ms
0042 L14:
0042 .dbline 44
0042 4F5F subi R20,255 ; offset = 1
0044 5F4F sbci R21,255
0046 L16:
0046 .dbline 44
0046 4A15 cp R20,R10
0048 5B05 cpc R21,R11
004A D0F3 brlo L13
004C X2:
004C .dbline -2
004C L12:
004C .dbline 0 ; func end
004C 0C940000 xjmp pop_xgset300C
0050 .dbsym r i 20 i
0050 .dbsym r n 10 i
0050 .dbend
0050 .dbfunc e init_1820 _init_1820 fV
.even
0050 _init_1820::
0050 .dbline -1
0050 .dbline 50
0050 ; }
0050 ;
0050 ;
0050 ; void init_1820()
0050 ; {
0050 .dbline 51
0050 ; SET_DIR_1WIRE; //设置PC2 为输出
0050 8F9A sbi 0x11,7
0052 .dbline 52
0052 ; SET_OP_1WIRE;
0052 979A sbi 0x12,7
0054 .dbline 53
0054 ; CLR_OP_1WIRE;
0054 9798 cbi 0x12,7
0056 .dbline 54
0056 ; delay_nus(480); //480us以上
0056 00EE ldi R16,480
0058 11E0 ldi R17,1
005A D4DF xcall _delay_nus
005C .dbline 55
005C ; SET_OP_1WIRE;
005C 979A sbi 0x12,7
005E .dbline 56
005E ; CLR_DIR_1WIRE;
005E 8F98 cbi 0x11,7
0060 .dbline 57
0060 ; delay_nus(20); //15~60us
0060 04E1 ldi R16,20
0062 10E0 ldi R17,0
0064 CFDF xcall _delay_nus
0066 L18:
0066 .dbline 58
0066 ; while(CHECK_IP_1WIRE);
0066 L19:
0066 .dbline 58
0066 8799 sbic 0x10,7
0068 FECF rjmp L18
006A X3:
006A .dbline 59
006A ; SET_DIR_1WIRE;
006A 8F9A sbi 0x11,7
006C .dbline 60
006C ; SET_OP_1WIRE;
006C 979A sbi 0x12,7
006E .dbline 61
006E ; delay_nus(140); //60~240us
006E 0CE8 ldi R16,140
0070 10E0 ldi R17,0
0072 .dbline -2
0072 L17:
0072 .dbline 0 ; func end
0072 C8CF xjmp _delay_nus
0074 .dbend
0074 .dbfunc e write_1820 _write_1820 fV
0074 ; m -> R20
0074 ; x -> R10
.even
0074 _write_1820::
0074 AA92 st -y,R10
0076 4A93 st -y,R20
0078 A02E mov R10,R16
007A .dbline -1
007A .dbline 64
007A ; }
007A ; void write_1820(unsigned char x)
007A ; {
007A .dbline 66
007A ; unsigned char m;
007A ; for(m=0;m<8;m++)
007A 4427 clr R20
007C 10C0 xjmp L25
007E L22:
007E .dbline 67
007E ; {
007E .dbline 68
007E ; CLR_OP_1WIRE;
007E 9798 cbi 0x12,7
0080 .dbline 69
0080 ; if(x&(1<<m)) //写数据了,先写低位的!
0080 01E0 ldi R16,1
0082 142F mov R17,R20
0084 0E940000 xcall lsl8
0088 2A2C mov R2,R10
008A 2022 and R2,R16
008C 11F0 breq L26
008E X4:
008E .dbline 70
008E ; SET_OP_1WIRE;
008E 979A sbi 0x12,7
0090 01C0 xjmp L27
0092 L26:
0092 .dbline 72
0092 ; else
0092 ; {CLR_OP_1WIRE;}
0092 .dbline 72
0092 9798 cbi 0x12,7
0094 .dbline 72
0094 L27:
0094 .dbline 73
0094 ; delay_nus(40); //15~60us
0094 08E2 ldi R16,40
0096 10E0 ldi R17,0
0098 B5DF xcall _delay_nus
009A .dbline 74
009A ; SET_OP_1WIRE;
009A 979A sbi 0x12,7
009C .dbline 75
009C ; }
009C L23:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -