⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20.asm

📁 这是利用凌阳单片机实现的多路温度测量
💻 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 + -