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

📄 dsi8b20.s

📁 AVR ds18b20 源代码 对学习温度控制的人很有帮助
💻 S
字号:
	.module dsi8b20.c
	.area text(rom, con, rel)
	.dbfile D:\开发板\source\ds18b20\dsi8b20.c
	.dbfunc e reset_ov _reset_ov fc
;              c -> R20
	.even
_reset_ov::
	rcall push_gset1
	.dbline -1
	.dbline 24
; /******************************************/
; /*             北京MCU学习之家            */
; /*             ADC通信演示程序            */
; /*             作者:白如冰                */
; /*             2005年10月1日              */
; /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
; /******************************************/
; //  1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
; //  2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
; #include <iom8v.h>
; #include <macros.h>
; extern void delay_us(unsigned int n);
; extern void delay_ms(unsigned int n);
; extern void uart_init(void);
; extern void putchar(unsigned char c);
; extern void puts(char *s);
; extern void puts_hh(char *s);
; 
; #define ds1820_data_s PORTD|=BIT(PORTD6)
; #define ds1820_data_c PORTD&=~BIT(PORTD6)
;  							
; 
; unsigned char reset_ov(void)      //18b20 复位函数
; { 
	.dbline 25
;  char c=0; 
	clr R20
	.dbline 26
;  ds1820_data_s;
	sbi 0x12,6
	.dbline 27
;  delay_us(1);//6
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 28
;  ds1820_data_c;
	cbi 0x12,6
	.dbline 29
;  delay_us(660);//500
	ldi R16,660
	ldi R17,2
	rcall _delay_us
	.dbline 30
;  ds1820_data_s;
	sbi 0x12,6
	.dbline 31
;  delay_us(73);//60us
	ldi R16,73
	ldi R17,0
	rcall _delay_us
	.dbline 32
;  c=(PIND&=0x40);//dq_in;
	in R24,0x10
	andi R24,64
	out 0x10,R24
	mov R20,R24
	.dbline 33
;  if(c==0x40)
	cpi R24,64
	brne L2
	.dbline 34
;  return (0);
	clr R16
	rjmp L1
L2:
	.dbline 36
;  else 
;  {
	.dbline 37
;  delay_us(326);//250
	ldi R16,326
	ldi R17,1
	rcall _delay_us
	.dbline 38
;   return (1);
	ldi R16,1
	.dbline -2
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r c 20 c
	.dbend
	.dbfunc e write_data _write_data fV
;           temp -> R20
;              i -> R22
;           data -> R10
	.even
_write_data::
	rcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 43
;  }  
; }  
; 
; void write_data(unsigned char data)    //DS18B20写函数
; {
	.dbline 45
;     unsigned char i,temp;
;     temp=data;
	mov R20,R10
	.dbline 47
;    
;     for (i=0; i<8; i++) 
	clr R22
	rjmp L8
L5:
	.dbline 48
;     {
	.dbline 49
;       if((temp&0x01)&&0x01)
	sbrs R20,0
	rjmp L9
	.dbline 50
;       {
	.dbline 51
; 	  ds1820_data_c;
	cbi 0x12,6
	.dbline 52
;       delay_us(6);//10
	ldi R16,6
	ldi R17,0
	rcall _delay_us
	.dbline 53
;       ds1820_data_s;
	sbi 0x12,6
	.dbline 54
;       delay_us(73);//60
	ldi R16,73
	ldi R17,0
	rcall _delay_us
	.dbline 55
;       }
	rjmp L10
L9:
	.dbline 57
;       else
;       {
	.dbline 58
; 	   ds1820_data_c;
	cbi 0x12,6
	.dbline 59
;        delay_us(80);//70
	ldi R16,80
	ldi R17,0
	rcall _delay_us
	.dbline 60
;        ds1820_data_s;
	sbi 0x12,6
	.dbline 61
;        delay_us(1);//6
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 62
;       }
L10:
	.dbline 63
	lsr R10
	.dbline 64
	mov R20,R10
	.dbline 65
L6:
	.dbline 47
	inc R22
L8:
	.dbline 47
	cpi R22,8
	brlo L5
	.dbline -2
L4:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r i 22 c
	.dbsym r data 10 c
	.dbend
	.dbfunc e read_data _read_data fc
;          value -> R20
;              i -> R22
	.even
_read_data::
	rcall push_gset2
	.dbline -1
	.dbline 70
;       data>>=1;   
;       temp=data;
;     }
;       
; }
; 
; unsigned char read_data(void)   //DS18B20	读函数
; {
	.dbline 73
; unsigned char i;
; 
; char value = 0;
	clr R20
	.dbline 74
; for (i=0;i<8;i++)
	clr R22
	rjmp L15
L12:
	.dbline 75
; {
	.dbline 76
; value>>=1;
	lsr R20
	.dbline 77
; ds1820_data_c;
	cbi 0x12,6
	.dbline 78
; delay_us(1);//6
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 79
; ds1820_data_s;
	sbi 0x12,6
	.dbline 80
; delay_us(1); //6
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 83
; 
; 
; if((PIND&=0x40)==0x40)
	in R24,0x10
	andi R24,64
	out 0x10,R24
	cpi R24,64
	brne L16
	.dbline 84
; value|=0x80;
	ori R20,128
L16:
	.dbline 85
	ldi R16,73
	ldi R17,0
	rcall _delay_us
	.dbline 86
L13:
	.dbline 74
	inc R22
L15:
	.dbline 74
	cpi R22,8
	brlo L12
	.dbline 89
; delay_us(73);//60 
; }
; 
; 
; return(value);
	mov R16,R20
	.dbline -2
L11:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r value 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e init_ds1820 _init_ds1820 fV
;              i -> R20
	.even
_init_ds1820::
	rcall push_gset1
	.dbline -1
	.dbline 93
; }
; 
; void init_ds1820(void)
; {
	.dbline 95
;    unsigned char i;
;    for(i=0;i<40;i++)
	clr R20
	rjmp L22
L19:
	.dbline 96
;    {if(reset_ov())
	.dbline 96
	rcall _reset_ov
	tst R16
	breq L23
	.dbline 97
;     break;
	rjmp L21
L23:
	.dbline 98
L20:
	.dbline 95
	inc R20
L22:
	.dbline 95
	cpi R20,40
	brlo L19
L21:
	.dbline 100
;    }
;   
;   write_data(0xcc);  //跳过ROM
	ldi R16,204
	rcall _write_data
	.dbline 101
;   write_data(0x4e);  //写配置寄存器指令
	ldi R16,78
	rcall _write_data
	.dbline 102
;   write_data(0x00);
	clr R16
	rcall _write_data
	.dbline 103
;   write_data(0x00);
	clr R16
	rcall _write_data
	.dbline 104
;   write_data(0x7f);  //配置转换位数为12位,转换时间为750ms
	ldi R16,127
	rcall _write_data
	.dbline 105
;    for(i=0;i<40;i++)
	clr R20
	rjmp L28
L25:
	.dbline 106
;    {if(reset_ov())
	.dbline 106
	rcall _reset_ov
	tst R16
	breq L29
	.dbline 107
;     break;
	rjmp L27
L29:
	.dbline 108
L26:
	.dbline 105
	inc R20
L28:
	.dbline 105
	cpi R20,40
	brlo L25
L27:
	.dbline 109
;    }
;    write_data(0xcc);
	ldi R16,204
	rcall _write_data
	.dbline 110
;    write_data(0x44); //转换命令   开始第一次转换
	ldi R16,68
	rcall _write_data
	.dbline -2
L18:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e read_temper _read_temper fi
;          temph -> R20
;          templ -> R22
;              x -> R20,R21
;              i -> R10
	.even
_read_temper::
	rcall push_gset3
	.dbline -1
	.dbline 115
;  }
;  
;  //读温度值
; unsigned int read_temper(void)
; {  
	.dbline 118
;    unsigned int x;
;    unsigned char templ,temph,i;
;    for(i=0;i<40;i++)
	clr R10
	rjmp L35
L32:
	.dbline 119
;    {if(reset_ov())
	.dbline 119
	rcall _reset_ov
	tst R16
	breq L36
	.dbline 120
;     break;
	rjmp L34
L36:
	.dbline 121
L33:
	.dbline 118
	inc R10
L35:
	.dbline 118
	mov R24,R10
	cpi R24,40
	brlo L32
L34:
	.dbline 124
;    }
;   
;   
;   write_data(0xcc);  //跳过ROM
	ldi R16,204
	rcall _write_data
	.dbline 125
;   write_data(0xbe); //读温度命令
	ldi R16,190
	rcall _write_data
	.dbline 126
;   templ=read_data();
	rcall _read_data
	mov R22,R16
	.dbline 127
;   temph=read_data();
	rcall _read_data
	mov R20,R16
	.dbline 128
;   for(i=0;i<40;i++)
	clr R10
	rjmp L41
L38:
	.dbline 129
;    {if(reset_ov())
	.dbline 129
	rcall _reset_ov
	tst R16
	breq L42
	.dbline 130
;     break;
	rjmp L40
L42:
	.dbline 131
L39:
	.dbline 128
	inc R10
L41:
	.dbline 128
	mov R24,R10
	cpi R24,40
	brlo L38
L40:
	.dbline 132
;    }
;    write_data(0xcc);
	ldi R16,204
	rcall _write_data
	.dbline 133
;    write_data(0x44); //转换命令
	ldi R16,68
	rcall _write_data
	.dbline 134
;    x=temph;
	clr R21
	.dbline 135
;    x<<=8;
	mov R21,R20
	clr R20
	.dbline 136
;    x+=templ;
	mov R2,R22
	clr R3
	add R20,R2
	adc R21,R3
	.dbline 137
;    return x;
	movw R16,R20
	.dbline -2
L31:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temph 20 c
	.dbsym r templ 22 c
	.dbsym r x 20 i
	.dbsym r i 10 c
	.dbend
	.dbfunc e main _main fV
;    temper_data -> R20,R21
;           temp -> y+0
	.even
_main::
	sbiw R28,9
	.dbline -1
	.dbline 140
;  }  
;  void main(void)
;  {
	.dbline 143
;   unsigned char temp[5];
;   unsigned int temper_data;
;   DDRD=0XFF;
	ldi R24,255
	out 0x11,R24
	.dbline 144
;   PORTD=0Xff;
	out 0x12,R24
	.dbline 145
;   uart_init();
	rcall _uart_init
	.dbline 146
;   init_ds1820();
	rcall _init_ds1820
	rjmp L46
L45:
	.dbline 149
;   
;   while(1)
;   {
	.dbline 150
;   delay_ms(1000);
	ldi R16,1000
	ldi R17,3
	rcall _delay_ms
	.dbline 152
;   
;   temper_data=read_temper();
	rcall _read_temper
	movw R20,R16
	.dbline 153
;   temper_data*=0.625;
	ldi R16,<L50
	ldi R17,>L50
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	ldi R16,<L51
	ldi R17,>L51
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R20
	lsr R17
	ror R16
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall empy32fs
	movw R16,R20
	andi R16,1
	andi R17,0
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall add32fs
	rcall empy32f
	movw R30,R28
	std z+5,R16
	std z+6,R17
	std z+7,R18
	std z+8,R19
	movw R30,R28
	ldd R2,z+5
	ldd R3,z+6
	ldd R4,z+7
	ldd R5,z+8
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L52
	ldi R17,>L52
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall cmp32f
	brlt L48
	movw R30,R28
	ldd R2,z+5
	ldd R3,z+6
	ldd R4,z+7
	ldd R5,z+8
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L52
	ldi R17,>L52
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall sub32f
	rcall fp2int
	movw R22,R16
	subi R22,0  ; offset = 32768
	sbci R23,128
	rjmp L49
L48:
	movw R30,R28
	ldd R16,z+5
	ldd R17,z+6
	ldd R18,z+7
	ldd R19,z+8
	rcall fp2int
	movw R22,R16
L49:
	movw R20,R22
	.dbline 154
	ldi R18,10
	ldi R19,0
	movw R16,R20
	rcall mod16u
	movw R24,R16
	adiw R24,48
	std y+0,R24
	.dbline 155
	ldi R18,10
	ldi R19,0
	movw R16,R20
	rcall div16u
	ldi R18,10
	ldi R19,0
	rcall mod16u
	movw R24,R16
	adiw R24,48
	std y+1,R24
	.dbline 156
	ldi R18,100
	ldi R19,0
	movw R16,R20
	rcall div16u
	ldi R18,10
	ldi R19,0
	rcall mod16u
	movw R24,R16
	adiw R24,48
	std y+2,R24
	.dbline 157
	ldi R16,<L55
	ldi R17,>L55
	rcall _puts
	.dbline 158
	ldd R16,y+2
	rcall _putchar
	.dbline 159
	ldd R16,y+1
	rcall _putchar
	.dbline 160
	ldi R16,46
	rcall _putchar
	.dbline 161
	ldd R16,y+0
	rcall _putchar
	.dbline 162
	ldi R16,96
	rcall _putchar
	.dbline 163
	ldi R16,67
	rcall _putchar
	.dbline 164
	ldi R16,<L58
	ldi R17,>L58
	rcall _puts_hh
	.dbline 167
L46:
	.dbline 148
	rjmp L45
X0:
	.dbline -2
L44:
	adiw R28,9
	.dbline 0 ; func end
	ret
	.dbsym r temper_data 20 i
	.dbsym l temp 0 A[5:5]c
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\开发板\source\ds18b20\dsi8b20.c
L58:
	.blkb 3
	.area idata
	.byte 32,32,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\source\ds18b20\dsi8b20.c
L55:
	.blkb 13
	.area idata
	.byte 181,177,199,176,206,194,182,200,202,199,163,186,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\source\ds18b20\dsi8b20.c
	.area lit(rom, con, rel)
L52:
	.word 0x0,0x4700
L51:
	.word 0x0,0x4000
L50:
	.word 0x0,0x3f20

⌨️ 快捷键说明

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