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

📄 ds18b20.s

📁 AVR-based single-chip temperature display system, so absolutely! DS18B20 sensors used
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 116
; 		delay_nus(80);	/*延时80uS*/
; 		DQ_SET;					/*位结束*/
; 		value >>= 1;
; 		}
; 	if (flag & 0x80) {			/*恢复中断状态*/
; 		SEI();
; 		}
; }
; 
; /*启动ds1820转换*/
; void ds1820_start(void) {
	.dbline 118
; 
; 	ds1820_reset();
	xcall _ds1820_reset
	.dbline 119
; 	ds1820_write_byte(0xCC);	/*勿略地址*/
	ldi R16,204
	xcall _ds1820_write_byte
	.dbline 120
; 	ds1820_write_byte(0x44);	/*启动转换*/
	ldi R16,68
	xcall _ds1820_write_byte
	.dbline -2
L40:
	.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 124
; }
; 
; /*DS8B20读取温度信息*/
; unsigned int ds1820_read_temp(void) {
	.dbline 129
; 
; 	unsigned int i;
; 	unsigned char buf[9];
; 
; 	ds1820_reset();
	xcall _ds1820_reset
	.dbline 130
; 	ds1820_write_byte(0xCC);	/*勿略地址*/
	ldi R16,204
	xcall _ds1820_write_byte
	.dbline 131
; 	ds1820_write_byte(0xBE);	/*读取温度*/
	ldi R16,190
	xcall _ds1820_write_byte
	.dbline 132
	clr R20
	clr R21
	xjmp L45
L42:
	.dbline 132
	.dbline 133
	xcall _ds1820_read_byte
	movw R24,R28
	movw R30,R20
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 134
L43:
	.dbline 132
	subi R20,255  ; offset = 1
	sbci R21,255
L45:
	.dbline 132
; 	for (i = 0; i < 9; i++) {
	cpi R20,9
	ldi R30,0
	cpc R21,R30
	brlo L42
	.dbline 135
; 		buf[i] = ds1820_read_byte();
; 		}
; 	i = buf[1];
	ldd R20,y+1
	clr R21
	.dbline 136
; 	i <<= 8;
	mov R21,R20
	clr R20
	.dbline 137
; 	i |= buf[0];
	ldd R2,y+0
	clr R3
	or R20,R2
	or R21,R3
	.dbline 139
; 	
; 	return i;
	movw R16,R20
	.dbline -2
L41:
	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
	.dbfunc e time_to_disbuffer _time_to_disbuffer fV
;              d -> y+2
;              c -> y+0
;              b -> R18,R19
;              a -> R16,R17
	.even
_time_to_disbuffer::
	.dbline -1
	.dbline 142
; }
; void time_to_disbuffer(int a,int b,int c,int d)//时间送显示缓冲区函数
; {   
	.dbline 144
;   
;     dis_buff[0] = a;
	sts _dis_buff,R16
	.dbline 145
;     dis_buff[1] =b;
	sts _dis_buff+1,R18
	.dbline 146
; 	dis_buff[2] = c;
	ldd R2,y+0
	ldd R3,y+1
	sts _dis_buff+2,R2
	.dbline 147
;     dis_buff[3] =d;
	ldd R2,y+2
	ldd R3,y+3
	sts _dis_buff+3,R2
	.dbline -2
L47:
	.dbline 0 ; func end
	ret
	.dbsym l d 2 I
	.dbsym l c 0 I
	.dbsym r b 18 I
	.dbsym r a 16 I
	.dbend
	.dbfunc e display _display fV
	.even
_display::
	.dbline -1
	.dbline 151
	.dbline 151
	ldi R24,255
	out 0x12,R24
	.dbline 152
	ldi R24,<_dis_buff
	ldi R25,>_dis_buff
	lds R30,_posit
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_led_7
	ldi R25,>_led_7
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0x15,R2
	.dbline 153
	ldi R24,<_position
	ldi R25,>_position
	lds R30,_posit
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0x12,R2
	.dbline 154
	lds R24,_posit
	subi R24,255    ; addi 1
	mov R2,R24
	sts _posit,R2
	cpi R24,4
	brlo L52
	.dbline 154
	clr R2
	sts _posit,R2
L52:
	.dbline -2
L51:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 76
	jmp _TIMER0_COMP
	.area text(rom, con, rel)
	.dbfile G:\ds18b20\ds18b20.c
	.dbfunc e TIMER0_COMP _TIMER0_COMP fV
	.even
_TIMER0_COMP::
	xcall push_lset
	.dbline -1
	.dbline 160
; 
; }
; void display(void)//数码管显示程序
; {     PORTD = 0xff;
;   PORTC = led_7[dis_buff[posit]];
;   PORTD= position[posit];
;   if (++posit >=4 ) posit = 0;
; } 
; 
; // Timer 0 比较匹配中断服务
; #pragma interrupt_handler TIMER0_COMP:20 
; void TIMER0_COMP(void)
; { 
	.dbline 161
;   display(); 
	xcall _display
	.dbline -2
L54:
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e main _main fV
;              j -> <dead>
;              i -> R20,R21
	.even
_main::
	sbiw R28,4
	.dbline -1
	.dbline 166
;  
; }
;   
; void main(void)
; {
	.dbline 168
;   int i,j;
;   PORTD=0xFF;           // 显示控制I/O端口初始化
	ldi R24,255
	out 0x12,R24
	.dbline 169
;   DDRD=0xFF;
	out 0x11,R24
	.dbline 170
;   PORTC=0XfF;
	out 0x15,R24
	.dbline 171
;   DDRC=0xFF;
	out 0x14,R24
	.dbline 176
;   
; 
;   // T/C0 初始化
;   
;   TCCR0=0x0B;           // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
	ldi R24,11
	out 0x33,R24
	.dbline 177
;   TCNT0=0x00;
	clr R2
	out 0x32,R2
	.dbline 178
;   OCR0=0x7C;           // OCR0 = 0x7C(124),(124+1)/62.5=2ms
	ldi R24,124
	out 0x3c,R24
	.dbline 179
;   TIMSK=0x02;           // 允许T/C0比较匹配中断
	ldi R24,2
	out 0x39,R24
	.dbline 180
;   SEI(); //允许全局中断
	sei
	xjmp L57
L56:
	.dbline 182
;   
; 	while (1) {
	.dbline 183
; 		ds1820_start();					/*启动一次转换*/
	xcall _ds1820_start
	.dbline 184
; 		delay_nms(10);					/*等待转换结束*/
	ldi R16,10
	ldi R17,0
	xcall _delay_nms
	.dbline 185
; 		i=ds1820_read_temp();				/*读取温度数值*/
	xcall _ds1820_read_temp
	movw R20,R16
	.dbline 186
; 		if(i>=0xf000)//判断是不是负数
	cpi R16,0
	ldi R30,240
	cpc R17,R30
	brsh X1
	xjmp L59
X1:
	.dbline 187
; 		{
	.dbline 188
; 		i=~i;           //转换,先取反,在加1.
	com R20
	com R21
	.dbline 189
; 		i+=1;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 190
; 		i = (i * 10) / 16;				/*数值处理*/
	ldi R16,10
	ldi R17,0
	movw R18,R20
	xcall empy16s
	ldi R18,16
	ldi R19,0
	xcall div16s
	movw R20,R16
	.dbline 191
; 		led_buf[3] = i / 1000;			/*将显示信息加载到显示缓存区*/
	ldi R18,1000
	ldi R19,3
	xcall div16s
	sts _led_buf+3,R16
	.dbline 192
; 		i = i % 1000;
	ldi R18,1000
	ldi R19,3
	movw R16,R20
	xcall mod16s
	movw R20,R16
	.dbline 193
; 		led_buf[2] = i / 100;
	ldi R18,100
	ldi R19,0
	xcall div16s
	sts _led_buf+2,R16
	.dbline 194
; 		i = i % 100;
	ldi R18,100
	ldi R19,0
	movw R16,R20
	xcall mod16s
	movw R20,R16
	.dbline 195
; 		led_buf[1] = i / 10;
	ldi R18,10
	ldi R19,0
	xcall div16s
	sts _led_buf+1,R16
	.dbline 196
; 		led_buf[0] = i % 10;
	ldi R18,10
	ldi R19,0
	movw R16,R20
	xcall mod16s
	sts _led_buf,R16
	.dbline 197
; 		time_to_disbuffer(led_buf[1],led_buf[2],10,11);
	ldi R24,11
	ldi R25,0
	std y+3,R25
	std y+2,R24
	ldi R24,10
	std y+1,R25
	std y+0,R24
	lds R18,_led_buf+2
	clr R19
	lds R16,_led_buf+1
	clr R17
	xcall _time_to_disbuffer
	.dbline 198
; 		}
	xjmp L60
L59:
	.dbline 200
; 		else
; 		{	
	.dbline 201
; 		i = (i * 10) / 16;				/*数值处理*/
	ldi R16,10
	ldi R17,0
	movw R18,R20
	xcall empy16s
	ldi R18,16
	ldi R19,0
	xcall div16s
	movw R20,R16
	.dbline 202
; 		led_buf[3] = i / 1000;			/*将显示信息加载到显示缓存区*/
	ldi R18,1000
	ldi R19,3
	xcall div16s
	sts _led_buf+3,R16
	.dbline 203
; 		i = i % 1000;
	ldi R18,1000
	ldi R19,3
	movw R16,R20
	xcall mod16s
	movw R20,R16
	.dbline 204
; 		led_buf[2] = i / 100;
	ldi R18,100
	ldi R19,0
	xcall div16s
	sts _led_buf+2,R16
	.dbline 205
; 		i = i % 100;
	ldi R18,100
	ldi R19,0
	movw R16,R20
	xcall mod16s
	movw R20,R16
	.dbline 206
; 		led_buf[1] = i / 10;
	ldi R18,10
	ldi R19,0
	xcall div16s
	sts _led_buf+1,R16
	.dbline 207
; 		led_buf[0] = i % 10;	
	ldi R18,10
	ldi R19,0
	movw R16,R20
	xcall mod16s
	sts _led_buf,R16
	.dbline 208
; 		time_to_disbuffer(led_buf[1],led_buf[2],led_buf[3],led_buf[0]);
	mov R2,R16
	clr R3
	std y+3,R3
	std y+2,R2
	lds R2,_led_buf+3
	clr R3
	std y+1,R3
	std y+0,R2
	lds R18,_led_buf+2
	clr R19
	lds R16,_led_buf+1
	clr R17
	xcall _time_to_disbuffer
	.dbline 209
; 		}
L60:
	.dbline 210
L57:
	.dbline 182
	xjmp L56
X0:
	.dbline -2
L55:
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l j 5 I
	.dbsym r i 20 I
	.dbend
	.area bss(ram, con, rel)
	.dbfile G:\ds18b20\ds18b20.c
_posit::
	.blkb 1
	.dbsym e posit _posit c
_dis_buff::
	.blkb 4
	.dbsym e dis_buff _dis_buff A[4:4]c
_flag::
	.blkb 1
	.dbsym e flag _flag c

⌨️ 快捷键说明

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