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

📄 18b20.lis

📁 利用DS18b20温度采集芯片通过AVR单片机采集温度
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module _18b20.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\administrator\桌面\教程\18B20\18b20.c
 0000                   .dbfunc e init_1820 _init_1820 fV
                        .even
 0000           _init_1820::
 0000                   .dbline -1
 0000                   .dbline 12
 0000           ; /**************************************
 0000           ; ** Filename: 18b20.c
 0000           ; ** Describe: 18b20 温度传感器
 0000           ; ** Author : 古欣 www.avrvi.com
 0000           ; ** Time  :   2007-2-15
 0000           ; **************************************/
 0000           ; 
 0000           ; #include "config.h"
 0000           ; 
 0000           ; unsigned char wmh,wml,flag,count; //flag温度为负标志,count为实际温度
 0000           ; void init_1820(void)  
 0000           ; {  
 0000                   .dbline 13
 0000           ;     SET_DIR_1WIRE;      //设置PC2 为输出 
 0000 BC9A              sbi 0x17,4
 0002                   .dbline 14
 0002           ;     SET_OP_1WIRE;   
 0002 C49A              sbi 0x18,4
 0004                   .dbline 15
 0004           ;     CLR_OP_1WIRE;  
 0004 C498              cbi 0x18,4
 0006                   .dbline 16
 0006           ;     delay_us(480);    //480us以上  
 0006 00EE              ldi R16,480
 0008 11E0              ldi R17,1
 000A 0E940000          xcall _delay_us
 000E                   .dbline 17
 000E           ;     SET_OP_1WIRE;  
 000E C49A              sbi 0x18,4
 0010                   .dbline 18
 0010           ;     CLR_DIR_1WIRE;  
 0010 BC98              cbi 0x17,4
 0012                   .dbline 19
 0012           ;     delay_us(20);     //15~60us  
 0012 04E1              ldi R16,20
 0014 10E0              ldi R17,0
 0016 0E940000          xcall _delay_us
 001A           L2:
 001A                   .dbline 20
 001A           L3:
 001A                   .dbline 20
 001A           ;     while(CHECK_IP_1WIRE);  
 001A B499              sbic 0x16,4
 001C FECF              rjmp L2
 001E                   .dbline 21
 001E           ;     SET_DIR_1WIRE;  
 001E BC9A              sbi 0x17,4
 0020                   .dbline 22
 0020           ;     SET_OP_1WIRE;  
 0020 C49A              sbi 0x18,4
 0022                   .dbline 23
 0022           ;     delay_us(140);   //60~240us  
 0022 0CE8              ldi R16,140
 0024 10E0              ldi R17,0
 0026 0E940000          xcall _delay_us
 002A                   .dbline -2
 002A           L1:
 002A                   .dbline 0 ; func end
 002A 0895              ret
 002C                   .dbend
 002C                   .dbfunc e write_1820 _write_1820 fV
 002C           ;              m -> R20
 002C           ;              x -> R22
                        .even
 002C           _write_1820::
 002C 0E940000          xcall push_gset2
 0030 602F              mov R22,R16
 0032                   .dbline -1
 0032                   .dbline 26
 0032           ; }  
 0032           ; void write_1820(unsigned char x)  
 0032           ; {     
 0032                   .dbline 28
 0032           ;      unsigned char m;  
 0032           ;     for(m=0;m<8;m++)  
 0032 4427              clr R20
 0034 11C0              xjmp L9
 0036           L6:
 0036                   .dbline 29
 0036           ;     {  
 0036                   .dbline 30
 0036           ;        CLR_OP_1WIRE;  
 0036 C498              cbi 0x18,4
 0038                   .dbline 31
 0038           ;        if(x&(1<<m))    //写数据了,先写低位的! 
 0038 01E0              ldi R16,1
 003A 142F              mov R17,R20
 003C 0E940000          xcall lsl8
 0040 262E              mov R2,R22
 0042 2022              and R2,R16
 0044 11F0              breq L10
 0046                   .dbline 32
 0046           ;        SET_OP_1WIRE;  
 0046 C49A              sbi 0x18,4
 0048 01C0              xjmp L11
 004A           L10:
 004A                   .dbline 34
 004A           ;        else  
 004A           ;        {CLR_OP_1WIRE;}  
 004A                   .dbline 34
 004A C498              cbi 0x18,4
 004C                   .dbline 34
 004C           L11:
 004C                   .dbline 35
 004C 08E2              ldi R16,40
 004E 10E0              ldi R17,0
 0050 0E940000          xcall _delay_us
 0054                   .dbline 36
 0054 C49A              sbi 0x18,4
 0056                   .dbline 37
 0056           L7:
 0056                   .dbline 28
 0056 4395              inc R20
 0058           L9:
 0058                   .dbline 28
 0058 4830              cpi R20,8
 005A 68F3              brlo L6
 005C                   .dbline 38
 005C           ;        delay_us(40);   //15~60us  
 005C           ;        SET_OP_1WIRE;  
 005C           ;     }  
 005C           ;      SET_OP_1WIRE;  
 005C C49A              sbi 0x18,4
 005E                   .dbline -2
 005E           L5:
 005E 0E940000          xcall pop_gset2
 0062                   .dbline 0 ; func end
 0062 0895              ret
 0064                   .dbsym r m 20 c
 0064                   .dbsym r x 22 c
 0064                   .dbend
 0064                   .dbfunc e read_1820 _read_1820 fc
 0064           ;           temp -> R20
 0064           ;              k -> R22
 0064           ;              n -> R10
                        .even
 0064           _read_1820::
 0064 0E940000          xcall push_gset3
 0068                   .dbline -1
 0068                   .dbline 41
 0068           ; }  
 0068           ; unsigned char read_1820(void)  
 0068           ; {      
 0068                   .dbline 43
 0068           ;     unsigned char temp,k,n;  
 0068           ;     temp=0;  
 0068 4427              clr R20
 006A                   .dbline 44
 006A           ;     for(n=0;n<8;n++)  
 006A AA24              clr R10
 006C 19C0              xjmp L16
 006E           L13:
 006E                   .dbline 45
 006E           ;     {
 006E                   .dbline 46
 006E           ;       CLR_OP_1WIRE;  
 006E C498              cbi 0x18,4
 0070                   .dbline 47
 0070           ;       SET_OP_1WIRE;  
 0070 C49A              sbi 0x18,4
 0072                   .dbline 48
 0072           ;       CLR_DIR_1WIRE;  
 0072 BC98              cbi 0x17,4
 0074                   .dbline 49
 0074           ;       k=(CHECK_IP_1WIRE);    //读数据,从低位开始  
 0074 66B3              in R22,0x16
 0076 6071              andi R22,16
 0078                   .dbline 50
 0078           ;       if(k)  
 0078 31F0              breq L17
 007A                   .dbline 51
 007A           ;       temp|=(1<<n);  
 007A 01E0              ldi R16,1
 007C 1A2D              mov R17,R10
 007E 0E940000          xcall lsl8
 0082 402B              or R20,R16
 0084 07C0              xjmp L18
 0086           L17:
 0086                   .dbline 53
 0086           ;       else  
 0086           ;       temp&=~(1<<n);  
 0086 01E0              ldi R16,1
 0088 1A2D              mov R17,R10
 008A 0E940000          xcall lsl8
 008E 202E              mov R2,R16
 0090 2094              com R2
 0092 4221              and R20,R2
 0094           L18:
 0094                   .dbline 54
 0094 02E3              ldi R16,50
 0096 10E0              ldi R17,0
 0098 0E940000          xcall _delay_us
 009C                   .dbline 55
 009C BC9A              sbi 0x17,4
 009E                   .dbline 56
 009E           L14:
 009E                   .dbline 44
 009E A394              inc R10
 00A0           L16:
 00A0                   .dbline 44
 00A0 8A2D              mov R24,R10
 00A2 8830              cpi R24,8
 00A4 20F3              brlo L13
 00A6                   .dbline 57
 00A6           ;       delay_us(50); //60~120us      
 00A6           ;       SET_DIR_1WIRE;  
 00A6           ;     }  
 00A6           ;    return (temp);  
 00A6 042F              mov R16,R20
 00A8                   .dbline -2
 00A8           L12:
 00A8 0E940000          xcall pop_gset3
 00AC                   .dbline 0 ; func end
 00AC 0895              ret
 00AE                   .dbsym r temp 20 c
 00AE                   .dbsym r k 22 c
 00AE                   .dbsym r n 10 c
 00AE                   .dbend
 00AE                   .dbfunc e gettemp _gettemp fV
 00AE           ;            wm3 -> R22
 00AE           ;            wm1 -> R22
 00AE           ;            wm0 -> R20
 00AE           ;           teml -> R10
 00AE           ;            wm2 -> R20
 00AE           ;           temh -> R12
                        .even
 00AE           _gettemp::
 00AE 0E940000          xcall push_gset5
 00B2 2497              sbiw R28,4
 00B4                   .dbline -1
 00B4                   .dbline 61
 00B4           ; }   
 00B4           ; 
 00B4           ; void gettemp(void)         //读取温度值 
 00B4           ; {  
 00B4                   .dbline 63
 00B4           ;      unsigned char temh,teml,wm0,wm1,wm2,wm3;  
 00B4           ;      init_1820();        //复位18b20  
 00B4 A5DF              xcall _init_1820
 00B6                   .dbline 64
 00B6           ;      write_1820(0xcc);   // 发出转换命令  
 00B6 0CEC              ldi R16,204
 00B8 B9DF              xcall _write_1820
 00BA                   .dbline 65
 00BA           ;      write_1820(0x44); 
 00BA 04E4              ldi R16,68
 00BC B7DF              xcall _write_1820
 00BE                   .dbline 67
 00BE           ;  //  delay_nms(800);     //不延时也好使,不知道怎么回事! 
 00BE           ;      init_1820();  
 00BE A0DF              xcall _init_1820
 00C0                   .dbline 68
 00C0           ;      write_1820(0xcc);  //发出读命令  
 00C0 0CEC              ldi R16,204
 00C2 B4DF              xcall _write_1820
 00C4                   .dbline 69
 00C4           ;      write_1820(0xbe);  
 00C4 0EEB              ldi R16,190
 00C6 B2DF              xcall _write_1820
 00C8                   .dbline 70
 00C8           ;      teml=read_1820();  //读数据  
 00C8 CDDF              xcall _read_1820
 00CA A02E              mov R10,R16
 00CC                   .dbline 71
 00CC           ;      temh=read_1820();  
 00CC CBDF              xcall _read_1820
 00CE C02E              mov R12,R16

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -