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

📄 1820.lst

📁 基于ATMEGA16的温度传感器原代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0223) 	    WR_dat(' ');
    02BC E200      LDI	R16,0x20
    02BD DF08      RCALL	_WR_dat
(0224) 	}
    02BE C002      RJMP	0x02C1
(0225) 	else
(0226) 	{
(0227) 	    WR_dat('-');
    02BF E20D      LDI	R16,0x2D
    02C0 DF05      RCALL	_WR_dat
(0228) 	}
(0229) 	WR_dat(JD[number]);
    02C1 E681      LDI	R24,0x61
    02C2 E090      LDI	R25,0
    02C3 81EC      LDD	R30,Y+4
    02C4 27FF      CLR	R31
    02C5 0FE8      ADD	R30,R24
    02C6 1FF9      ADC	R31,R25
    02C7 8100      LDD	R16,Z+0
    02C8 DEFD      RCALL	_WR_dat
    02C9 940E0446  CALL	pop_gset2
    02CB 9508      RET
FILE: H:\bbi项目源程序\18b20温度传感器\LCD显示18B20\1820.c
(0001) /////////////////////////////////////////////////////////////
(0002) //  文件:DS18B20.C                                        //
(0003) //  环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4      //
(0004) //  硬件:ATMEGA16芯片                                     //
(0005) //  日期:2007年5月28日                                    //
(0006) //  功能:读取18B20温度,在数码管显示                      //
(0007) //  备注:                                                 //
(0008) /////////////////////////////////////////////////////////////
(0009) #include <iom16v.h>				//包含单片机型号头文件
(0010) #include <macros.h>				//包含"位"操作头文件
(0011) #include "delay.h"				//包含延时头文件
(0012) #include "AVR_XQV12.h"			//包含通用函数及宏定义头文件
(0013) #include "lcd.h"
(0014) /*******************************************************/
(0015) /******   函数名称: init_1820()                   ******/
(0016) /******   功    能: 复位18B20                     ******/
(0017) /******   参    数: 无                            ******/
(0018) /******   返回值  : 无                            ******/
(0019) /*******************************************************/
(0020) void init_1820(void) 
(0021) {
(0022) 	ddrt|=D0;		 					//设置端口输出
_init_1820:
    02CC 9A8F      SBI	0x11,7
(0023) 	port|=D0;							//输出一个脉冲
    02CD 9A97      SBI	0x12,7
(0024) 	port&=~D0;
    02CE 9897      CBI	0x12,7
(0025) 	delay_nus(500);      	  			//延时480us以上
    02CF EF04      LDI	R16,0xF4
    02D0 E011      LDI	R17,1
    02D1 DD92      RCALL	_delay_nus
(0026) 	port|=D0;							//输出一个脉冲
    02D2 9A97      SBI	0x12,7
(0027) 	ddrt&=~D0;
    02D3 988F      CBI	0x11,7
(0028) 	delay_nus(30);     		  			//15~60us
    02D4 E10E      LDI	R16,0x1E
    02D5 E010      LDI	R17,0
    02D6 DD8D      RCALL	_delay_nus
(0029) 	while(pin&D0); 						//等待应答
    02D7 9987      SBIC	0x10,7
    02D8 CFFE      RJMP	0x02D7
(0030)     ddrt|=D0; 							//设置输出
    02D9 9A8F      SBI	0x11,7
(0031)     port|=D0; 							//输出高电平
    02DA 9A97      SBI	0x12,7
(0032)     delay_nus(80);    		  			//60~240us 
    02DB E500      LDI	R16,0x50
    02DC E010      LDI	R17,0
    02DD DD86      RCALL	_delay_nus
    02DE 9508      RET
_write_1820:
  m                    --> R20
  x                    --> R22
    02DF 940E0452  CALL	push_gset2
    02E1 2F60      MOV	R22,R16
(0033) }
(0034) /*******************************************************/
(0035) /******   函数名称: write_1820()                  ******/
(0036) /******   功    能: 写18B20                       ******/
(0037) /******   参    数: x--要写的数据                 ******/
(0038) /******   返回值  : 无                            ******/
(0039) /*******************************************************/
(0040) void write_1820(unsigned char x) 
(0041) {
(0042)  	unsigned char m;
(0043) 	for(m=0;m<8;m++) 
    02E2 2744      CLR	R20
    02E3 C010      RJMP	0x02F4
(0044)     {
(0045) 	 	port&=~D0;	 	 	  	 		//写数据,从低位开始
    02E4 9897      CBI	0x12,7
(0046) 		if(x&(1<<m))					//判断数据极性
    02E5 E001      LDI	R16,1
    02E6 2F14      MOV	R17,R20
    02E7 940E0488  CALL	lsl8
    02E9 2E26      MOV	R2,R22
    02EA 2220      AND	R2,R16
    02EB F011      BEQ	0x02EE
(0047) 		port|=D0;
    02EC 9A97      SBI	0x12,7
    02ED C001      RJMP	0x02EF
(0048) 		else
(0049) 		port&=~D0;
    02EE 9897      CBI	0x12,7
(0050) 		delay_nus(30);     				 //延时15~60us
    02EF E10E      LDI	R16,0x1E
    02F0 E010      LDI	R17,0
    02F1 DD72      RCALL	_delay_nus
(0051) 		port|=D0;						 
    02F2 9A97      SBI	0x12,7
    02F3 9543      INC	R20
    02F4 3048      CPI	R20,0x8
    02F5 F370      BCS	0x02E4
(0052)     } 
(0053)     port|=D0; 							 //结束写数据,置高总线
    02F6 9A97      SBI	0x12,7
    02F7 940E0446  CALL	pop_gset2
    02F9 9508      RET
_read_1820:
  temp                 --> R20
  k                    --> R22
  n                    --> R10
    02FA 940E0450  CALL	push_gset3
(0054) } 
(0055) /*******************************************************/
(0056) /******   函数名称: read_1820()                   ******/
(0057) /******   功    能: 读18B20                       ******/
(0058) /******   参    数: 无                            ******/
(0059) /******   返回值  : 读取的数据                    ******/
(0060) /*******************************************************/
(0061) unsigned char read_1820(void) 
(0062) {     
(0063)     unsigned char temp=0,k,n; 
    02FC 2744      CLR	R20
(0064)     for(n=0;n<8;n++) 
    02FD 24AA      CLR	R10
    02FE C018      RJMP	0x0317
(0065)     { 
(0066) 		port&=~D0;	 		  			//输出一个起始脉冲
    02FF 9897      CBI	0x12,7
(0067)     	port|=D0;
    0300 9A97      SBI	0x12,7
(0068) 		ddrt&=~D0;						//设端口为输入
    0301 988F      CBI	0x11,7
(0069) 		k=(pin&D0);      		 		//读数据,从低位开始 
    0302 B360      IN	R22,0x10
    0303 7860      ANDI	R22,0x80
(0070) 		if(k)							//判断数据极性
    0304 F031      BEQ	0x030B
(0071) 		temp|=(1<<n);
    0305 E001      LDI	R16,1
    0306 2D1A      MOV	R17,R10
    0307 940E0488  CALL	lsl8
    0309 2B40      OR	R20,R16
    030A C007      RJMP	0x0312
(0072) 		else
(0073) 		temp&=~(1<<n);
    030B E001      LDI	R16,1
    030C 2D1A      MOV	R17,R10
    030D 940E0488  CALL	lsl8
    030F 2E20      MOV	R2,R16
    0310 9420      COM	R2
    0311 2142      AND	R20,R2
(0074) 		delay_nus(50); 	  				 //延时60~120us
    0312 E302      LDI	R16,0x32
    0313 E010      LDI	R17,0
    0314 DD4F      RCALL	_delay_nus
(0075) 		ddrt|=D0;						 //设端口为输出
    0315 9A8F      SBI	0x11,7
    0316 94A3      INC	R10
    0317 2D8A      MOV	R24,R10
    0318 3088      CPI	R24,0x8
    0319 F328      BCS	0x02FF
(0076) 	}
(0077) 	return (temp);						 //返回读出的数据
    031A 2F04      MOV	R16,R20
    031B 940E0449  CALL	pop_gset3
    031D 9508      RET
_Read_1820_temprter:
  teml                 --> R20
  temh                 --> R22
  count                --> R20
    031E 940E0452  CALL	push_gset2
    0320 9724      SBIW	R28,4
(0078) }
(0079) /*******************************************************/
(0080) /******   函数名称: Read_1820_temprter()          ******/
(0081) /******   功    能: 读取18B20温度                 ******/
(0082) /******   参    数: 无                            ******/
(0083) /******   返回值  : 读取的温度数据                ******/
(0084) /*******************************************************/
(0085) unsigned int Read_1820_temprter(void)
(0086) {
(0087)  	unsigned int count;
(0088) 	unsigned char temh,teml; 
(0089)  	init_1820();        	   		 //复位18b20
    0321 DFAA      RCALL	_init_1820
(0090) 	write_1820(0xcc);   			 //发出转换命令
    0322 EC0C      LDI	R16,0xCC
    0323 DFBB      RCALL	_write_1820
(0091) 	write_1820(0x44);
    0324 E404      LDI	R16,0x44
    0325 DFB9      RCALL	_write_1820
(0092) 	delay_nus(400);
    0326 E900      LDI	R16,0x90
    0327 E011      LDI	R17,1
    0328 DD3B      RCALL	_delay_nus
(0093) 	init_1820();
    0329 DFA2      RCALL	_init_1820
(0094) 	write_1820(0xcc);  				 //发出读命令
    032A EC0C      LDI	R16,0xCC
    032B DFB3      RCALL	_write_1820
(0095) 	write_1820(0xbe);
    032C EB0E      LDI	R16,0xBE
    032D DFB1      RCALL	_write_1820
(0096) 	teml=read_1820();  				 //读数据
    032E DFCB      RCALL	_read_1820
    032F 2F40      MOV	R20,R16
(0097) 	temh=read_1820();
    0330 DFC9      RCALL	_read_1820
    0331 2F60      MOV	R22,R16
(0098) 	count=(temh*256+teml)*6.25;  	 //计算具体温度
    0332 E60A      LDI	R16,0x6A
    0333 E010      LDI	R17,0
    0334 940E0474  CALL	lpm32
    0336 933A      ST	R19,-Y
    0337 932A      ST	R18,-Y
    0338 931A      ST	R17,-Y
    0339 930A      ST	R16,-Y
    033A 2F26      MOV	R18,R22
    033B 2733      CLR	R19
    033C E000      LDI	R16,0
    033D E011      LDI	R17,1
    033E 940E0436  CALL	empy16s
    0340 0118      MOVW	R2,R16
    0341 2E44      MOV	R4,R20
    0342 2455      CLR	R5
    0343 0C24      ADD	R2,R4
    0344 1C35      ADC	R3,R5
    0345 0181      MOVW	R16,R2
    0346 940E04D6  CALL	int2fp
    0348 933A      ST	R19,-Y
    0349 932A      ST	R18,-Y
    034A 931A      ST	R17,-Y
    034B 930A      ST	R16,-Y
    034C 940E05C5  CALL	empy32f
    034E 01FE      MOVW	R30,R28
    034F 8300      STD	Z+0,R16
    0350 8311      STD	Z+1,R17
    0351 8322      STD	Z+2,R18
    0352 8333      STD	Z+3,R19
    0353 01FE      MOVW	R30,R28
    0354 8020      LDD	R2,Z+0
    0355 8031      LDD	R3,Z+1
    0356 8042      LDD	R4,Z+2
    0357 8053      LDD	R5,Z+3
    0358 925A      ST	R5,-Y
    0359 924A      ST	R4,-Y
    035A 923A      ST	R3,-Y
    035B 922A      ST	R2,-Y
    035C E606      LDI	R16,0x66
    035D E010      LDI	R17,0
    035E 940E0474  CALL	lpm32
    0360 933A      ST	R19,-Y
    0361 932A      ST	R18,-Y
    0362 931A      ST	R17,-Y
    0363 930A      ST	R16,-Y
    0364 940E0591  CALL	cmp32f
    0366 F0CC      BLT	0x0380
    0367 01FE      MOVW	R30,R28
    0368 8020      LDD	R2,Z+0
    0369 8031      LDD	R3,Z+1
    036A 8042      LDD	R4,Z+2
    036B 8053      LDD	R5,Z+3
    036C 925A      ST	R5,-Y
    036D 924A      ST	R4,-Y
    036E 923A      ST	R3,-Y
    036F 922A      ST	R2,-Y
    0370 E606      LDI	R16,0x66
    0371 E010      LDI	R17,0
    0372 940E0474  CALL	lpm32
    0374 933A      ST	R19,-Y
    0375 932A      ST	R18,-Y
    0376 931A      ST	R17,-Y
    0377 930A      ST	R16,-Y
    0378 940E053B  CALL	sub32f
    037A 940E048E  CALL	fp2int
    037C 01B8      MOVW	R22,R16
    037D 5060      SUBI	R22,0
    037E 4870      SBCI	R23,0x80
    037F C008      RJMP	0x0388
    0380 01FE      MOVW	R30,R28
    0381 8100      LDD	R16,Z+0
    0382 8111      LDD	R17,Z+1
    0383 8122      LDD	R18,Z+2
    0384 8133      LDD	R19,Z+3
    0385 940E048E  CALL	fp2int
    0387 01B8      MOVW	R22,R16
    0388 01AB      MOVW	R20,R22
(0099) 	return count;					 //返回温度数据
    0389 018A      MOVW	R16,R20
    038A 9624      ADIW	R28,4
    038B 940E0446  CALL	pop_gset2
    038D 9508      RET
_main:
  tem                  --> Y+3
    038E 9722      SBIW	R28,2
(0100) }
(0101) /*******************************************************/
(0102) /******   函数名称: main()                        ******/
(0103) /******   功    能: 读取18B20温度,在数码管显示   ******/
(0104) /******   参    数: 无                            ******/
(0105) /******   返回值  : 无                            ******/
(0106) /*******************************************************/
(0107) void main(void)
(0108) {unsigned int tem;
(0109) 	CPU_Init();	  							//初始化单片机
    038F DDF3      RCALL	_CPU_Init
    0390 C069      RJMP	0x03FA
(0110) 	while(1)								//无限循环
(0111) 	{
(0112) 		temprter=Read_1820_temprter();		//读取温度
    0391 DF8C      RCALL	_Read_1820_temprter
    0392 93100070  STS	temprter+1,R17
    0394 9300006F  STS	temprter,R16
(0113) 		
(0114)             Lcd_INT();                      //初始化液晶屏
    0396 DEBF      RCALL	_Lcd_INT
(0115) 			lcd_clear();                    //清屏
    0397 DE5B      RCALL	_lcd_clear
(0116) 			
(0117) 			 lcd_write2(2,1,temprter%10000/1000);  //显示温度的十位
    0398 E120      LDI	R18,0x10
    0399 E237      LDI	R19,0x27
    039A 9100006F  LDS	R16,temprter
    039C 91100070  LDS	R17,temprter+1
    039E 940E0402  CALL	mod16u
    03A0 EE28      LDI	R18,0xE8
    03A1 E033      LDI	R19,3
    03A2 940E0404  CALL	div16u
    03A4 8319      STD	Y+1,R17
    03A5 8308      STD	Y+0,R16
    03A6 E021      LDI	R18,1
    03A7 E002      LDI	R16,2
    03A8 DEC1      RCALL	_lcd_write2
(0118)              lcd_write2(2,2,temprter%10000%1000/100); //显示温度的个位
    03A9 E120      LDI	R18,0x10
    03AA E237      LDI	R19,0x27
    03AB 9100006F  LDS	R16,temprter
    03AD 91100070  LDS	R17,temprter+1
    03AF 940E0402  CALL	mod16u
    03B1 EE28      LDI	R18,0xE8
    03B2 E033      LDI	R19,3
    03B3 940E0402  CALL	mod16u
    03B5 E624      LDI	R18,0x64
    03B6 E030      LDI	R19,0
    03B7 940E0404  CALL	div16u
    03B9 8319      STD	Y+1,R17
    03BA 8308      STD	Y+0,R16
    03BB E022      LDI	R18,2
    03BC E002      LDI	R16,2
    03BD DEAC      RCALL	_lcd_write2
(0119) 			  
(0120) 			
(0121) 			LCD_Write_string(2,3,".");	
    03BE E68C      LDI	R24,0x6C
    03BF E090      LDI	R25,0
    03C0 8399      STD	Y+1,R25
    03C1 8388      STD	Y+0,R24
    03C2 E023      LDI	R18,3
    03C3 E002      LDI	R16,2
    03C4 DE67      RCALL	_LCD_Write_string
(0122)            //lcd_write2(2,4,5); 
(0123)             lcd_write2(2,4,temprter%10000%1000%100/10); 	//显示小数点后一位
    03C5 E120      LDI	R18,0x10
    03C6 E237      LDI	R19,0x27
    03C7 9100006F  LDS	R16,temprter
    03C9 91100070  LDS	R17,temprter+1
    03CB 940E0402  CALL	mod16u
    03CD EE28      LDI	R18,0xE8
    03CE E033      LDI	R19,3
    03CF 940E0402  CALL	mod16u
    03D1 E624      LDI	R18,0x64
    03D2 E030      LDI	R19,0
    03D3 940E0402  CALL	mod16u
    03D5 E02A      LDI	R18,0xA

⌨️ 快捷键说明

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