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

📄 1820.s

📁 基于ATMEGA16的温度传感器原代码
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module _1820.c
	.area text(rom, con, rel)
	.dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/delay.h
	.dbfunc e delay_nus _delay_nus fV
;           time -> R16,R17
	.even
_delay_nus::
	.dbline -1
	.dbline 33
; /////////////////////////////////////////////////////////////
; //  文件:DS18B20.C                                        //
; //  环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4      //
; //  硬件:ATMEGA16芯片                                     //
; //  日期:2007年5月28日                                    //
; //  功能:读取18B20温度,在数码管显示                      //
; //  备注:                                                 //
; /////////////////////////////////////////////////////////////
; #include <iom16v.h>				//包含单片机型号头文件
; #include <macros.h>				//包含"位"操作头文件
; #include "delay.h"				//包含延时头文件
; #include "AVR_XQV12.h"			//包含通用函数及宏定义头文件
; #include "lcd.h"
; /*******************************************************/
; /******   函数名称: init_1820()                   ******/
; /******   功    能: 复位18B20                     ******/
; /******   参    数: 无                            ******/
; /******   返回值  : 无                            ******/
; /*******************************************************/
; void init_1820(void) 
; {
; 	ddrt|=D0;		 					//设置端口输出
; 	port|=D0;							//输出一个脉冲
; 	port&=~D0;
; 	delay_nus(500);      	  			//延时480us以上
; 	port|=D0;							//输出一个脉冲
; 	ddrt&=~D0;
; 	delay_nus(30);     		  			//15~60us
; 	while(pin&D0); 						//等待应答
;     ddrt|=D0; 							//设置输出
;     port|=D0; 							//输出高电平
;     delay_nus(80);    		  			//60~240us 
; }
	xjmp L3
L2:
	.dbline 35
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 37
	subi R16,1
	sbci R17,0
	.dbline 38
L3:
	.dbline 34
; /*******************************************************/
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r time 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;           time -> R16,R17
	.even
_delay_nms::
	xcall push_gset1
	.dbline -1
	.dbline 41
; /******   函数名称: write_1820()                  ******/
; /******   功    能: 写18B20                       ******/
; /******   参    数: x--要写的数据                 ******/
; /******   返回值  : 无                            ******/
; /*******************************************************/
; void write_1820(unsigned char x) 
; {
	xjmp L7
L6:
	.dbline 44
;  	unsigned char m;
; 	for(m=0;m<8;m++) 
;     {
	.dbline 45
	clr R20
	clr R21
	xjmp L12
L9:
	.dbline 45
L10:
	.dbline 45
	subi R20,255  ; offset = 1
	sbci R21,255
L12:
	.dbline 45
	cpi R20,44
	ldi R30,6
	cpc R21,R30
	brlo L9
	.dbline 46
	subi R16,1
	sbci R17,0
	.dbline 47
L7:
	.dbline 43
	cpi R16,0
	cpc R16,R17
	brne L6
X1:
	.dbline -2
L5:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r time 16 i
	.dbend
	.area code(ram, con, rel)
	.dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/delay.h
	.area lit(rom, con, rel)
_SMG_Conver::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.byte 'w,124
	.byte 57,94
	.byte 'y,'q
	.byte 0,64
	.dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/AVR_XQV12.h
	.dbsym e SMG_Conver _SMG_Conver A[18:18]kc
	.area data(ram, con, rel)
	.dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/AVR_XQV12.h
	.area text(rom, con, rel)
	.dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/AVR_XQV12.h
	.dbfunc e Scan_Key _Scan_Key fc
;              i -> R20
	.even
_Scan_Key::
	xcall push_gset1
	.dbline -1
	.dbline 69
; 	 	port&=~D0;	 	 	  	 		//写数据,从低位开始
; 		if(x&(1<<m))					//判断数据极性
; 		port|=D0;
; 		else
; 		port&=~D0;
; 		delay_nus(30);     				 //延时15~60us
; 		port|=D0;						 
;     } 
;     port|=D0; 							 //结束写数据,置高总线
; } 
; /*******************************************************/
; /******   函数名称: read_1820()                   ******/
; /******   功    能: 读18B20                       ******/
; /******   参    数: 无                            ******/
; /******   返回值  : 读取的数据                    ******/
; /*******************************************************/
; unsigned char read_1820(void) 
; {     
;     unsigned char temp=0,k,n; 
;     for(n=0;n<8;n++) 
;     { 
; 		port&=~D0;	 		  			//输出一个起始脉冲
;     	port|=D0;
; 		ddrt&=~D0;						//设端口为输入
; 		k=(pin&D0);      		 		//读数据,从低位开始 
	.dbline 71
; 		if(k)							//判断数据极性
; 		temp|=(1<<n);
	clr R2
	out 0x15,R2
	.dbline 72
; 		else
	ldi R24,240
	out 0x14,R24
	.dbline 73
; 		temp&=~(1<<n);
	ldi R24,15
	out 0x15,R24
	.dbline 74
; 		delay_nus(50); 	  				 //延时60~120us
	ldi R16,1
	ldi R17,0
	xcall _delay_nus
	.dbline 75
; 		ddrt|=D0;						 //设端口为输出
	in R20,0x13
	andi R20,15
	.dbline 76
; 	}
	cpi R20,15
	breq L14
	.dbline 77
; 	return (temp);						 //返回读出的数据
	.dbline 78
; }
	clr R2
	out 0x15,R2
	.dbline 79
; /*******************************************************/
	ldi R24,15
	out 0x14,R24
	.dbline 80
; /******   函数名称: Read_1820_temprter()          ******/
	ldi R24,240
	out 0x15,R24
	.dbline 81
; /******   功    能: 读取18B20温度                 ******/
	ldi R16,10
	ldi R17,0
	xcall _delay_nus
	.dbline 82
; /******   参    数: 无                            ******/
	in R24,0x13
	andi R24,240
	cpi R24,240
	breq L16
	.dbline 83
; /******   返回值  : 读取的温度数据                ******/
	.dbline 84
; /*******************************************************/
	in R24,0x13
	andi R24,240
	add R20,R24
L18:
	.dbline 85
L19:
	.dbline 85
; unsigned int Read_1820_temprter(void)
	in R24,0x13
	andi R24,240
	cpi R24,240
	brne L18
	.dbline 86
; {
	mov R16,R20
	xjmp L13
L16:
	.dbline 88
;  	unsigned int count;
; 	unsigned char temh,teml; 
L14:
	.dbline 89
;  	init_1820();        	   		 //复位18b20
	clr R16
	.dbline -2
L13:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e Key_Num _Key_Num fc
;            key -> R16
	.even
_Key_Num::
	xcall push_gset1
	.dbline -1
	.dbline 99
; 	write_1820(0xcc);   			 //发出转换命令
; 	write_1820(0x44);
; 	delay_nus(400);
; 	init_1820();
; 	write_1820(0xcc);  				 //发出读命令
; 	write_1820(0xbe);
; 	teml=read_1820();  				 //读数据
; 	temh=read_1820();
; 	count=(temh*256+teml)*6.25;  	 //计算具体温度
; 	return count;					 //返回温度数据
	.dbline 100
; }
	mov R20,R16
	clr R21
	cpi R20,183
	ldi R30,0
	cpc R21,R30
	brne X3
	xjmp L27
X3:
	cpi R20,187
	ldi R30,0
	cpc R21,R30
	brne X4
	xjmp L31
X4:
	cpi R20,189
	ldi R30,0
	cpc R21,R30
	brne X5
	xjmp L35
X5:
	cpi R20,190
	ldi R30,0
	cpc R21,R30
	brne X6
	xjmp L39
X6:
	ldi R24,190
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L42
L41:
	cpi R20,119
	ldi R30,0
	cpc R21,R30
	brne X7
	xjmp L28
X7:
	cpi R20,123
	ldi R30,0
	cpc R21,R30
	brne X8
	xjmp L32
X8:
	cpi R20,125
	ldi R30,0
	cpc R21,R30
	brne X9
	xjmp L36
X9:
	cpi R20,126
	ldi R30,0
	cpc R21,R30
	brne X10
	xjmp L40
X10:
	xjmp L22
L42:
	cpi R20,215
	ldi R30,0
	cpc R21,R30
	breq L26
	cpi R20,219
	ldi R30,0
	cpc R21,R30
	breq L30
	cpi R20,221
	ldi R30,0
	cpc R21,R30
	breq L34
	cpi R20,222
	ldi R30,0
	cpc R21,R30
	brne X11
	xjmp L38
X11:
	cpi R20,215
	ldi R30,0
	cpc R21,R30
	brge X12
	xjmp L22
X12:
L43:
	cpi R20,231
	ldi R30,0
	cpc R21,R30
	breq L25
	cpi R20,235
	ldi R30,0
	cpc R21,R30
	breq L29
	cpi R20,237
	ldi R30,0
	cpc R21,R30
	breq L33
	cpi R20,238
	ldi R30,0
	cpc R21,R30
	breq L37
	xjmp L22
X2:
	.dbline 101
; /*******************************************************/
L25:
	.dbline 102
; /******   函数名称: main()                        ******/
	clr R16
	xjmp L21
L26:
	.dbline 103
; /******   功    能: 读取18B20温度,在数码管显示   ******/
	ldi R16,1
	xjmp L21
L27:
	.dbline 104
; /******   参    数: 无                            ******/
	ldi R16,2
	xjmp L21
L28:
	.dbline 105
; /******   返回值  : 无                            ******/
	ldi R16,3
	xjmp L21
L29:
	.dbline 106
; /*******************************************************/
	ldi R16,4
	xjmp L21
L30:
	.dbline 107
; void main(void)
	ldi R16,5
	xjmp L21
L31:
	.dbline 108
; {unsigned int tem;
	ldi R16,6
	xjmp L21
L32:
	.dbline 109
; 	CPU_Init();	  							//初始化单片机
	ldi R16,7
	xjmp L21
L33:
	.dbline 110
; 	while(1)								//无限循环
	ldi R16,8
	xjmp L21
L34:
	.dbline 111
; 	{
	ldi R16,9
	xjmp L21
L35:
	.dbline 112
; 		temprter=Read_1820_temprter();		//读取温度
	ldi R16,10
	xjmp L21
L36:
	.dbline 113
; 		
	ldi R16,11
	xjmp L21
L37:
	.dbline 114
;             Lcd_INT();                      //初始化液晶屏
	ldi R16,12
	xjmp L21
L38:
	.dbline 115
; 			lcd_clear();                    //清屏
	ldi R16,13
	xjmp L21
L39:
	.dbline 116
; 			
	ldi R16,14
	xjmp L21
L40:
	.dbline 117
; 			 lcd_write2(2,1,temprter%10000/1000);  //显示温度的十位
	ldi R16,15
	xjmp L21
L22:
	.dbline 118
;              lcd_write2(2,2,temprter%10000%1000/100); //显示温度的个位
	ldi R16,16
	.dbline -2
L21:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r key 16 c
	.dbend
	.dbfunc e Display_One_SMG _Display_One_SMG fV
;           data -> R22
;            bit -> R20
	.even
_Display_One_SMG::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 129
; 			  
; 			
; 			LCD_Write_string(2,3,".");	
;            //lcd_write2(2,4,5); 
;             lcd_write2(2,4,temprter%10000%1000%100/10); 	//显示小数点后一位
; 	        lcd_write2(2,5,temprter%10000%1000%100%10); //显示小数点后两位
; 		delay_nms(500);		
; 						
; 											
; 											
; 	} 
	.dbline 130
; }
	ldi R24,<_SMG_Conver
	ldi R25,>_SMG_Conver
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x18,R30
	.dbline 131
; }
	sbi 0x1b,3
	.dbline 132
; }
	cbi 0x1b,3
	.dbline 133
; }
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	out 0x18,R2
	.dbline 134
; }
	sbi 0x1b,2
	.dbline 135
; }
	cbi 0x1b,2
	.dbline 136
; }
	ldi R16,2
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L44:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 22 c
	.dbsym r bit 20 c
	.dbend
	.dbfunc e Display_One_SMG_Point _Display_One_SMG_Point fV
;            bit -> R20
	.even
_Display_One_SMG_Point::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 144
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 145
; }
	ldi R24,128
	out 0x18,R24
	.dbline 146
; }
	sbi 0x1b,3
	.dbline 147
; }
	cbi 0x1b,3
	.dbline 148
; }
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	out 0x18,R2
	.dbline 149
; }
	sbi 0x1b,2
	.dbline 150
; }
	cbi 0x1b,2
	.dbline 151
; }
	ldi R16,2
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L45:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r bit 20 c
	.dbend
	.dbfunc e En_Led _En_Led fV
	.even
_En_Led::
	.dbline -1
	.dbline 160
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 161
; }
	ldi R24,255
	out 0x17,R24
	.dbline 162
; }
	out 0x18,R24
	.dbline 163
; }
	sbi 0x1b,4
	.dbline -2
L46:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Un_Led _Un_Led fV
	.even
_Un_Led::
	.dbline -1
	.dbline 172
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 173
; }
	ldi R24,255
	out 0x17,R24
	.dbline 174
; }
	out 0x18,R24

⌨️ 快捷键说明

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