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

📄 18b20.s

📁 结合温度传感器的实现测温度的C程序 这个小项目用到了比较多的AVR单片机的资源 是个不错的学习例程
💻 S
字号:
	.module _18b20.c
	.area text(rom, con, rel)
	.dbfile D:\时钟芯片\1302\1302-162\18b20.c
	.dbfunc e delayb _delayb fV
;              x -> R16,R17
	.even
_delayb::
	.dbline -1
	.dbline 6
; #include <io8515v.h>
; #include <macros.h>
; #include <162-1302.h>
; //时间延迟
; void delayb(uint x)                //1.5us左右 
; { 
	rjmp L3
L2:
	.dbline 8
	.dbline 9
	subi R16,1
	sbci R17,0
	.dbline 10
L3:
	.dbline 7
;      while(x) 
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r x 16 i
	.dbend
	.dbfunc e init_1820 _init_1820 fc
;            ack -> R20
	.even
_init_1820::
	rcall push_gset1
	.dbline -1
	.dbline 14
;     { 
;        x--; 
;     } 
; } 
; //18b20初始化
; uchar init_1820() 
; {   uchar ack;
	.dbline 15
;     B20_DATA_DDR|=B20_DATA_IO ;                   //输出   
	sbi 0x14,0
	.dbline 16
;     B20_DATA_PORT&=~B20_DATA_IO ; 
	cbi 0x15,0
	.dbline 17
;     delayb(600);                   //复位低电平480us~960us
	ldi R16,600
	ldi R17,2
	rcall _delayb
	.dbline 18
;     B20_DATA_PORT|=B20_DATA_IO ;                  //电平拉高
	sbi 0x15,0
	.dbline 19
; 	B20_DATA_DDR&=~B20_DATA_IO ;                    //输入
	cbi 0x14,0
	.dbline 20
; 	delayb(90);                    //延时60us~240us
	ldi R16,90
	ldi R17,0
	rcall _delayb
	.dbline 21
; 	ack=B20_DATA_PIN;                     //读出ack的值
	in R20,0x13
	.dbline 22
; 	ack&=B20_DATA_IO; 
	andi R20,1
	.dbline 23
; 	delayb(200);                   //等待480us以上
	ldi R16,200
	ldi R17,0
	rcall _delayb
	.dbline 24
; 	B20_DATA_DDR|=B20_DATA_IO ;                   //输出   
	sbi 0x14,0
	.dbline 25
; 	return(ack);
	mov R16,R20
	.dbline -2
L5:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ack 20 c
	.dbend
	.dbfunc e write_1820 _write_1820 fV
;              m -> R20
;              i -> R22
;              x -> R10
	.even
_write_1820::
	rcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 29
; } 
; //写一个字节
; void write_1820(uchar x) 
; {    
	.dbline 31
;     uchar i,m;
; 	B20_DATA_DDR|=B20_DATA_IO;   //输出 
	sbi 0x14,0
	.dbline 32
;     for(i=0;i<8;i++) 
	clr R22
	rjmp L10
L7:
	.dbline 33
;     {  
	.dbline 34
; 	   m=x&0x01;                       
	mov R20,R10
	andi R20,1
	.dbline 35
; 	   if(m==0x01)
	cpi R20,1
	brne L11
	.dbline 36
; 	   {
	.dbline 37
; 	    delayb(1);                        //延时>1us
	ldi R16,1
	ldi R17,0
	rcall _delayb
	.dbline 38
;        	B20_DATA_PORT&=~B20_DATA_IO;    //产生写起始信号
	cbi 0x15,0
	.dbline 39
; 	   	delayb(3);                       //延时1us~15us  8us
	ldi R16,3
	ldi R17,0
	rcall _delayb
	.dbline 40
; 	   	B20_DATA_PORT|=B20_DATA_IO;     //数据线电平拉高
	sbi 0x15,0
	.dbline 41
; 	   	delayb(55);                     //延时60us~120us  85us
	ldi R16,55
	ldi R17,0
	rcall _delayb
	.dbline 42
; 	   }
	rjmp L12
L11:
	.dbline 44
; 	   else
; 	   {
	.dbline 45
; 	    delayb(1);                        //延时>1us
	ldi R16,1
	ldi R17,0
	rcall _delayb
	.dbline 46
;        	B20_DATA_PORT&=~B20_DATA_IO;     //产生写起始信号
	cbi 0x15,0
	.dbline 47
;        	delayb(55);                      //B20采样要60us到120us  85us
	ldi R16,55
	ldi R17,0
	rcall _delayb
	.dbline 48
;        	B20_DATA_PORT|=B20_DATA_IO;      //数据线电平拉高
	sbi 0x15,0
	.dbline 49
;        }
L12:
	.dbline 50
	lsr R10
	.dbline 51
L8:
	.dbline 32
	inc R22
L10:
	.dbline 32
	cpi R22,8
	brlo L7
	.dbline -2
L6:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r m 20 c
	.dbsym r i 22 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e read_1820 _read_1820 fc
;           temp -> R20
;              k -> R22
;              n -> R10
	.even
_read_1820::
	rcall push_gset3
	.dbline -1
	.dbline 55
; 	   x=x>>1;                          //右移一位
; 	} 
; } 
; //读一个字节
; uchar read_1820() 
; {     
	.dbline 57
;     uchar temp,k,n; 
;        temp=0; 
	clr R20
	.dbline 58
;     for(n=0;n<8;n++) 
	clr R10
	rjmp L17
L14:
	.dbline 59
;        { 
	.dbline 60
; 	  B20_DATA_DDR|=B20_DATA_IO;         //输出 
	sbi 0x14,0
	.dbline 61
;       B20_DATA_PORT&=~B20_DATA_IO;               //产生读起始信号
	cbi 0x15,0
	.dbline 62
;       asm("nop");
	nop
	.dbline 63
; 	  asm("nop");
	nop
	.dbline 64
; 	  asm("nop");
	nop
	.dbline 65
; 	  asm("nop");                        //延时1us~15us  2us
	nop
	.dbline 66
;       B20_DATA_PORT|=B20_DATA_IO;        //电平拉高    
	sbi 0x15,0
	.dbline 67
;       B20_DATA_DDR&=~B20_DATA_IO;        //接收数据
	cbi 0x14,0
	.dbline 68
; 	  asm("nop");                      //要在15us内完成读数
	nop
	.dbline 69
; 	  asm("nop");      
	nop
	.dbline 70
;       k=B20_DATA_PIN;     //读数据,从低位开始 
	in R22,0x13
	.dbline 71
; 	  k&=0x01;
	andi R22,1
	.dbline 72
;       if(k) 
	breq L18
	.dbline 73
;       temp|=(1<<n); 
	ldi R16,1
	mov R17,R10
	rcall lsl8
	or R20,R16
	rjmp L19
L18:
	.dbline 75
;       else 
;       temp&=~(1<<n); 
	ldi R16,1
	mov R17,R10
	rcall lsl8
	mov R2,R16
	com R2
	and R20,R2
L19:
	.dbline 76
	ldi R16,40
	ldi R17,0
	rcall _delayb
	.dbline 77
	sbi 0x14,0
	.dbline 78
	sbi 0x15,0
	.dbline 79
L15:
	.dbline 58
	inc R10
L17:
	.dbline 58
	mov R24,R10
	cpi R24,8
	brlo L14
	.dbline 80
;       delayb(40);                          //60~120us   
; 	  B20_DATA_DDR|=B20_DATA_IO;          //输出
;       B20_DATA_PORT|=B20_DATA_IO; 
;    } 
;    return temp; 
	mov R16,R20
	.dbline -2
L13:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r k 22 c
	.dbsym r n 10 c
	.dbend

⌨️ 快捷键说明

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