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