📄 ds18b20.lis
字号:
.module DS18B20.C
.area text(rom, con, rel)
0000 .dbfile D:\MY_COMPUTER\d\avr16\atmegal16\DS18B20.C
0000 .dbfunc e crccheck _crccheck fc
0000 ; j -> R20
0000 ; r -> R14
0000 ; cbit -> y+0
0000 ; bit0 -> R8
0000 ; byte -> R10
0000 ; i -> R12
0000 ; temp -> R22
0000 ; len -> R6
0000 ; p -> R4,R5
.even
0000 _crccheck::
0000 0E940000 xcall push_gset5
0004 622E mov R6,R18
0006 2801 movw R4,R16
0008 2197 sbiw R28,1
000A .dbline -1
000A .dbline 24
000A ; /********************************************************************
000A ; ATmega16L开发板18B20测试程序
000A ; 晶振频率: 4MHz
000A ; 编译: ICCAVR 6.31
000A ; 编写: QINDAOTANG
000A ; ********************************************************************/
000A ;
000A ; #include <iom16v.h>
000A ; #include <macros.h>
000A ; #include "DS18B20.H"
000A ; //硬件连接与PD6
000A ; #define DQ 1<<6
000A ; #define true 0
000A ; #define false 1
000A ; float temperature;
000A ; /*===================================================================
000A ; // 函数功能: DS18B20数据校验函数
000A ; // 形参: void
000A ; // 返回: unsigned char 校验结果
000A ; // 编写: 2004/8/25
000A ; // 备注: CRC公式为:CRC = X^8 + X^5 + X^4 + 1
000A ; ===================================================================*/
000A ; unsigned char crccheck(unsigned char *p,unsigned char len)
000A ; {
000A .dbline 26
000A ; unsigned char bit0,cbit,r,temp,i,j,byte;
000A ; temp = 0;
000A 6627 clr R22
000C .dbline 27
000C ; for(j = 0; j < len; j++)
000C 4427 clr R20
000E 20C0 xjmp L5
0010 L2:
0010 .dbline 28
0010 ; {
0010 .dbline 29
0010 ; byte = p[j];
0010 E42F mov R30,R20
0012 FF27 clr R31
0014 E40D add R30,R4
0016 F51D adc R31,R5
0018 A080 ldd R10,z+0
001A .dbline 30
001A ; for(i = 0; i < 8; i++)
001A CC24 clr R12
001C 15C0 xjmp L9
001E L6:
001E .dbline 31
001E ; {
001E .dbline 32
001E ; cbit = temp & 0x01;
001E 862F mov R24,R22
0020 8170 andi R24,1
0022 8883 std y+0,R24
0024 .dbline 33
0024 ; bit0 = byte&0x01;
0024 8A2D mov R24,R10
0026 8170 andi R24,1
0028 882E mov R8,R24
002A .dbline 34
002A ; temp >>= 1;
002A 6695 lsr R22
002C .dbline 35
002C ; r = cbit ^ bit0;
002C E880 ldd R14,y+0
002E E826 eor R14,R24
0030 .dbline 36
0030 ; if(r == 1)
0030 8E2D mov R24,R14
0032 8130 cpi R24,1
0034 39F4 brne L10
0036 .dbline 37
0036 ; temp ^= 0x8c;
0036 8CE8 ldi R24,140
0038 90E0 ldi R25,0
003A 262E mov R2,R22
003C 3324 clr R3
003E 2826 eor R2,R24
0040 3926 eor R3,R25
0042 622D mov R22,R2
0044 L10:
0044 .dbline 38
0044 A694 lsr R10
0046 .dbline 39
0046 L7:
0046 .dbline 30
0046 C394 inc R12
0048 L9:
0048 .dbline 30
0048 8C2D mov R24,R12
004A 8830 cpi R24,8
004C 40F3 brlo L6
004E .dbline 40
004E L3:
004E .dbline 27
004E 4395 inc R20
0050 L5:
0050 .dbline 27
0050 4615 cp R20,R6
0052 F0F2 brlo L2
0054 .dbline 41
0054 ; byte >>= 1;
0054 ; }
0054 ; }
0054 ; return temp;
0054 062F mov R16,R22
0056 .dbline -2
0056 L1:
0056 2196 adiw R28,1
0058 0E940000 xcall pop_gset5
005C .dbline 0 ; func end
005C 0895 ret
005E .dbsym r j 20 c
005E .dbsym r r 14 c
005E .dbsym l cbit 0 c
005E .dbsym r bit0 8 c
005E .dbsym r byte 10 c
005E .dbsym r i 12 c
005E .dbsym r temp 22 c
005E .dbsym r len 6 c
005E .dbsym r p 4 pc
005E .dbend
005E .dbfunc e delay_us _delay_us fV
005E ; time -> R16,R17
.even
005E _delay_us::
005E .dbline -1
005E .dbline 50
005E ; }
005E ; /*===================================================================
005E ; // 函数功能: us延时函数
005E ; // 形参: void
005E ; // 返回: void
005E ; // 编写: 2004/8/25
005E ; ===================================================================*/
005E ; void delay_us(unsigned int time)
005E ; {
005E L13:
005E .dbline 52
005E ; do
005E ; {
005E .dbline 53
005E ; time--;
005E 0150 subi R16,1
0060 1040 sbci R17,0
0062 .dbline 54
0062 ; }
0062 L14:
0062 .dbline 55
0062 ; while (time>1);
0062 81E0 ldi R24,1
0064 90E0 ldi R25,0
0066 8017 cp R24,R16
0068 9107 cpc R25,R17
006A C8F3 brlo L13
006C .dbline -2
006C .dbline 56
006C ; }
006C L12:
006C .dbline 0 ; func end
006C 0895 ret
006E .dbsym r time 16 i
006E .dbend
006E .dbfunc e ds1820_ack _ds1820_ack fc
006E ; ack -> R20
.even
006E _ds1820_ack::
006E 0E940000 xcall push_gset1
0072 .dbline -1
0072 .dbline 65
0072 ;
0072 ; /*===================================================================
0072 ; // 函数功能: 判断总线应答
0072 ; // 形参: void
0072 ; // 返回: unsigned char true为应答
0072 ; // 编写: 2004/8/25
0072 ; ===================================================================*/
0072 ; unsigned char ds1820_ack(void)
0072 ; {
0072 .dbline 67
0072 ; unsigned char ack;
0072 ; DDRD |= DQ;
0072 8E9A sbi 0x11,6
0074 .dbline 68
0074 ; PORTD &= ~DQ;
0074 82B3 in R24,0x12
0076 8078 andi R24,128
0078 82BB out 0x12,R24
007A .dbline 69
007A ; delay_us(300); //480US以上 // reset
007A 0CE2 ldi R16,300
007C 11E0 ldi R17,1
007E EFDF xcall _delay_us
0080 .dbline 70
0080 ; PORTD |= DQ;
0080 969A sbi 0x12,6
0082 .dbline 71
0082 ; DDRD &= ~DQ;
0082 81B3 in R24,0x11
0084 8078 andi R24,128
0086 81BB out 0x11,R24
0088 .dbline 72
0088 ; delay_us(25);
0088 09E1 ldi R16,25
008A 10E0 ldi R17,0
008C E8DF xcall _delay_us
008E .dbline 73
008E ; ack = DQ & PIND;
008E 40B3 in R20,0x10
0090 4074 andi R20,64
0092 .dbline 74
0092 ; delay_us(300); // host receive
0092 0CE2 ldi R16,300
0094 11E0 ldi R17,1
0096 E3DF xcall _delay_us
0098 .dbline 75
0098 ; if(ack)
0098 4423 tst R20
009A 11F0 breq L17
009C .dbline 76
009C ; return false;
009C 01E0 ldi R16,1
009E 01C0 xjmp L16
00A0 L17:
00A0 .dbline 78
00A0 ; else
00A0 ; return true;
00A0 0027 clr R16
00A2 .dbline -2
00A2 L16:
00A2 0E940000 xcall pop_gset1
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbsym r ack 20 c
00A8 .dbend
00A8 .dbfunc e read_byte _read_byte fc
00A8 ; value -> R20
00A8 ; i -> R22
.even
00A8 _read_byte::
00A8 0E940000 xcall push_gset2
00AC .dbline -1
00AC .dbline 88
00AC ; }
00AC ;
00AC ; /*===================================================================
00AC ; // 函数功能: 从 1-wire 总线上读取一个字节
00AC ; // 形参: void
00AC ; // 返回: unsigned char 读到的值
00AC ; // 编写: 2004/8/25
00AC ; ===================================================================*/
00AC ; unsigned char read_byte(void)
00AC ; {
00AC .dbline 90
00AC ; unsigned char i;
00AC ; unsigned char value = 0;
00AC 4427 clr R20
00AE .dbline 91
00AE ; for(i = 8; i > 0; i--)
00AE 68E0 ldi R22,8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -