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

📄 ds18b20_main.s

📁 16个单片机c语言实验程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module DS18B20_main.c
	.area text(rom, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\DS18B20\DS18B20_main.c
	.dbfile E:\产品\开发板\光盘\16实验程序\DS18B20\18B20.h
	.dbfunc e s_10us _s_10us fV
;             aa -> R20,R21
;             ms -> R16,R17
	.even
_s_10us::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 19
; //DS18B20连接在端口C的第7引脚
; 
; //设置成输入
; #define DQ_INPUT DDRC &= ~(1 << PC7)    
; //设置成输出
; #define DQ_OUT DDRC |= (1 << PC7)    
; //设置成低电平
; #define DQ_LO PORTC &= ~(1 << PC7)  
; //设置成高电平
; #define DQ_HI PORTC |= (1 << PC7)   
; //读出
; #define DQ_R PINC & (1 << PC7)      
; 
; //中断标志
; unsigned char init_f;     
; 
; //延时函数
; void s_10us(unsigned int ms)
; {
	.dbline 21
;     unsigned int aa;
; 	for(;ms>=1;ms--)
	xjmp L5
L2:
	.dbline 22
; 	{
	.dbline 23
; 	for(aa=0;aa<=17;aa++)
	clr R20
	clr R21
	xjmp L9
L6:
	.dbline 24
; 	{;}
	.dbline 24
	.dbline 24
L7:
	.dbline 23
	subi R20,255  ; offset = 1
	sbci R21,255
L9:
	.dbline 23
	ldi R24,17
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brsh L6
X0:
	.dbline 25
; 	}
L3:
	.dbline 21
	subi R16,1
	sbci R17,0
L5:
	.dbline 21
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	brsh L2
X1:
	.dbline -2
L1:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r aa 20 i
	.dbsym r ms 16 i
	.dbend
	.dbfunc e ds1820_reset _ds1820_reset fV
;              i -> R20
	.even
_ds1820_reset::
	st -y,R20
	.dbline -1
	.dbline 30
; }	
; 
; //DS18B20复位
; void ds1820_reset(void) 
; {
	.dbline 33
;  unsigned char i;
;  //中断保护
;  init_f = SREG;    
	in R2,0x3f
	sts _init_f,R2
	.dbline 35
;  //关中断
;  CLI();      
	cli
	.dbline 36
;  DQ_OUT;
	sbi 0x14,7
	.dbline 37
;  DQ_LO;
	cbi 0x15,7
	.dbline 38
;  s_10us(50);    //延时500us
	ldi R16,50
	ldi R17,0
	xcall _s_10us
	.dbline 39
;  DQ_HI;
	sbi 0x15,7
	.dbline 40
;  DQ_INPUT;
	cbi 0x14,7
	.dbline 41
;  s_10us(8);     //延时80us
	ldi R16,8
	ldi R17,0
	xcall _s_10us
	.dbline 42
;  i = DQ_R;
	in R20,0x13
	andi R20,128
	.dbline 43
;  s_10us(50);    //延时500us
	ldi R16,50
	ldi R17,0
	xcall _s_10us
	.dbline 44
;  if (init_f & 0x80)  //恢复中断状态
	lds R2,_init_f
	sbrs R2,7
	rjmp L11
X2:
	.dbline 45
;   {   
	.dbline 46
;   SEI();        
	sei
	.dbline 47
;   }
L11:
	.dbline -2
L10:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e ds1820_read_byte _ds1820_read_byte fc
;          value -> R20
;              i -> R22
	.even
_ds1820_read_byte::
	st -y,R20
	st -y,R22
	.dbline -1
	.dbline 52
; }
; 
; //DS18B20字节读取
; unsigned char ds1820_read_byte(void) 
; {
	.dbline 54
;  unsigned char i;
;  unsigned char value = 0;
	clr R20
	.dbline 56
;  //中断保护
;  init_f = SREG;
	in R2,0x3f
	sts _init_f,R2
	.dbline 58
;  //关中断    
;  CLI();      
	cli
	.dbline 59
;  for (i = 8; i != 0; i--) {
	ldi R22,8
	xjmp L17
L14:
	.dbline 59
	.dbline 60
;   value >>= 1;
	lsr R20
	.dbline 61
;   DQ_OUT;
	sbi 0x14,7
	.dbline 62
;   DQ_LO;
	cbi 0x15,7
	.dbline 63
;   s_10us(1);
	ldi R16,1
	ldi R17,0
	xcall _s_10us
	.dbline 64
;   DQ_HI;
	sbi 0x15,7
	.dbline 65
;   DQ_INPUT;
	cbi 0x14,7
	.dbline 66
;   s_10us(1);
	ldi R16,1
	ldi R17,0
	xcall _s_10us
	.dbline 67
;   if (DQ_R) {
	sbis 0x13,7
	rjmp L18
X3:
	.dbline 67
	.dbline 68
;    value|=0x80;
	ori R20,128
	.dbline 69
;    }
L18:
	.dbline 70
;   s_10us(5);   //延时60us
	ldi R16,5
	ldi R17,0
	xcall _s_10us
	.dbline 71
;   }
L15:
	.dbline 59
	dec R22
L17:
	.dbline 59
	tst R22
	brne L14
X4:
	.dbline 72
;  if (init_f & 0x80) //恢复中断状态
	lds R2,_init_f
	sbrs R2,7
	rjmp L20
X5:
	.dbline 73
;  {   
	.dbline 74
;   SEI();
	sei
	.dbline 75
;   }
L20:
	.dbline 76
;  return(value);
	mov R16,R20
	.dbline -2
L13:
	.dbline 0 ; func end
	ld R22,y+
	ld R20,y+
	ret
	.dbsym r value 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e ds1820_write_byte _ds1820_write_byte fV
;              i -> R20
;          value -> R10
	.even
_ds1820_write_byte::
	st -y,R10
	st -y,R20
	mov R10,R16
	.dbline -1
	.dbline 81
; }
; 
; //DS18B20字节写入
; void ds1820_write_byte(unsigned char value) 
; {
	.dbline 84
;  unsigned char i;
;  //中断保护
;  init_f = SREG;   
	in R2,0x3f
	sts _init_f,R2
	.dbline 86
;  //关中断 
;  CLI();      
	cli
	.dbline 87
;  for (i = 8; i != 0; i--) {
	ldi R20,8
	xjmp L26
L23:
	.dbline 87
	.dbline 88
;   DQ_OUT;
	sbi 0x14,7
	.dbline 89
;   DQ_LO;
	cbi 0x15,7
	.dbline 90
;   s_10us(1);
	ldi R16,1
	ldi R17,0
	xcall _s_10us
	.dbline 91
;   if (value & 0x01) {
	sbrs R10,0
	rjmp L27
X6:
	.dbline 91
	.dbline 92
;    DQ_HI;
	sbi 0x15,7
	.dbline 93
;    }
L27:
	.dbline 94
;   s_10us(8);   //延时80us
	ldi R16,8
	ldi R17,0
	xcall _s_10us
	.dbline 95
;   DQ_HI;     
	sbi 0x15,7
	.dbline 96
;   value >>= 1;
	lsr R10
	.dbline 97
;   }
L24:
	.dbline 87
	dec R20
L26:
	.dbline 87
	tst R20
	brne L23
X7:
	.dbline 98
;  if (init_f & 0x80)//恢复中断状态
	lds R2,_init_f
	sbrs R2,7
	rjmp L29
X8:
	.dbline 99
;   {   
	.dbline 100
;   SEI();
	sei
	.dbline 101
;   }
L29:
	.dbline -2
L22:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r i 20 c
	.dbsym r value 10 c
	.dbend
	.dbfunc e ds1820_start _ds1820_start fV
	.even
_ds1820_start::
	.dbline -1
	.dbline 106
; }
; 
; //启动ds1820转换
; void ds1820_start(void) 
; {
	.dbline 107
;  ds1820_reset();
	xcall _ds1820_reset
	.dbline 108
;  ds1820_write_byte(0xCC); //勿略ROM
	ldi R16,204
	xcall _ds1820_write_byte
	.dbline 109
;  ds1820_write_byte(0x44); //启动转换
	ldi R16,68
	xcall _ds1820_write_byte
	.dbline -2
L31:
	.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::
	st -y,R20
	st -y,R21
	sbiw R28,9
	.dbline -1
	.dbline 114
; }
; 
; //读温度
; unsigned int ds1820_read_temp(void)
;  {
	.dbline 117
;  unsigned int i;
;  unsigned char buf[9];
;  ds1820_reset();
	xcall _ds1820_reset
	.dbline 118
;  ds1820_write_byte(0xCC); //勿略ROM
	ldi R16,204
	xcall _ds1820_write_byte
	.dbline 119
;  ds1820_write_byte(0xBE); //读温度
	ldi R16,190
	xcall _ds1820_write_byte
	.dbline 120
;  for (i = 0; i < 9; i++) {
	clr R20
	clr R21
	xjmp L36
L33:
	.dbline 120
	.dbline 121
;   buf[i] = ds1820_read_byte();
	xcall _ds1820_read_byte
	movw R24,R28
	movw R30,R20
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 122
;   }
L34:
	.dbline 120
	subi R20,255  ; offset = 1
	sbci R21,255
L36:
	.dbline 120
	cpi R20,9
	ldi R30,0
	cpc R21,R30
	brlo L33
X9:
	.dbline 123
;  i = buf[1];
	ldd R20,y+1
	clr R21
	.dbline 124
;  i <<= 8;
	mov R21,R20
	clr R20
	.dbline 125
;  i |= buf[0];
	ldd R2,y+0
	clr R3
	or R20,R2
	or R21,R3
	.dbline 126
;  return i;
	movw R16,R20
	.dbline -2
L32:
	.dbline 0 ; func end
	adiw R28,9
	ld R21,y+
	ld R20,y+
	ret
	.dbsym l buf 0 A[9:9]c
	.dbsym r i 20 i
	.dbend
	.dbfile E:\产品\开发板\光盘\16实验程序\DS18B20\1602.h
	.dbfunc e s_ms _s_ms fV
;             ms -> R16,R17
	.even
_s_ms::
	.dbline -1
	.dbline 9
; #define uchar unsigned char 
; #define uint unsigned int 
; 
; #define RS 5
; #define RW 6
; #define EN 7
; 
; void s_ms(uint ms)
; {
	.dbline 10
; 	for(;ms>1;ms--);
	xjmp L42
L39:
	.dbline 10
L40:
	.dbline 10
	subi R16,1
	sbci R17,0
L42:
	.dbline 10
	ldi R24,1
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlo L39
X10:
	.dbline -2
L38:
	.dbline 0 ; func end
	ret
	.dbsym r ms 16 i
	.dbend
	.dbfunc e busy _busy fV
;           temp -> R20
	.even
_busy::
	st -y,R20
	.dbline -1
	.dbline 15
; }	
; 
; //查忙
; void busy(void)
; {
	.dbline 17
;     uchar temp;
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 18
; 	PORTA&=~(1<<RS);    //RS=0
	cbi 0x1b,5
	.dbline 19
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 20
; 	PORTA|=(1<<RW);     //RW=1
	sbi 0x1b,6
	.dbline 21
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	xjmp L45
L44:
	.dbline 23
; 	while(temp)
; 	{
	.dbline 24
; 		PORTA|=(1<<EN); //EN=1
	sbi 0x1b,7
	.dbline 25
; 		s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 26
; 		DDRD=0x00;      //A口变输入
	clr R2
	out 0x11,R2
	.dbline 27
; 		PORTD=0xff;     //上拉使能
	ldi R24,255
	out 0x12,R24
	.dbline 28
; 		s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 29
; 		temp = PIND&0x80;    //读取A口
	in R20,0x10
	andi R20,128
	.dbline 30
; 		s_ms(500);      
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 31
; 		DDRD=0xff;      
	ldi R24,255
	out 0x11,R24
	.dbline 32
; 		PORTD=0xff;        //A口变输出
	out 0x12,R24
	.dbline 33
; 		s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 34
; 		PORTA&=~(1<<EN);   //EN=0
	cbi 0x1b,7
	.dbline 35
; 		s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 36
; 	}
L45:
	.dbline 22
	tst R20
	brne L44
X11:
	.dbline -2
L43:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r temp 20 c
	.dbend
	.dbfunc e writecom _writecom fV
;            com -> R10
	.even
_writecom::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 41
; }
; 
; //写指令
; void writecom(uchar	com)
; {
	.dbline 42
; 	busy();
	xcall _busy
	.dbline 43
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 44
; 	PORTA&=~(1<<RS);   //RS=0
	cbi 0x1b,5
	.dbline 45
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 46
; 	PORTA&=~(1<<RW);   //RW=0
	cbi 0x1b,6
	.dbline 47
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 48
; 	PORTA|=(1<<EN);    //EN=1
	sbi 0x1b,7
	.dbline 49
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 50
; 	PORTD = com;       //输出指令
	out 0x12,R10
	.dbline 51
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 52
; 	PORTA&=~(1<<EN);   //EN=0
	cbi 0x1b,7
	.dbline 53
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline -2
L47:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r com 10 c
	.dbend
	.dbfunc e LcdInit _LcdInit fV
	.even
_LcdInit::
	.dbline -1
	.dbline 58
; }
; 
; //1602初始化
; void	LcdInit(void)
; {
	.dbline 59
;     DDRD = 0xff; 
	ldi R24,255
	out 0x11,R24
	.dbline 60
;     PORTD = 0x00; 
	clr R2
	out 0x12,R2
	.dbline 61
; 	writecom(0x38);
	ldi R16,56
	xcall _writecom
	.dbline 62
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 63
; 	writecom(0x01);
	ldi R16,1
	xcall _writecom
	.dbline 64
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 65
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 66
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 67
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 68
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 69
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 70
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 71
; 	writecom(0x02);
	ldi R16,2
	xcall _writecom
	.dbline 72
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 73
; 	writecom(0x06);
	ldi R16,6
	xcall _writecom
	.dbline 74
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 75
; 	writecom(0x0c);
	ldi R16,12
	xcall _writecom
	.dbline 76
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 77
; 	writecom(0x38);	
	ldi R16,56
	xcall _writecom
	.dbline 78
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline -2
L48:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e writedata _writedata fV
;           data -> R10
	.even
_writedata::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 83
; }	
; 
; //写数据
; void	writedata(uchar data)
; {
	.dbline 84
; 	busy();
	xcall _busy
	.dbline 85
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 86
; 	PORTA|=(1<<RS);   //RS=1
	sbi 0x1b,5
	.dbline 87
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 88
; 	PORTA&=~(1<<RW);   //RW=0
	cbi 0x1b,6
	.dbline 89
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 90
; 	PORTA|=(1<<EN);    //EN=1
	sbi 0x1b,7
	.dbline 91
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 92
; 	PORTD = data;      //输出数据
	out 0x12,R10
	.dbline 93
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline 94
; 	PORTA&=~(1<<EN);   //EN=0
	cbi 0x1b,7
	.dbline 95
; 	s_ms(500);
	ldi R16,500
	ldi R17,1
	xcall _s_ms
	.dbline -2
L49:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r data 10 c
	.dbend
	.dbfunc e readdata _readdata fc

⌨️ 快捷键说明

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