📄 ds18b20.lis
字号:
.module DS18B20.C
.area text(rom, con, rel)
0000 .dbfile C:/icc/include/AVR_PQ1A.h
0000 .dbfunc e Delayus _Delayus fV
0000 ; i -> R20,R21
0000 ; US -> R22,R23
.even
0000 _Delayus::
0000 0E940000 xcall push_gset2
0004 B801 movw R22,R16
0006 .dbline -1
0006 .dbline 28
0006 ; /*******************************************
0006 ; 文件:DS18B20.C
0006 ; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
0006 ; 硬件:ATMEGA16芯片
0006 ; 日期:2006年12月10日
0006 ; 功能:驱动开发板上的温度传感器DS18B20(作者只做了正温度值的显示,负温度值的显示读者可自行编写)。
0006 ; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
0006 ; /******************************************/
0006 ; #include <iom16v.h> //包含型号头文件
0006 ; #include <macros.h> //包含"位"操作头文件
0006 ; #include <stdio.h> //标准输入输出头文件
0006 ; #include <AVR_PQ1A.h> //包含自定义常量头文件
0006 ; #include "SMG.C" //包含数码管显示函数
0006 ;
0006 ; /*******************************************
0006 ; 函数名称: B20_init
0006 ; 功 能: 复位DS18B20
0006 ; 参 数: 无
0006 ; 返回值 : 无
0006 ; /********************************************/
0006 ; void B20_init(void)
0006 ; {
0006 ; DDRA|=BIT(DS18B20); //配置为输出
0006 ; PORTA&=~BIT(DS18B20); //拉低
0006 ; Delayus(600); //等待600微秒
0006 ; PORTA|=BIT(DS18B20); //释放总线
0006 ; Delayus(60); //等待60微秒
0006 ; DDRA&=~BIT(DS18B20); //配置为输入
0006 .dbline 30
0006 ; while((PINA&(BIT(DS18B20)))); //等待DS18B20拉低
0006 ; while(!(PINA&(BIT(DS18B20)))); //等待DS18B20释放总线
0006 05E0 ldi R16,5
0008 10E0 ldi R17,0
000A 9B01 movw R18,R22
000C 0E940000 xcall empy16s
0010 B801 movw R22,R16
0012 7695 lsr R23
0014 6795 ror R22
0016 7695 lsr R23
0018 6795 ror R22
001A .dbline 31
001A 4427 clr R20
001C 5527 clr R21
001E 02C0 xjmp L5
0020 L2:
0020 .dbline 31
0020 L3:
0020 .dbline 31
0020 4F5F subi R20,255 ; offset = 1
0022 5F4F sbci R21,255
0024 L5:
0024 .dbline 31
0024 ; }
0024 4617 cp R20,R22
0026 5707 cpc R21,R23
0028 D8F3 brlo L2
002A .dbline -2
002A .dbline 32
002A ; /*******************************************
002A L1:
002A 0E940000 xcall pop_gset2
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r i 20 i
0030 .dbsym r US 22 i
0030 .dbend
0030 .dbfunc e Delayms _Delayms fV
0030 ; i -> R20,R21
0030 ; j -> R22,R23
0030 ; MS -> R16,R17
.even
0030 _Delayms::
0030 0E940000 xcall push_gset2
0034 .dbline -1
0034 .dbline 40
0034 ; 函数名称: B20_readB
0034 ; 功 能: 读取一个字节的数据
0034 ; 参 数: 无
0034 ; 返回值 : retd--返回的一个字节数据
0034 ; /********************************************/
0034 ; uchar B20_readB(void)
0034 ; {
0034 ; uchar i,retd=0;
0034 .dbline 42
0034 ; for(i=0;i<8;i++) //位计数值
0034 ; {
0034 4427 clr R20
0036 5527 clr R21
0038 0BC0 xjmp L10
003A L7:
003A .dbline 43
003A 6627 clr R22
003C 7727 clr R23
003E 02C0 xjmp L14
0040 L11:
0040 .dbline 43
0040 L12:
0040 .dbline 43
0040 6F5F subi R22,255 ; offset = 1
0042 7F4F sbci R23,255
0044 L14:
0044 .dbline 43
0044 6537 cpi R22,117
0046 E4E0 ldi R30,4
0048 7E07 cpc R23,R30
004A D0F3 brlo L11
004C L8:
004C .dbline 42
004C 4F5F subi R20,255 ; offset = 1
004E 5F4F sbci R21,255
0050 L10:
0050 .dbline 42
0050 4017 cp R20,R16
0052 5107 cpc R21,R17
0054 90F3 brlo L7
0056 .dbline -2
0056 .dbline 44
0056 ; retd>>=1; //右移,准备接受新的数据位
0056 ; DDRA|=BIT(DS18B20); //配置为输出
0056 L6:
0056 0E940000 xcall pop_gset2
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r i 20 i
005C .dbsym r j 22 i
005C .dbsym r MS 16 i
005C .dbend
005C .dbfunc e Board_init _Board_init fV
.even
005C _Board_init::
005C .dbline -1
005C .dbline 52
005C ; PORTA&=~BIT(DS18B20); //拉低,启动读数据位
005C ; PORTA|=BIT(DS18B20); //释放总线
005C ; Delayus(5); //等待5微秒
005C ; DDRA&=~BIT(DS18B20); //配置为输入,开始读取数据位
005C ; if(PINA&BIT(DS18B20)) //该位是否为高
005C ; {
005C ; retd|=0x80; //是就将此位置高
005C ; }
005C .dbline 53
005C ; Delayus(50); //等待50微秒
005C 8FEF ldi R24,255
005E 8ABB out 0x1a,R24
0060 .dbline 54
0060 ; }
0060 87BB out 0x17,R24
0062 .dbline 55
0062 ; return retd; //将读到的一个字节返回
0062 84BB out 0x14,R24
0064 .dbline 56
0064 ; }
0064 81BB out 0x11,R24
0066 .dbline 58
0066 ; /*******************************************
0066 ; 函数名称: B20_writeB
0066 2224 clr R2
0068 2DB8 out 0xd,R2
006A .dbline 60
006A ; 功 能: 写入一个字节的数据
006A ; 参 数: wrd--要写入的数据
006A DE9A sbi 0x1b,6
006C .dbline 61
006C ; 返回值 : 无
006C AE98 cbi 0x15,6
006E .dbline 62
006E ; /********************************************/
006E D998 cbi 0x1b,1
0070 .dbline 63
0070 ; void B20_writeB(uchar wrd)
0070 88BB out 0x18,R24
0072 .dbline 64
0072 ; {
0072 DA9A sbi 0x1b,2
0074 .dbline 65
0074 ; uchar i;
0074 05E0 ldi R16,5
0076 10E0 ldi R17,0
0078 C3DF xcall _Delayus
007A .dbline 66
007A ; for(i=0;i<8;i++) //位计数值
007A DA98 cbi 0x1b,2
007C .dbline 68
007C ; {
007C ; DDRA|=BIT(DS18B20); //配置为输出
007C 2224 clr R2
007E 28BA out 0x18,R2
0080 .dbline 69
0080 ; PORTA&=~BIT(DS18B20); //拉低,启动写数据位
0080 DB9A sbi 0x1b,3
0082 .dbline 70
0082 ; Delayus(1); //等待1微秒
0082 02E3 ldi R16,50
0084 10E0 ldi R17,0
0086 BCDF xcall _Delayus
0088 .dbline 71
0088 ; if(wrd&0x01) //此位数据是否为高
0088 DB98 cbi 0x1b,3
008A .dbline 73
008A ; {
008A ; PORTA|=BIT(DS18B20); //是高则将单总线拉高
008A 8FEF ldi R24,255
008C 88BB out 0x18,R24
008E .dbline 74
008E ; }
008E DC9A sbi 0x1b,4
0090 .dbline 75
0090 ; else
0090 02E3 ldi R16,50
0092 10E0 ldi R17,0
0094 B5DF xcall _Delayus
0096 .dbline 76
0096 ; {
0096 DC98 cbi 0x1b,4
0098 .dbline 78
0098 ; PORTA&=~BIT(DS18B20); //是低则将单总线拉低
0098 ; }
0098 8FEF ldi R24,255
009A 82BB out 0x12,R24
009C .dbline 79
009C ; Delayus(50); //等待50微秒
009C DF9A sbi 0x1b,7
009E .dbline 80
009E ; PORTA|=BIT(DS18B20); //释放总线
009E 02E3 ldi R16,50
00A0 10E0 ldi R17,0
00A2 AEDF xcall _Delayus
00A4 .dbline 81
00A4 ; wrd>>=1; //右移,为写入新的数据位做准备
00A4 DF98 cbi 0x1b,7
00A6 .dbline -2
00A6 .dbline 84
00A6 ; }
00A6 ; Delayus(50); //等待50微秒
00A6 ; }
00A6 L15:
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbend
.area code(ram, con, rel)
0000 .dbfile C:/icc/include/AVR_PQ1A.h
.area lit(rom, con, rel)
0000 _SEGMENT::
0000 3F00 .word 63
0002 0600 .word 6
0004 5B00 .word 91
0006 4F00 .word 79
0008 6600 .word 102
000A 6D00 .word 109
000C 7D00 .word 125
000E 0700 .word 7
0010 7F00 .word 127
0012 6F00 .word 111
0014 7700 .word 119
0016 7C00 .word 124
0018 3900 .word 57
001A 5E00 .word 94
001C 7900 .word 121
001E 7100 .word 113
0020 BF00 .word 191
0022 8600 .word 134
0024 DB00 .word 219
0026 CF00 .word 207
0028 E600 .word 230
002A ED00 .word 237
002C FD00 .word 253
002E 8700 .word 135
0030 FF00 .word 255
0032 EF00 .word 239
0034 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\11_DS18B20/SMG.C
0034 .dbsym e SEGMENT _SEGMENT A[52:26]I
.area text(rom, con, rel)
00A8 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\11_DS18B20/SMG.C
00A8 .dbfunc e One_smg_display _One_smg_display fV
00A8 ; number -> R20
00A8 ; data -> R22
.even
00A8 _One_smg_display::
00A8 0E940000 xcall push_gset2
00AC 422F mov R20,R18
00AE 602F mov R22,R16
00B0 .dbline -1
00B0 .dbline 27
00B0 .dbline 28
00B0 88B3 in R24,0x18
00B2 8F63 ori R24,63
00B4 88BB out 0x18,R24
00B6 .dbline 29
00B6 DC9A sbi 0x1b,4
00B8 .dbline 30
00B8 02E3 ldi R16,50
00BA 10E0 ldi R17,0
00BC A1DF xcall _Delayus
00BE .dbline 31
00BE DC98 cbi 0x1b,4
00C0 .dbline 33
00C0 82E0 ldi R24,2
00C2 869F mul R24,R22
00C4 F001 movw R30,R0
00C6 80E0 ldi R24,<_SEGMENT
00C8 90E0 ldi R25,>_SEGMENT
00CA E80F add R30,R24
00CC F91F adc R31,R25
00CE 0590 lpm R0,Z+
00D0 1490 lpm R1,Z
00D2 F001 movw R30,R0
00D4 E8BB out 0x18,R30
00D6 .dbline 34
00D6 DB9A sbi 0x1b,3
00D8 .dbline 35
00D8 02E3 ldi R16,50
00DA 10E0 ldi R17,0
00DC 91DF xcall _Delayus
00DE .dbline 36
00DE DB98 cbi 0x1b,3
00E0 .dbline 38
00E0 142F mov R17,R20
00E2 1150 subi R17,1
00E4 01E0 ldi R16,1
00E6 0E940000 xcall lsl8
00EA 402F mov R20,R16
00EC 4095 com R20
00EE .dbline 39
00EE 48BB out 0x18,R20
00F0 .dbline 40
00F0 DC9A sbi 0x1b,4
00F2 .dbline 41
00F2 02E3 ldi R16,50
00F4 10E0 ldi R17,0
00F6 84DF xcall _Delayus
00F8 .dbline 42
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -