📄 1820.lst
字号:
(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 + -