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

📄 ds1820.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module DS1820.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\DS1820.C
 0000                   .dbfunc e delay_10us _delay_10us fV
 0000           ;              i -> R16
                        .even
 0000           _delay_10us::
 0000                   .dbline -1
 0000                   .dbline 33
 0000           ; /*
 0000           ; DS18B20操作模块
 0000           ; 
 0000           ;       1、DS18B20的电源脚接到VCC及GND上面,数据线接到PA7口。
 0000           ;       2、晶振频率为内部1MHz。
 0000           ;       3、DS18B20由PA7口实现单总线访问,实现读取温度。
 0000           ;       4、函数中有对中断的保护处理,更具有实用价值。
 0000           ;       5、此文件可以直接嵌入到项目中使用。
 0000           ;       
 0000           ;       AVR  mega16学习板
 0000           ;       AVR_AFA
 0000           ;       www.iccavr.com
 0000           ;       11:48 2007-6-30
 0000           ; */
 0000           ; 
 0000           ; #include <iom128v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #define DQ_IN DDRF &= ~(1 << PF2)             /*设置输入*/
 0000           ; #define DQ_OUT        DDRF |= (1 << PF2)              /*设置输出*/
 0000           ; #define DQ_CLR        PORTF &= ~(1 << PF2)    /*置低电平*/
 0000           ; #define DQ_SET        PORTF |= (1 << PF2)             /*置高电平*/
 0000           ; #define DQ_R  PINF & (1 << PF2)               /*读了电平*/
 0000           ; 
 0000           ; unsigned char flag;                                           /*中断标志缓存*/
 0000           ; 
 0000           ; /*
 0000           ; 延时函数
 0000           ; 
 0000           ; 延时时间:i X 10 + 16uS。
 0000           ; CPU频率为:1MHz。
 0000           ; */
 0000           ; void delay_10us(unsigned char i) {
 0000                   .dbline 35
 0000           ; 
 0000           ;       if (i == 0) {
 0000 0023              tst R16
 0002 29F4              brne L5
 0004                   .dbline 35
 0004                   .dbline 36
 0004           ;               return ;
 0004 09C0              xjmp L1
 0006           L4:
 0006                   .dbline 38
 0006                   .dbline 39
 0006 0000              nop
 0008                   .dbline 40
 0008 0000              nop
 000A                   .dbline 41
 000A 0000              nop
 000C                   .dbline 42
 000C 0000              nop
 000E                   .dbline 43
 000E           L5:
 000E                   .dbline 38
 000E           ;               }
 000E           ;       while (i--) {
 000E 202E              mov R2,R16
 0010 3324              clr R3
 0012 0150              subi R16,1
 0014 2220              tst R2
 0016 B9F7              brne L4
 0018                   .dbline -2
 0018           L1:
 0018                   .dbline 0 ; func end
 0018 0895              ret
 001A                   .dbsym r i 16 c
 001A                   .dbend
 001A                   .dbfunc e ds1820_reset _ds1820_reset fc
 001A           ;              i -> R20
                        .even
 001A           _ds1820_reset::
 001A 0E940000          xcall push_gset1
 001E                   .dbline -1
 001E                   .dbline 47
 001E           ;               NOP();
 001E           ;               NOP();
 001E           ;               NOP();
 001E           ;               NOP();
 001E           ;               }
 001E           ; }
 001E           ; 
 001E           ; /*DS18B20复位函数*/
 001E           ; unsigned char ds1820_reset(void) {
 001E                   .dbline 50
 001E           ; 
 001E           ;       unsigned char i;
 001E           ;       flag = SREG;                            /*中断保护*/
 001E 2FB6              in R2,0x3f
 0020 20920000          sts _flag,R2
 0024                   .dbline 51
 0024           ;       CLI();                                          /*关中断*/
 0024 F894              cli
 0026                   .dbline 52
 0026           ;       DQ_OUT;
 0026 80916100          lds R24,97
 002A 8460              ori R24,4
 002C 80936100          sts 97,R24
 0030                   .dbline 53
 0030           ;       DQ_CLR;
 0030 80916200          lds R24,98
 0034 8B7F              andi R24,251
 0036 80936200          sts 98,R24
 003A                   .dbline 54
 003A           ;       delay_10us(49);                         /*延时500uS(480-960)*/
 003A 01E3              ldi R16,49
 003C E1DF              xcall _delay_10us
 003E                   .dbline 55
 003E           ;       DQ_SET;
 003E 80916200          lds R24,98
 0042 8460              ori R24,4
 0044 80936200          sts 98,R24
 0048                   .dbline 56
 0048           ;       DQ_IN;
 0048 80916100          lds R24,97
 004C 8B7F              andi R24,251
 004E 80936100          sts 97,R24
 0052                   .dbline 57
 0052           ;       delay_10us(7);                          /*延时80uS*/
 0052 07E0              ldi R16,7
 0054 D5DF              xcall _delay_10us
 0056                   .dbline 58
 0056           ;       i = DQ_R;
 0056 40B1              in R20,0x0
 0058 4470              andi R20,4
 005A                   .dbline 59
 005A           ;       delay_10us(49);                         /*延时500uS(保持>480uS)*/
 005A 01E3              ldi R16,49
 005C D1DF              xcall _delay_10us
 005E                   .dbline 60
 005E           ;       if (flag & 0x80) {                      /*恢复中断状态*/
 005E 20900000          lds R2,_flag
 0062 27FE              sbrs R2,7
 0064 01C0              rjmp L8
 0066                   .dbline 60
 0066                   .dbline 61
 0066           ;               SEI();
 0066 7894              sei
 0068                   .dbline 62
 0068           ;               }
 0068           L8:
 0068                   .dbline 63
 0068           ;       if (i) {
 0068 4423              tst R20
 006A 11F0              breq L10
 006C                   .dbline 63
 006C                   .dbline 64
 006C           ;               return 0x00;
 006C 0027              clr R16
 006E 01C0              xjmp L7
 0070           L10:
 0070                   .dbline 66
 0070           ;               }
 0070           ;       else {
 0070                   .dbline 67
 0070           ;               return 0x01;
 0070 01E0              ldi R16,1
 0072                   .dbline -2
 0072           L7:
 0072 0E940000          xcall pop_gset1
 0076                   .dbline 0 ; func end
 0076 0895              ret
 0078                   .dbsym r i 20 c
 0078                   .dbend
 0078                   .dbfunc e ds1820_read_byte _ds1820_read_byte fc
 0078           ;          value -> R20
 0078           ;              i -> R22
                        .even
 0078           _ds1820_read_byte::
 0078 0E940000          xcall push_gset2
 007C                   .dbline -1
 007C                   .dbline 72
 007C           ;               }
 007C           ; }
 007C           ; 
 007C           ; /*DS18B20字节读取函数*/
 007C           ; unsigned char ds1820_read_byte(void) {
 007C                   .dbline 75
 007C           ; 
 007C           ;       unsigned char i;
 007C           ;       unsigned char value = 0;
 007C 4427              clr R20
 007E                   .dbline 76
 007E           ;       flag = SREG;                            /*中断保护*/
 007E 2FB6              in R2,0x3f
 0080 20920000          sts _flag,R2
 0084                   .dbline 77
 0084           ;       CLI();                                          /*关中断*/
 0084 F894              cli
 0086                   .dbline 78
 0086 68E0              ldi R22,8
 0088 29C0              xjmp L16
 008A           L13:
 008A                   .dbline 78
 008A           ;       for (i = 8; i != 0; i--) {
 008A                   .dbline 79
 008A           ;               value >>= 1;
 008A 4695              lsr R20
 008C                   .dbline 80
 008C           ;               DQ_OUT;
 008C 80916100          lds R24,97
 0090 8460              ori R24,4
 0092 80936100          sts 97,R24
 0096                   .dbline 81
 0096           ;               DQ_CLR;
 0096 80916200          lds R24,98
 009A 8B7F              andi R24,251
 009C 80936200          sts 98,R24
 00A0                   .dbline 82
 00A0           ;               NOP();                                  /*延时4uS*/
 00A0 0000              nop
 00A2                   .dbline 83
 00A2           ;               NOP();
 00A2 0000              nop
 00A4                   .dbline 84
 00A4           ;               NOP();
 00A4 0000              nop
 00A6                   .dbline 85
 00A6           ;               NOP();
 00A6 0000              nop
 00A8                   .dbline 86
 00A8           ;               DQ_SET;
 00A8 80916200          lds R24,98
 00AC 8460              ori R24,4
 00AE 80936200          sts 98,R24
 00B2                   .dbline 87
 00B2           ;               DQ_IN;
 00B2 80916100          lds R24,97
 00B6 8B7F              andi R24,251
 00B8 80936100          sts 97,R24
 00BC                   .dbline 88
 00BC           ;               NOP();                                  /*延时10uS*/
 00BC 0000              nop
 00BE                   .dbline 89
 00BE           ;               NOP();
 00BE 0000              nop
 00C0                   .dbline 90
 00C0           ;               NOP();
 00C0 0000              nop
 00C2                   .dbline 91
 00C2           ;               NOP();
 00C2 0000              nop
 00C4                   .dbline 92
 00C4           ;               NOP();
 00C4 0000              nop
 00C6                   .dbline 93
 00C6           ;               NOP();
 00C6 0000              nop
 00C8                   .dbline 94
 00C8           ;               NOP();
 00C8 0000              nop
 00CA                   .dbline 95
 00CA           ;               NOP();
 00CA 0000              nop
 00CC                   .dbline 96
 00CC           ;               NOP();
 00CC 0000              nop
 00CE                   .dbline 97

⌨️ 快捷键说明

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