📄 18b20.asm
字号:
//======================================================
// 文件名称: 18b20.asm
// 功能描述: DS18B20的底层驱动
// 完成日期: 2006-10-10
//======================================================
.include spce061a.inc
.DEFINE Port_Data P_IOB_Data // DS18B20连接端口
.DEFINE Port_Buffer P_IOB_Buffer
.DEFINE Port_Dir P_IOB_Dir
.DEFINE Port_Attrib P_IOB_Attrib
.DATA
R_Port: // DS18B20连接管脚(位)
.DW 0x0001 // 0
.DW 0x0002 // 1
.code
//======================================================
// 汇编格式: _F_18B20_Delay
// C格式: void F_18B20_Delay(unsigned int Timers);
// 实现功能: 在49MHz的主频下的uS延时程序
// 入口参数: Timers 需要延时的时长(以uS为单位)
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Delay
_F_18B20_Delay:
cmp r1,1
jna ?Delay_Exit
?Delay_Loop:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
r1-=1
jnz ?Delay_Loop
?Delay_Exit:
retf
//======================================================
// 汇编格式: _F_18B20_SetSystemCLK
// C格式: void F_18B20_SetSystemCLK(void);
// 实现功能: 将CPU主频设置为49MHz,为的是在时序控制时
// 可以获取到较精确的延时
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_SetSystemCLK
_F_18B20_SetSystemCLK:
r1 = 0x88
[P_SystemClock] = r1 //设置系统时钟为49MHz
retf
//======================================================
// 汇编格式: _F_18B20_RsuSystemCLK
// C格式: void F_18B20_RsuSystemCLK(void);
// 实现功能: 恢复系统及CPU主频,可以修改r1的值实现不同的主频
//
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_RsuSystemCLK
_F_18B20_RsuSystemCLK:
r1 = 0x0018
[P_SystemClock] = r1
retf
//======================================================
// 汇编格式: _F_18B20_Initial_IO
// C格式: void F_18B20_Initial_IO(unsigned int uiChannel);
// 实现功能: 端口初始化子程序
// 入口参数: uiChannel 选中的18B20通道
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Initial_IO
_F_18B20_Initial_IO:
r2 = sp + 3
r2 = [r2]
r2 = r2 + R_Port // 取该通道对应的IO
r2 = [r2]
r3 = r2^0xffff
r1 = [Port_Dir] // 设置对应的IO为悬浮的输入
r1 = r1&r3
[Port_Dir] = r1
r1 = [Port_Attrib]
r1 = r1|r2
[Port_Attrib] = r1
r1 = [Port_Buffer]
r1 = r1|r2
[Port_Buffer] = r1
retf
//======================================================
// 汇编格式: _F_18B20_Reset
// C格式: unsigned int F_18B20_Reset(unsigned int uiChannel);
// 实现功能: 一线总线复位及从设备应答控制程序
// 入口参数: uiChannel 选中的18B20通道
// 出口参数: 0表示复位失败 1表示复位成功
//======================================================
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
r2 = sp + 3
r2 = [r2]
r2 = r2 + R_Port // 取该通道对应的IO
r2 = [r2]
r3 = r2^0xffff
r1 = [Port_Dir]
r1 = r1|r2
[Port_Dir] = r1 // 对应IO为输出
r1 = [Port_Buffer]
r1 = r1&r3
[Port_Buffer] = r1 // 输出'0'
r1 = 600
call _F_18B20_Delay // 配合时序延时
r1 = [Port_Dir]
r1 = r1&r3
[Port_Dir] = r1 // 端口更新为输入
r1 = 30
call _F_18B20_Delay // 配合时序延时
r4 = 1000
?F_18B20_Reset_L:
r4 -= 1
jz ?F_18B20_Reset_E // 超时出错
r1 = [Port_Data]
r1 = r1&r2
jnz ?F_18B20_Reset_L
r4 = 1000
?F_18B20_Reset_L2:
r4-=1
jz ?F_18B20_Reset_E // 超时出错
r1 = [Port_Data]
r1 = r1&r2
jz ?F_18B20_Reset_L2
r1 = 1 // 成功复位
jmp ?F_18B20_Reset_Exit
?F_18B20_Reset_E:
r1 = 0
?F_18B20_Reset_Exit:
retf
//======================================================
// 汇编格式: _F_18B20_Write_0
// C格式: void F_18B20_Write_0(unsigned int uiChannel);
// 实现功能: 向一线总线写1
// 入口参数: uiChannel 选中的18B20通道
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
irq off
r2 = sp + 3
r2 = [r2]
r2 = r2 + R_Port // 取该通道对应的IO
r2 = [r2]
r3 = r2^0xffff
r1 = [Port_Dir]
r1 = r1|r2
[Port_Dir] = r1 // 设置对应IO为输出
r1 = [Port_Buffer]
r1 = r1&r3
[Port_Buffer] = r1 // 输出'0'
r1 = 50
call _F_18B20_Delay // 延时
r1 = [Port_Dir]
r1 = r1&r3
[Port_Dir] = r1 // 端口更新为悬浮输入
irq on
retf
//======================================================
// 汇编格式: _F_18B20_Write_1
// C格式: void F_18B20_Write_1(unsigned int uiChannel);
// 实现功能: 向一线总线写1
// 入口参数: uiChannel 选中的18B20通道
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
irq off
r2 = sp + 3
r2 = [r2]
r2 = r2 + R_Port // 取该通道对应的IO
r2 = [r2]
r3 = r2^0xffff
r1 = [Port_Dir]
r1 = r1|r2
[Port_Dir] = r1 // 设置为输出
r1 = [Port_Buffer]
r1 = r1&r3
[Port_Buffer] = r1 // 输出'0'
r1 = 10
call _F_18B20_Delay // 延时
r1 = [Port_Buffer] // 输出'1'
r1 = r1|r2
[Port_Buffer] = r1
r1 = 40
call _F_18B20_Delay // 延时
r1 = [Port_Dir]
r1 = r1&r3
[Port_Dir] = r1 // 悬浮输入
irq on
retf
//======================================================
// 汇编格式: _F_18B20_Read_DQ
// C格式: unsigned int F_18B20_Read_DQ(unsigned int uiChannel);
// 实现功能: 读一位一线总线的数据
// 入口参数: uiChannel 选中的18B20通道
// 出口参数: 当前读回的位的值0/1
//======================================================
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
irq off
r2 = sp + 3
r2 = [r2]
r2 = r2 + R_Port // 取该通道对应的IO
r2 = [r2]
r3 = r2^0xffff
r1 = [Port_Dir]
r1 = r1|r2
[Port_Dir] = r1 // 设置为输出
r1 = [Port_Buffer]
r1 = r1&r3
[Port_Buffer] = r1 // 输出'0'
r1 = 10
call _F_18B20_Delay // 延时
r1 = [Port_Dir]
r1 = r1&r3
[Port_Dir] = r1 // 悬浮输入
r1 = 3
call _F_18B20_Delay // 延时
r4 = 0x00
r1 = [Port_Data] // 读18B20状态
r1 = r1&r2
jz ?L18B20_Read_0 // 18B20输出'0'
r4 = 0x80 // 18B20输出'0'
?L18B20_Read_0:
r1 = 30
call _F_18B20_Delay
r1 = [Port_Buffer]
r1 = r1|r2
[Port_Buffer] = r1
r1 = 1
call _F_18B20_Delay // 延时
r1 = r4
irq on
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -