📄 1820.lis
字号:
.module _1820.c
.area text(rom, con, rel)
0000 .dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/delay.h
0000 .dbfunc e delay_nus _delay_nus fV
0000 ; time -> R16,R17
.even
0000 _delay_nus::
0000 .dbline -1
0000 .dbline 33
0000 ; /////////////////////////////////////////////////////////////
0000 ; // 文件:DS18B20.C //
0000 ; // 环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4 //
0000 ; // 硬件:ATMEGA16芯片 //
0000 ; // 日期:2007年5月28日 //
0000 ; // 功能:读取18B20温度,在数码管显示 //
0000 ; // 备注: //
0000 ; /////////////////////////////////////////////////////////////
0000 ; #include <iom16v.h> //包含单片机型号头文件
0000 ; #include <macros.h> //包含"位"操作头文件
0000 ; #include "delay.h" //包含延时头文件
0000 ; #include "AVR_XQV12.h" //包含通用函数及宏定义头文件
0000 ; #include "lcd.h"
0000 ; /*******************************************************/
0000 ; /****** 函数名称: init_1820() ******/
0000 ; /****** 功 能: 复位18B20 ******/
0000 ; /****** 参 数: 无 ******/
0000 ; /****** 返回值 : 无 ******/
0000 ; /*******************************************************/
0000 ; void init_1820(void)
0000 ; {
0000 ; ddrt|=D0; //设置端口输出
0000 ; port|=D0; //输出一个脉冲
0000 ; port&=~D0;
0000 ; delay_nus(500); //延时480us以上
0000 ; port|=D0; //输出一个脉冲
0000 ; ddrt&=~D0;
0000 ; delay_nus(30); //15~60us
0000 ; while(pin&D0); //等待应答
0000 ; ddrt|=D0; //设置输出
0000 ; port|=D0; //输出高电平
0000 ; delay_nus(80); //60~240us
0000 ; }
0000 09C0 xjmp L3
0002 L2:
0002 .dbline 35
0002 .dbline 36
0002 0000 nop
0004 .dbline 36
0004 0000 nop
0006 .dbline 36
0006 0000 nop
0008 .dbline 36
0008 0000 nop
000A .dbline 36
000A 0000 nop
000C .dbline 36
000C 0000 nop
000E .dbline 36
000E 0000 nop
0010 .dbline 37
0010 0150 subi R16,1
0012 1040 sbci R17,0
0014 .dbline 38
0014 L3:
0014 .dbline 34
0014 ; /*******************************************************/
0014 0030 cpi R16,0
0016 0107 cpc R16,R17
0018 A1F7 brne L2
001A X0:
001A .dbline -2
001A L1:
001A .dbline 0 ; func end
001A 0895 ret
001C .dbsym r time 16 i
001C .dbend
001C .dbfunc e delay_nms _delay_nms fV
001C ; i -> R20,R21
001C ; time -> R16,R17
.even
001C _delay_nms::
001C 0E940000 xcall push_gset1
0020 .dbline -1
0020 .dbline 41
0020 ; /****** 函数名称: write_1820() ******/
0020 ; /****** 功 能: 写18B20 ******/
0020 ; /****** 参 数: x--要写的数据 ******/
0020 ; /****** 返回值 : 无 ******/
0020 ; /*******************************************************/
0020 ; void write_1820(unsigned char x)
0020 ; {
0020 0BC0 xjmp L7
0022 L6:
0022 .dbline 44
0022 ; unsigned char m;
0022 ; for(m=0;m<8;m++)
0022 ; {
0022 .dbline 45
0022 4427 clr R20
0024 5527 clr R21
0026 02C0 xjmp L12
0028 L9:
0028 .dbline 45
0028 L10:
0028 .dbline 45
0028 4F5F subi R20,255 ; offset = 1
002A 5F4F sbci R21,255
002C L12:
002C .dbline 45
002C 4C32 cpi R20,44
002E E6E0 ldi R30,6
0030 5E07 cpc R21,R30
0032 D0F3 brlo L9
0034 .dbline 46
0034 0150 subi R16,1
0036 1040 sbci R17,0
0038 .dbline 47
0038 L7:
0038 .dbline 43
0038 0030 cpi R16,0
003A 0107 cpc R16,R17
003C 91F7 brne L6
003E X1:
003E .dbline -2
003E L5:
003E 0E940000 xcall pop_gset1
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbsym r i 20 i
0044 .dbsym r time 16 i
0044 .dbend
.area code(ram, con, rel)
0000 .dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/delay.h
.area lit(rom, con, rel)
0000 _SMG_Conver::
0000 3F06 .byte 63,6
0002 5B4F .byte 91,'O
0004 666D .byte 'f,'m
0006 7D07 .byte 125,7
0008 7F6F .byte 127,'o
000A 777C .byte 'w,124
000C 395E .byte 57,94
000E 7971 .byte 'y,'q
0010 0040 .byte 0,64
0012 .dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/AVR_XQV12.h
0012 .dbsym e SMG_Conver _SMG_Conver A[18:18]kc
.area data(ram, con, rel)
0000 .dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/AVR_XQV12.h
.area text(rom, con, rel)
0044 .dbfile H:\bbi项目源程序\18b20温度传感器\LCD显示18B20/AVR_XQV12.h
0044 .dbfunc e Scan_Key _Scan_Key fc
0044 ; i -> R20
.even
0044 _Scan_Key::
0044 0E940000 xcall push_gset1
0048 .dbline -1
0048 .dbline 69
0048 ; port&=~D0; //写数据,从低位开始
0048 ; if(x&(1<<m)) //判断数据极性
0048 ; port|=D0;
0048 ; else
0048 ; port&=~D0;
0048 ; delay_nus(30); //延时15~60us
0048 ; port|=D0;
0048 ; }
0048 ; port|=D0; //结束写数据,置高总线
0048 ; }
0048 ; /*******************************************************/
0048 ; /****** 函数名称: read_1820() ******/
0048 ; /****** 功 能: 读18B20 ******/
0048 ; /****** 参 数: 无 ******/
0048 ; /****** 返回值 : 读取的数据 ******/
0048 ; /*******************************************************/
0048 ; unsigned char read_1820(void)
0048 ; {
0048 ; unsigned char temp=0,k,n;
0048 ; for(n=0;n<8;n++)
0048 ; {
0048 ; port&=~D0; //输出一个起始脉冲
0048 ; port|=D0;
0048 ; ddrt&=~D0; //设端口为输入
0048 ; k=(pin&D0); //读数据,从低位开始
0048 .dbline 71
0048 ; if(k) //判断数据极性
0048 ; temp|=(1<<n);
0048 2224 clr R2
004A 25BA out 0x15,R2
004C .dbline 72
004C ; else
004C 80EF ldi R24,240
004E 84BB out 0x14,R24
0050 .dbline 73
0050 ; temp&=~(1<<n);
0050 8FE0 ldi R24,15
0052 85BB out 0x15,R24
0054 .dbline 74
0054 ; delay_nus(50); //延时60~120us
0054 01E0 ldi R16,1
0056 10E0 ldi R17,0
0058 D3DF xcall _delay_nus
005A .dbline 75
005A ; ddrt|=D0; //设端口为输出
005A 43B3 in R20,0x13
005C 4F70 andi R20,15
005E .dbline 76
005E ; }
005E 4F30 cpi R20,15
0060 B1F0 breq L14
0062 .dbline 77
0062 ; return (temp); //返回读出的数据
0062 .dbline 78
0062 ; }
0062 2224 clr R2
0064 25BA out 0x15,R2
0066 .dbline 79
0066 ; /*******************************************************/
0066 8FE0 ldi R24,15
0068 84BB out 0x14,R24
006A .dbline 80
006A ; /****** 函数名称: Read_1820_temprter() ******/
006A 80EF ldi R24,240
006C 85BB out 0x15,R24
006E .dbline 81
006E ; /****** 功 能: 读取18B20温度 ******/
006E 0AE0 ldi R16,10
0070 10E0 ldi R17,0
0072 C6DF xcall _delay_nus
0074 .dbline 82
0074 ; /****** 参 数: 无 ******/
0074 83B3 in R24,0x13
0076 807F andi R24,240
0078 803F cpi R24,240
007A 49F0 breq L16
007C .dbline 83
007C ; /****** 返回值 : 读取的温度数据 ******/
007C .dbline 84
007C ; /*******************************************************/
007C 83B3 in R24,0x13
007E 807F andi R24,240
0080 480F add R20,R24
0082 L18:
0082 .dbline 85
0082 L19:
0082 .dbline 85
0082 ; unsigned int Read_1820_temprter(void)
0082 83B3 in R24,0x13
0084 807F andi R24,240
0086 803F cpi R24,240
0088 E1F7 brne L18
008A .dbline 86
008A ; {
008A 042F mov R16,R20
008C 01C0 xjmp L13
008E L16:
008E .dbline 88
008E ; unsigned int count;
008E ; unsigned char temh,teml;
008E L14:
008E .dbline 89
008E ; init_1820(); //复位18b20
008E 0027 clr R16
0090 .dbline -2
0090 L13:
0090 0E940000 xcall pop_gset1
0094 .dbline 0 ; func end
0094 0895 ret
0096 .dbsym r i 20 c
0096 .dbend
0096 .dbfunc e Key_Num _Key_Num fc
0096 ; key -> R16
.even
0096 _Key_Num::
0096 0E940000 xcall push_gset1
009A .dbline -1
009A .dbline 99
009A ; write_1820(0xcc); //发出转换命令
009A ; write_1820(0x44);
009A ; delay_nus(400);
009A ; init_1820();
009A ; write_1820(0xcc); //发出读命令
009A ; write_1820(0xbe);
009A ; teml=read_1820(); //读数据
009A ; temh=read_1820();
009A ; count=(temh*256+teml)*6.25; //计算具体温度
009A ; return count; //返回温度数据
009A .dbline 100
009A ; }
009A 402F mov R20,R16
009C 5527 clr R21
009E 473B cpi R20,183
00A0 E0E0 ldi R30,0
00A2 5E07 cpc R21,R30
00A4 09F4 brne X3
00A6 54C0 xjmp L27
00A8 X3:
00A8 4B3B cpi R20,187
00AA E0E0 ldi R30,0
00AC 5E07 cpc R21,R30
00AE 09F4 brne X4
00B0 57C0 xjmp L31
00B2 X4:
00B2 4D3B cpi R20,189
00B4 E0E0 ldi R30,0
00B6 5E07 cpc R21,R30
00B8 09F4 brne X5
00BA 5AC0 xjmp L35
00BC X5:
00BC 4E3B cpi R20,190
00BE E0E0 ldi R30,0
00C0 5E07 cpc R21,R30
00C2 09F4 brne X6
00C4 5DC0 xjmp L39
00C6 X6:
00C6 8EEB ldi R24,190
00C8 90E0 ldi R25,0
00CA 8417 cp R24,R20
00CC 9507 cpc R25,R21
00CE ACF0 brlt L42
00D0 L41:
00D0 4737 cpi R20,119
00D2 E0E0 ldi R30,0
00D4 5E07 cpc R21,R30
00D6 09F4 brne X7
00D8 3DC0 xjmp L28
00DA X7:
00DA 4B37 cpi R20,123
00DC E0E0 ldi R30,0
00DE 5E07 cpc R21,R30
00E0 09F4 brne X8
00E2 40C0 xjmp L32
00E4 X8:
00E4 4D37 cpi R20,125
00E6 E0E0 ldi R30,0
00E8 5E07 cpc R21,R30
00EA 09F4 brne X9
00EC 43C0 xjmp L36
00EE X9:
00EE 4E37 cpi R20,126
00F0 E0E0 ldi R30,0
00F2 5E07 cpc R21,R30
00F4 09F4 brne X10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -