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

📄 ds18b20.s

📁 F:程序DS18B20.rar索读取温度
💻 S
字号:
	.module DS18B20.C
	.area text(rom, con, rel)
	.dbfile F:\try\DS18B20\DS18B20.C
	.dbfunc e init_1820 _init_1820 fV
	.even
_init_1820::
	.dbline -1
	.dbline 19
; /************************************************************************* 
; ds18b20头文件    
; M16  内部8M         
; *************************************************************************/ 
; #include <iom16v.h>
; #include <macros.h>
; #include "DS18B20.h"
; 
; #define CLR_DIR_1WIRE DDRC&=~BIT(2)   
;   //只要修改这里的参数就可以了!呵呵! 
; #define SET_DIR_1WIRE DDRC|=BIT(2)     
;  //里面什么都不用该! 
; #define CLR_OP_1WIRE PORTC&=~BIT(2) 
; #define SET_OP_1WIRE PORTC|=BIT(2)       
; #define CHECK_IP_1WIRE (PINC & 0x04)   
;  //检测 
; unsigned char wmh,wml; 
; void init_1820(void)  
; {  
	.dbline 20
;     SET_DIR_1WIRE;                //设置PC2 为输出 
	sbi 0x14,2
	.dbline 21
;     SET_OP_1WIRE;   
	sbi 0x15,2
	.dbline 22
;     CLR_OP_1WIRE;  
	cbi 0x15,2
	.dbline 23
;     delay_nus(500);    //480us以上  
	ldi R16,500
	ldi R17,1
	xcall _delay_nus
	.dbline 24
;     SET_OP_1WIRE;  
	sbi 0x15,2
	.dbline 25
;     CLR_DIR_1WIRE;  
	cbi 0x14,2
	.dbline 26
;     delay_nus(25);     //15~60us  
	ldi R16,25
	ldi R17,0
	xcall _delay_nus
L2:
	.dbline 27
;     while(CHECK_IP_1WIRE);  
L3:
	.dbline 27
	sbic 0x13,2
	rjmp L2
X0:
	.dbline 28
;     SET_DIR_1WIRE;  
	sbi 0x14,2
	.dbline 29
;     SET_OP_1WIRE;  
	sbi 0x15,2
	.dbline 30
;     delay_nus(180);   //60~240us  
	ldi R16,180
	ldi R17,0
	xcall _delay_nus
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e write_1820 _write_1820 fV
;              m -> R20
;              x -> R10
	.even
_write_1820::
	st -y,R10
	st -y,R20
	mov R10,R16
	.dbline -1
	.dbline 33
; }  
; void write_1820(unsigned char x)  
; {     
	.dbline 35
;      unsigned char m;  
;     for(m=0;m<8;m++)  
	clr R20
	xjmp L9
L6:
	.dbline 36
;     {  
	.dbline 37
;        CLR_OP_1WIRE;  
	cbi 0x15,2
	.dbline 38
;        if(x&(1<<m))    //写数据了,先写低位的! 
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R10
	and R2,R16
	breq L10
X1:
	.dbline 39
;        SET_OP_1WIRE;  
	sbi 0x15,2
	xjmp L11
L10:
	.dbline 41
;        else  
;        {CLR_OP_1WIRE;}  
	.dbline 41
	cbi 0x15,2
	.dbline 41
L11:
	.dbline 42
;        delay_nus(40);   //15~60us  
	ldi R16,40
	ldi R17,0
	xcall _delay_nus
	.dbline 43
;        SET_OP_1WIRE;  
	sbi 0x15,2
	.dbline 44
;     }  
L7:
	.dbline 35
	inc R20
L9:
	.dbline 35
	cpi R20,8
	brlo L6
X2:
	.dbline 45
;      SET_OP_1WIRE;  
	sbi 0x15,2
	.dbline -2
L5:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r m 20 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e read_1820 _read_1820 fc
;           temp -> R10
;              k -> R22
;              n -> R20
	.even
_read_1820::
	xcall push_xgsetF00C
	.dbline -1
	.dbline 48
; }  
; unsigned char read_1820(void)  
; {      
	.dbline 50
;     unsigned char temp,k,n;  
;     temp=0;  
	clr R10
	.dbline 51
;     for(n=0;n<8;n++)  
	clr R20
	xjmp L16
L13:
	.dbline 52
;        {  
	.dbline 53
;       CLR_OP_1WIRE;  
	cbi 0x15,2
	.dbline 54
;       SET_OP_1WIRE;  
	sbi 0x15,2
	.dbline 55
;       CLR_DIR_1WIRE;  
	cbi 0x14,2
	.dbline 56
;       k=(CHECK_IP_1WIRE);    //读数据,从低位开始  
	in R22,0x13
	andi R22,4
	.dbline 57
;       if(k)  
	breq L17
X3:
	.dbline 58
;       temp|=(1<<n);  
	ldi R16,1
	mov R17,R20
	xcall lsl8
	or R10,R16
	xjmp L18
L17:
	.dbline 60
;       else  
;       temp&=~(1<<n);  
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	and R10,R2
L18:
	.dbline 61
;       delay_nus(80); //60~120us      
	ldi R16,80
	ldi R17,0
	xcall _delay_nus
	.dbline 62
;       SET_DIR_1WIRE;  
	sbi 0x14,2
	.dbline 63
;    }  
L14:
	.dbline 51
	inc R20
L16:
	.dbline 51
	cpi R20,8
	brlo L13
X4:
	.dbline 64
;    return (temp);  
	mov R16,R10
	.dbline -2
L12:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r temp 10 c
	.dbsym r k 22 c
	.dbsym r n 20 c
	.dbend
	.dbfunc e gettemp _gettemp fc
;            wm3 -> R10
;            wm2 -> R10
;            wm1 -> R22
;            wm0 -> R20
;           teml -> R20
;           temh -> R22
	.even
_gettemp::
	xcall push_xgsetF00C
	.dbline -1
	.dbline 68
; }   
; 
; unsigned char gettemp(void)                   //读取温度值 
; {  
	.dbline 70
;      unsigned char temh,teml,wm0,wm1,wm2,wm3;  
;      init_1820();        //复位18b20  
	xcall _init_1820
	.dbline 71
;      write_1820(0xcc);   // 发出转换命令  
	ldi R16,204
	xcall _write_1820
	.dbline 72
;      write_1820(0x44); 
	ldi R16,68
	xcall _write_1820
	.dbline 73
;      delay_nms(1100);     //不延时也好使,不知道怎么回事! 
	ldi R16,1100
	ldi R17,4
	xcall _delay_nms
	.dbline 74
;      init_1820();  
	xcall _init_1820
	.dbline 75
;      write_1820(0xcc);  //发出读命令  
	ldi R16,204
	xcall _write_1820
	.dbline 76
;      write_1820(0xbe);  
	ldi R16,190
	xcall _write_1820
	.dbline 77
;      teml=read_1820();  //读数据  
	xcall _read_1820
	mov R20,R16
	.dbline 78
;      temh=read_1820();  
	xcall _read_1820
	mov R22,R16
	.dbline 79
;      wm0=teml&0xF0;       //只要高8位的低四位和低8位的高四位,温度范围0~99啦! 
	andi R20,240
	.dbline 80
;      wm1=temh&0x0F; 
	andi R22,15
	.dbline 81
;      wm2=wm1+wm0;        //16进制转10进制 
	mov R10,R22
	add R10,R20
	.dbline 82
;      wm3=wm2/100; 
	ldi R17,100
	mov R16,R10
	xcall div8u
	mov R10,R16
	.dbline 85
;      //wmh=(wm2%100)/10;   //出口参数了!wmh是显示的高位,wml使显示的低位 
;      //wml=(wm2%100)%10; 
; 	 return wm3;
	.dbline -2
L19:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r wm3 10 c
	.dbsym r wm2 10 c
	.dbsym r wm1 22 c
	.dbsym r wm0 20 c
	.dbsym r teml 20 c
	.dbsym r temh 22 c
	.dbend
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 97
; }   
; 
; 
; //延时程序: 
; 
; //delay.h 
; /*----------------------------------------------------------------------- 
; 延时函数 
; 系统时钟:8M 
; -----------------------------------------------------------------------*/ 
; void delay_1us(void)                 //1us延时函数 
;   { 
	.dbline 98
;    asm("nop"); 
	nop
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R10,R11
	.even
_delay_nus::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 102
;   } 
; 
; void delay_nus(unsigned int n)       //N us延时函数 
;   { 
	.dbline 103
;    unsigned int i=0; 
	clr R20
	clr R21
	.dbline 104
;    for (i=0;i<n;i++) 
	xjmp L25
L22:
	.dbline 105
;    delay_1us(); 
	xcall _delay_1us
L23:
	.dbline 104
	subi R20,255  ; offset = 1
	sbci R21,255
L25:
	.dbline 104
	cp R20,R10
	cpc R21,R11
	brlo L22
X5:
	.dbline -2
L21:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r n 10 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 109
;   } 
;    
; void delay_1ms(void)                 //1ms延时函数 
;   { 
	.dbline 111
;    unsigned int i; 
;    for (i=0;i<1140;i++); 
	clr R16
	clr R17
	xjmp L30
L27:
	.dbline 111
L28:
	.dbline 111
	subi R16,255  ; offset = 1
	sbci R17,255
L30:
	.dbline 111
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L27
X6:
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R10,R11
	.even
_delay_nms::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 115
;   } 
;    
; void delay_nms(unsigned int n)       //N ms延时函数 
;   { 
	.dbline 116
;    unsigned int i=0; 
	clr R20
	clr R21
	.dbline 117
;    for (i=0;i<n;i++) 
	xjmp L35
L32:
	.dbline 118
;    delay_1ms(); 
	xcall _delay_1ms
L33:
	.dbline 117
	subi R20,255  ; offset = 1
	sbci R21,255
L35:
	.dbline 117
	cp R20,R10
	cpc R21,R11
	brlo L32
X7:
	.dbline -2
L31:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r n 10 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\try\DS18B20\DS18B20.C
_wml::
	.blkb 1
	.dbsym e wml _wml c
_wmh::
	.blkb 1
	.dbsym e wmh _wmh c
;   } 

⌨️ 快捷键说明

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