⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.lis

📁 AVR16单片机DS18B20程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -