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

📄 ds18b20.s

📁 AVR16单片机DS18B20程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline -2
	.dbline 31
L31:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e B20_readB _B20_readB fc
;           retd -> R20
;              i -> R22
	.even
_B20_readB::
	xcall push_gset2
	.dbline -1
	.dbline 39
	.dbline 40
	clr R20
	.dbline 41
	clr R22
	xjmp L42
L39:
	.dbline 42
	.dbline 43
	lsr R20
	.dbline 44
	sbi 0x1a,5
	.dbline 45
	cbi 0x1b,5
	.dbline 46
	sbi 0x1b,5
	.dbline 47
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 48
	cbi 0x1a,5
	.dbline 49
	sbis 0x19,5
	rjmp L43
	.dbline 50
	.dbline 51
	ori R20,128
	.dbline 52
L43:
	.dbline 53
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 54
L40:
	.dbline 41
	inc R22
L42:
	.dbline 41
	cpi R22,8
	brlo L39
	.dbline 55
	mov R16,R20
	.dbline -2
L38:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r retd 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e B20_writeB _B20_writeB fV
;              i -> R20
;            wrd -> R22
	.even
_B20_writeB::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 64
	.dbline 66
	clr R20
	xjmp L49
L46:
	.dbline 67
	.dbline 68
	sbi 0x1a,5
	.dbline 69
	cbi 0x1b,5
	.dbline 70
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 71
	sbrs R22,0
	rjmp L50
	.dbline 72
	.dbline 73
	sbi 0x1b,5
	.dbline 74
	xjmp L51
L50:
	.dbline 76
	.dbline 77
	cbi 0x1b,5
	.dbline 78
L51:
	.dbline 79
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 80
	sbi 0x1b,5
	.dbline 81
	lsr R22
	.dbline 82
L47:
	.dbline 66
	inc R20
L49:
	.dbline 66
	cpi R20,8
	brlo L46
	.dbline 83
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline -2
	.dbline 84
L45:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r wrd 22 c
	.dbend
	.dbfunc e Read_temp _Read_temp fi
;           temp -> R20,R21
;          temph -> R22
;          templ -> R20
	.even
_Read_temp::
	xcall push_gset2
	.dbline -1
	.dbline 92
; /*******************************************
; 函数名称: Read_temp
; 功    能: 读取温度值
; 参    数: 无
; 返回值  : rettemp--返回的温度值
; /********************************************/
; uint Read_temp(void)
; {
	.dbline 95
;  uchar templ,temph;
;  uint temp;
;  B20_init();	      //初始化,每次写命令都从初始化开始
	xcall _B20_init
	.dbline 96
;  B20_writeB(0xcc); 	  //跳过ROM
	ldi R16,204
	xcall _B20_writeB
	.dbline 97
;  B20_writeB(0x44); 	  //启动温度转换
	ldi R16,68
	xcall _B20_writeB
	.dbline 98
;  B20_init();	   	  //初始化,每次写命令都从初始化开始
	xcall _B20_init
	.dbline 99
;  B20_writeB(0xcc); 	  //跳过ROM
	ldi R16,204
	xcall _B20_writeB
	.dbline 100
;  B20_writeB(0xbe); 	  //读寄存器
	ldi R16,190
	xcall _B20_writeB
	.dbline 101
;  templ=B20_readB();	  //读温度低字节
	xcall _B20_readB
	mov R20,R16
	.dbline 102
;  temph=B20_readB();	  //读温度高字节
	xcall _B20_readB
	mov R22,R16
	.dbline 103
;  temp=templ+temph*256;//将温度整理成16位变量
	mov R18,R22
	clr R19
	ldi R16,256
	ldi R17,1
	xcall empy16s
	mov R2,R20
	clr R3
	add R2,R16
	adc R3,R17
	movw R20,R2
	.dbline 104
;  return temp;	      //返回16位变量
	mov R16,R2
	mov R17,R3
	.dbline -2
L52:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 i
	.dbsym r temph 22 c
	.dbsym r templ 20 c
	.dbend
	.dbfunc e Num_BCD _Num_BCD fpc
;           rept -> R20,R21
;            chr -> y+0
;              i -> R22
;            num -> R10,R11
	.even
_Num_BCD::
	xcall push_gset3
	movw R10,R16
	sbiw R28,3
	.dbline -1
	.dbline 113
; }
; /*******************************************
; 函数名称: Num_BCD
; 功    能: 将一个字节的整数转换成三位BCD码
; 参    数: num--需要转换的整数
; 返回值  : chr--三位BCD码数组指针
; /********************************************/
; uchar* Num_BCD(uint num)
; {
	.dbline 116
;  uchar i,chr[3];	  
;  uchar *rept;
;  rept=&(chr[0]);	  //返回指针指向BCD码数组
	movw R20,R28
	.dbline 117
;  for(i=0;i<3;i++)
	clr R22
	xjmp L57
L54:
	.dbline 118
	.dbline 119
	mov R2,R22
	clr R3
	ldi R30,2
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	movw R24,R28
	add R30,R24
	adc R31,R25
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16u
	std z+0,R16
	.dbline 120
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall div16u
	movw R10,R16
	.dbline 121
L55:
	.dbline 117
	inc R22
L57:
	.dbline 117
	cpi R22,3
	brlo L54
	.dbline 122
;  {
;   chr[2-i]=num%10;	  //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
;   num/=10;			  //除以10,为取出下一位做准备
;  }
;  return rept;		  //返回指针
	mov R16,R20
	mov R17,R21
	.dbline -2
L53:
	adiw R28,3
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r rept 20 pc
	.dbsym l chr 0 A[3:3]c
	.dbsym r i 22 c
	.dbsym r num 10 i
	.dbend
	.dbfunc e main _main fV
;              t -> R22,R23
;         temppt -> R10,R11
;           temp -> y+0
;              i -> R20
	.even
_main::
	sbiw R28,7
	.dbline -1
	.dbline 131
; }
; /*******************************************
; 函数名称: main
; 功    能: 完成温度的读取与显示
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void main(void)
; {
	.dbline 135
;  uint t;
;  uchar *temppt;
;  uchar i,temp[3];
;  Board_init( );	   //初始化开发板
	xcall _Board_init
	xjmp L60
L59:
	.dbline 137
;  while(1)
;  {
	.dbline 138
;   t=Read_temp();   //读取温度值
	xcall _Read_temp
	movw R22,R16
	.dbline 139
;   t*=0.625;		   //转换成实际温度的10倍
	ldi R16,<L64
	ldi R17,>L64
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	ldi R16,<L65
	ldi R17,>L65
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R22
	lsr R17
	ror R16
	xcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall empy32fs
	movw R16,R22
	andi R16,1
	andi R17,0
	xcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall add32fs
	xcall empy32f
	movw R30,R28
	std z+3,R16
	std z+4,R17
	std z+5,R18
	std z+6,R19
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L66
	ldi R17,>L66
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall cmp32f
	brlt L62
	movw R30,R28
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L66
	ldi R17,>L66
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall sub32f
	xcall fp2int
	movw R20,R16
	subi R20,0  ; offset = 32768
	sbci R21,128
	xjmp L63
L62:
	movw R30,R28
	ldd R16,z+3
	ldd R17,z+4
	ldd R18,z+5
	ldd R19,z+6
	xcall fp2int
	movw R20,R16
L63:
	movw R22,R20
	.dbline 140
;   temppt=Num_BCD(t);//将实际温度的10倍转换成BCD码
	movw R16,R22
	xcall _Num_BCD
	movw R10,R16
	.dbline 141
;   for(i=0;i<3;i++)	//将转换后的BCD码存入显示数组
	clr R20
	xjmp L70
L67:
	.dbline 142
	.dbline 143
	mov R30,R20
	clr R31
	add R30,R10
	adc R31,R11
	ldd R2,z+0
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 144
L68:
	.dbline 141
	inc R20
L70:
	.dbline 141
	cpi R20,3
	brlo L67
	.dbline 145
;   {
;    temp[i]=*(temppt+i);
;   }
;   for(i=0;i<3;i++)					//显示温度
	clr R20
	xjmp L74
L71:
	.dbline 146
;   {
	.dbline 147
;    if(i==1)
	cpi R20,1
	brne L75
	.dbline 148
;    {
	.dbline 149
;     temp[1]+=16;				//如果是各位,则加上小数点(数码管的译码数组有所改变,读者可以看10_DS18B20文件夹下的SMG.C文件)
	ldd R24,y+1
	subi R24,240    ; addi 16
	std y+1,R24
	.dbline 150
;    }
L75:
	.dbline 151
	mov R18,R20
	subi R18,255    ; addi 1
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 152
	ldi R16,5
	ldi R17,0
	xcall _Delayms
	.dbline 153
L72:
	.dbline 145
	inc R20
L74:
	.dbline 145
	cpi R20,3
	brlo L71
	.dbline 154
L60:
	.dbline 136
	xjmp L59
X0:
	.dbline -2
	.dbline 155
;    One_smg_display(temp[i],i+1);	   
;    Delayms(5);
;   }
;  }
; }
L58:
	adiw R28,7
	.dbline 0 ; func end
	ret
	.dbsym r t 22 i
	.dbsym r temppt 10 pc
	.dbsym l temp 0 A[3:3]c
	.dbsym r i 20 c
	.dbend
	.area lit(rom, con, rel)
L66:
	.word 0x0,0x4700
L65:
	.word 0x0,0x4000
L64:
	.word 0x0,0x3f20

⌨️ 快捷键说明

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