?? ds1820.s
字號:
.module DS1820.C
.area text(rom, con, rel)
.dbfile D:\+++資料+++\學習\avr\程序\18b20new\DS1820.C
.dbfunc e delay_10us _delay_10us fV
; i -> R16
.even
_delay_10us::
.dbline -1
.dbline 39
; /*
; DS18B20操作模塊
;
; 1、DS18B20的電源腳接到VCC及GND上面,數據線接到PA7口。
; 2、晶振頻率為內部1MHz。
; 3、DS18B20由PA7口實現單總線訪問,實現讀取溫度。
; 4、函數中有對中斷的保護處理,更具有實用價值。
; 5、此文件可以直接嵌入到項目中使用。
;
; AVR mega16學習板
; AVR_AFA
; www.iccavr.com
; 11:48 2007-6-30
; */
;
; #include <iom16v.h>
; #include <macros.h>
;
; #define DQ_IN DDRA &= ~(1 << PA3) /*設置輸入*/
; #define DQ_OUT DDRA |= (1 << PA3) /*設置輸出*/
; #define DQ_CLR PORTA &= ~(1 << PA3) /*置低電平*/
; #define DQ_SET PORTA |= (1 << PA3) /*置高電平*/
; #define DQ_R PINA & (1 << PA3) /*讀了電平*/
; #define delay4us {NOP();NOP();NOP();NOP();}
; #define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
; //--------函數聲明----------------------
; void ds1820_start(void);
; unsigned char ds1820_reset(void);
; unsigned int ds1820_read_temp(void);
; //--------------------------------------
; unsigned char flag; /*中斷標志緩存*/
;
; /*
; 延時函數
;
; 延時時間:i X 10 + 16uS。
; CPU頻率為:1MHz。
; */
; void delay_10us(unsigned char i) {
.dbline 41
;
; if (i == 0) {
tst R16
brne L5
.dbline 41
.dbline 42
; return ;
xjmp L1
L4:
.dbline 44
.dbline 45
.dbline 45
nop
.dbline 45
nop
.dbline 45
nop
.dbline 45
nop
.dbline 45
.dbline 45
.dbline 46
L5:
.dbline 44
; }
; while (i--) {
mov R2,R16
clr R3
subi R16,1
tst R2
brne L4
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e ds1820_reset _ds1820_reset fc
; i -> R20
.even
_ds1820_reset::
xcall push_gset1
.dbline -1
.dbline 50
; delay4us;
; }
; }
;
; /*DS18B20復位函數*/
; unsigned char ds1820_reset(void) {
.dbline 53
;
; unsigned char i;
; flag = SREG; /*中斷保護*/
in R2,0x3f
sts _flag,R2
.dbline 54
; CLI(); /*關中斷*/
cli
.dbline 55
; DQ_OUT;
sbi 0x1a,3
.dbline 56
; DQ_CLR;
cbi 0x1b,3
.dbline 57
; delay_10us(49); /*延時500uS(480-960)*/
ldi R16,49
xcall _delay_10us
.dbline 58
; DQ_SET;
sbi 0x1b,3
.dbline 59
; DQ_IN;
cbi 0x1a,3
.dbline 60
; delay_10us(7); /*延時80uS*/
ldi R16,7
xcall _delay_10us
.dbline 61
; i = DQ_R;
in R20,0x19
andi R20,8
.dbline 62
; delay_10us(49); /*延時500uS(保持>480uS)*/
ldi R16,49
xcall _delay_10us
.dbline 63
; if (flag & 0x80) { /*恢復中斷狀態*/
lds R2,_flag
sbrs R2,7
rjmp L8
.dbline 63
.dbline 64
; SEI();
sei
.dbline 65
; }
L8:
.dbline 66
; if (i) {
tst R20
breq L10
.dbline 66
.dbline 67
; return 0x00;
clr R16
xjmp L7
L10:
.dbline 69
; }
; else {
.dbline 70
; return 0x01;
ldi R16,1
.dbline -2
L7:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e ds1820_read_byte _ds1820_read_byte fc
; value -> R20
; i -> R22
.even
_ds1820_read_byte::
xcall push_gset2
.dbline -1
.dbline 75
; }
; }
;
; /*DS18B20字節讀取函數*/
; unsigned char ds1820_read_byte(void) {
.dbline 78
;
; unsigned char i;
; unsigned char value = 0;
clr R20
.dbline 79
; flag = SREG; /*中斷保護*/
in R2,0x3f
sts _flag,R2
.dbline 80
; CLI(); /*關中斷*/
cli
.dbline 81
ldi R22,8
xjmp L16
L13:
.dbline 81
; for (i = 8; i != 0; i--) {
.dbline 82
; value >>= 1;
lsr R20
.dbline 83
; DQ_OUT;
sbi 0x1a,3
.dbline 84
; DQ_CLR;
cbi 0x1b,3
.dbline 85
; delay4us; /*延時4uS*/
.dbline 85
nop
.dbline 85
nop
.dbline 85
nop
.dbline 85
nop
.dbline 85
.dbline 85
.dbline 86
; DQ_SET;
sbi 0x1b,3
.dbline 87
; DQ_IN;
cbi 0x1a,3
.dbline 88
; delay10us; /*延時10uS*/
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
nop
.dbline 88
.dbline 88
.dbline 89
; if (DQ_R) {
sbis 0x19,3
rjmp L17
.dbline 89
.dbline 90
; value|=0x80;
ori R20,128
.dbline 91
; }
L17:
.dbline 92
ldi R16,5
xcall _delay_10us
.dbline 93
L14:
.dbline 81
dec R22
L16:
.dbline 81
tst R22
brne L13
.dbline 94
; delay_10us(5); /*延時60uS*/
; }
; if (flag & 0x80) { /*恢復中斷狀態*/
lds R2,_flag
sbrs R2,7
rjmp L19
.dbline 94
.dbline 95
; SEI();
sei
.dbline 96
; }
L19:
.dbline 97
; return(value);
mov R16,R20
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r value 20 c
.dbsym r i 22 c
.dbend
.dbfunc e ds1820_write_byte _ds1820_write_byte fV
; i -> R20
; value -> R22
.even
_ds1820_write_byte::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 101
; }
;
; /*DS18B20字節寫入函數*/
; void ds1820_write_byte(unsigned char value) {
.dbline 104
;
; unsigned char i;
; flag = SREG; /*中斷保護*/
in R2,0x3f
sts _flag,R2
.dbline 105
; CLI(); /*關中斷*/
cli
.dbline 106
ldi R20,8
xjmp L25
L22:
.dbline 106
; for (i = 8; i != 0; i--) {
.dbline 107
; DQ_OUT;
sbi 0x1a,3
.dbline 108
; DQ_CLR;
cbi 0x1b,3
.dbline 109
; delay4us; /*延時4uS*/
.dbline 109
nop
.dbline 109
nop
.dbline 109
nop
.dbline 109
nop
.dbline 109
.dbline 109
.dbline 110
; if (value & 0x01) {DQ_SET;}
sbrc R22,0
.dbline 110
.dbline 110
sbi 0x1b,3
.dbline 110
L26:
.dbline 112
ldi R16,7
xcall _delay_10us
.dbline 113
sbi 0x1b,3
.dbline 114
lsr R22
.dbline 115
L23:
.dbline 106
dec R20
L25:
.dbline 106
tst R20
brne L22
.dbline 116
lds R2,_flag
sbrs R2,7
rjmp L28
.dbline 116
.dbline 117
sei
.dbline 118
L28:
.dbline -2
L21:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r value 22 c
.dbend
.dbfunc e ds1820_start _ds1820_start fV
.even
_ds1820_start::
.dbline -1
.dbline 122
; //每次都只寫最低位,如果最低位是1的話輸出高電平作為寫1信號,否則無動作即為0
; delay_10us(7); /*延時80uS*/
; DQ_SET; /*位結束*/
; value >>= 1;
; }
; if (flag & 0x80) { /*恢復中斷狀態*/
; SEI();
; }
; }
;
; /*啟動ds1820轉換*/
; void ds1820_start(void) {
.dbline 124
;
; ds1820_reset();
xcall _ds1820_reset
.dbline 125
; ds1820_write_byte(0xCC); /*勿略地址*/
ldi R16,204
xcall _ds1820_write_byte
.dbline 126
; ds1820_write_byte(0x44); /*啟動轉換*/
ldi R16,68
xcall _ds1820_write_byte
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ds1820_read_temp _ds1820_read_temp fi
; buf -> y+0
; i -> R20,R21
.even
_ds1820_read_temp::
xcall push_gset1
sbiw R28,9
.dbline -1
.dbline 130
; }
;
; /*DS8B20讀取溫度信息*/
; unsigned int ds1820_read_temp(void) {
.dbline 135
;
; unsigned int i;
; unsigned char buf[9];
;
; ds1820_reset();
xcall _ds1820_reset
.dbline 136
; ds1820_write_byte(0xCC); /*勿略地址*/
ldi R16,204
xcall _ds1820_write_byte
.dbline 137
; ds1820_write_byte(0xBE); /*讀取溫度*/
ldi R16,190
xcall _ds1820_write_byte
.dbline 138
; for (i = 0; i < 9; i++)
clr R20
clr R21
xjmp L35
L32:
.dbline 139
.dbline 140
xcall _ds1820_read_byte
movw R24,R28
movw R30,R20
add R30,R24
adc R31,R25
std z+0,R16
.dbline 141
L33:
.dbline 138
subi R20,255 ; offset = 1
sbci R21,255
L35:
.dbline 138
cpi R20,9
ldi R30,0
cpc R21,R30
brlo L32
.dbline 142
; {
; buf[i] = ds1820_read_byte();
; }
; i = buf[1];
ldd R20,y+1
clr R21
.dbline 143
; i <<= 8;
mov R21,R20
clr R20
.dbline 144
; i |= buf[0];
ldd R2,y+0
clr R3
or R20,R2
or R21,R3
.dbline 146
;
; return i;
movw R16,R20
.dbline -2
L31:
adiw R28,9
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l buf 0 A[9:9]c
.dbsym r i 20 i
.dbend
.area bss(ram, con, rel)
.dbfile D:\+++資料+++\學習\avr\程序\18b20new\DS1820.C
_flag::
.blkb 1
.dbsym e flag _flag c
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -