📄 ds18b20.lst
字号:
// C格式: unsigned int F_18B20_Reset(void);
// 实现功能: 一线总线复位及从设备应答控制程序
// 入口参数: 无
// 出口参数: 0表示复位失败 1表示复位成功
//======================================================
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
0000A37A 09 93 00 80 r1=DQ; //将端口b15设置成带数据缓存器的低电平输出
0000A37C 19 D3 08 70 [P_IOB_Attrib]=r1;
0000A37E 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A380 40 92 r1=0x0000;
0000A381 19 D3 05 70 [P_IOB_Data] = r1;
0000A383 09 93 58 02 r1 = 600
0000A385 40 F0 3C A3 call _F_18B20_Delay //延时600us,发送复位脉冲(400us--960us)
0000A387 40 92 r1=0x0000;
0000A388 19 D3 08 70 [P_IOB_Attrib]=r1; //将端口b15设置成带上拉电阻的输入端
0000A38A 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A38C 09 93 00 80 r1=DQ;
0000A38E 19 D3 05 70 [P_IOB_Data] = r1;
0000A390 5E 92 r1 = 30
0000A391 40 F0 3C A3 call _F_18B20_Delay //Delay 30us
0000A393 0A 95 E8 03 r2 = 1000
F_18B20_Reset_L:
0000A395 41 24 r2 -=1
0000A396 11 93 05 70 r1 = [P_IOB_Data]
0000A398 09 B3 00 80 r1 = r1&DQ; //====================================
0000A39A 40 42 cmp r1,0x0000
0000A39B 47 4E jne F_18B20_Reset_L //关键所在:先检测DQ是否为低电平,检测到低电平后
0000A39C 0A 95 E8 03 r2 =1000 //检测高电平,这个时候表示DS18B20完全复位成功
F_18B20_Reset_L2:
0000A39E 41 24 r2-=1
0000A39F 11 93 05 70 r1 = [P_IOB_Data]
0000A3A1 09 B3 00 80 r1 = r1&DQ; //=================================
0000A3A3 40 42 cmp r1,0x0000
0000A3A4 47 5E je F_18B20_Reset_L2
0000A3A5 41 92 r1 = 1
0000A3A6 00 EE jmp F_18B20_Reset_Exit
F_18B20_Reset_Exit:
0000A3A7 90 9A retf
//======================================================
// 汇编格式: _F_18B20_Write_1
// C格式: void F_18B20_Write_1(void);
// 实现功能: 向一线总线写1
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
0000A3A8 09 93 00 80 r1=DQ; //将端口b15设置成带数据缓存器的低电平输出
0000A3AA 19 D3 08 70 [P_IOB_Attrib]=r1;
0000A3AC 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A3AE 40 92 r1=0x0000;
0000A3AF 19 D3 05 70 [P_IOB_Data] = r1;
0000A3B1 4F 92 r1 = 15
0000A3B2 40 F0 3C A3 call _F_18B20_Delay
0000A3B4 0A A5 00 80 r2 = r2|DQ //将DQ线拉高进行写1操作
0000A3B6 1A D5 05 70 [P_IOB_Data] = r2
0000A3B8 6D 92 r1 = 45
0000A3B9 40 F0 3C A3 call _F_18B20_Delay
0000A3BB 40 92 r1=0x0000;
0000A3BC 19 D3 08 70 [P_IOB_Attrib]=r1; //将端口b15设置成带上拉电阻的输入端
0000A3BE 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A3C0 09 93 00 80 r1=DQ;
0000A3C2 19 D3 05 70 [P_IOB_Data] = r1;
0000A3C4 90 9A retf
//======================================================
// 汇编格式: _F_18B20_Write_0
// C格式: void F_18B20_Write_0(void);
// 实现功能: 向一线总线写0
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
0000A3C5 09 93 00 80 r1=DQ; //将端口b15设置成带数据缓存器的低电平输出
0000A3C7 19 D3 08 70 [P_IOB_Attrib]=r1;
0000A3C9 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A3CB 19 D3 05 70 [P_IOB_Data] = r1;
0000A3CD 40 92 r1=0x0000;
0000A3CE 19 D3 05 70 [P_IOB_Data] = r1;
0000A3D0 7C 92 r1 = 60 //Delay 60us,进行写0操作
0000A3D1 40 F0 3C A3 call _F_18B20_Delay
0000A3D3 40 92 r1=0x0000;
0000A3D4 19 D3 08 70 [P_IOB_Attrib]=r1; //将端口b15设置成带上拉电阻的输入端
0000A3D6 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A3D8 09 93 00 80 r1=DQ;
0000A3DA 19 D3 05 70 [P_IOB_Data] = r1;
0000A3DC 90 9A retf
//======================================================
// 汇编格式: _F_18B20_Read_DQ
// C格式: unsigned int F_18B20_Read_DQ(void);
// 实现功能: 读一位一线总线的数据
// 入口参数: 无
// 出口参数: 当前读回的位的值0/1
//======================================================
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
0000A3DD 09 93 00 80 r1=DQ; //将端口b15设置成带数据缓存器的低电平输出
0000A3DF 19 D3 08 70 [P_IOB_Attrib]=r1;
0000A3E1 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A3E3 40 92 r1=0x0000;
0000A3E4 19 D3 05 70 [P_IOB_Data] = r1;
0000A3E6 42 92 r1 = 2 //延时1us
0000A3E7 40 F0 3C A3 call _F_18B20_Delay
0000A3E9 40 92 r1=0x0000;
0000A3EA 19 D3 08 70 [P_IOB_Attrib]=r1; //将端口b15设置成带上拉电阻的输入端
0000A3EC 19 D3 07 70 [P_IOB_Dir]= r1 ;
0000A3EE 09 93 00 80 r1=DQ;
0000A3F0 19 D3 05 70 [P_IOB_Data] = r1;
0000A3F2 4F 92 r1=15
0000A3F3 40 F0 3C A3 call _F_18B20_Delay
0000A3F5 13 97 05 70 r3 = [P_IOB_Data] //将端口b15设置成带上拉电阻的输入端
0000A3F7 0B B7 00 80 r3 = r3&DQ
0000A3F9 02 5E jz L18B20_Read_0 //jz:运算结果为0,则z=1跳转
0000A3FA 0B 97 00 80 r3 = 0x8000;
L18B20_Read_0:
0000A3FC 6D 92 r1 = 45
0000A3FD 40 F0 3C A3 call _F_18B20_Delay
0000A3FF 0A A5 00 80 r2 = r2|DQ
0000A401 1A D5 05 70 [P_IOB_Data] = r2
0000A403 41 92 r1 = 1
0000A404 40 F0 3C A3 call _F_18B20_Delay //Delay 1us
0000A406 03 93 r1 = r3
0000A407 90 9A retf
//==============================================
// IRQ中断
//==============================================
000081AA .text
.public _IRQ1;
_IRQ1:
000081AA A8 DA push r1,r5 to[sp];
000081AB 41 92 r1=0x0001;
000081AC 19 D3 12 70 [P_Watchdog_Clear]=r1;
000081AE 09 93 00 10 r1=0x1000;
000081B0 19 D3 11 70 [P_INT_Clear]=r1;
000081B2 A8 90 pop r1,r5 from [sp];
000081B3 98 9A reti;
0 error(s), 0 warning(s).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -