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

📄 ds18b20.asm

📁 温度传感器ds18b20的操作代码
💻 ASM
字号:
.DEFINE           P_IOA_Dir                   0x7002
.DEFINE           P_IOA_Attrib               0x7003
.DEFINE           P_IOA_Latch                     0x7004
.DEFINE           P_IOB_Data                0x7005
.DEFINE           P_IOB_Buffer              0x7006
.DEFINE           P_IOB_Dir                   0x7007
.DEFINE           P_IOB_Attrib               0x7008
.DEFINE           P_SystemClock           0x7013
.DEFINE           P_TimerA_Data           0x700A
.DEFINE           P_TimerA_Ctrl           0x700B
.DEFINE           P_INT_Ctrl              0x7010
.DEFINE           P_INT_Clear             0x7011
.DEFINE           P_Watchdog_Clear        0x7012
//以下重复定义用于端口的定义,如用户需要针对自用的设计选择端口时,可以更改
//以下宏定义中的定义即可
//.DEFINE Port_Data        P_IOB_Data
//.DEFINE Port_Buffer      P_IOB_Buffer
//.DEFINE Port_Dir         P_IOB_Dir
//.DEFINE Port_Attrib      P_IOB_Attrib
.DEFINE DQ               0x8000
//由于DS18B20的驱动程序需要修改CPU主频,为了让用户设用DS18B20 的API函数后,能
//恢复到原来的系统时钟、CPU主频设置,用户可以在下面的常量R_SystemClock中定义
//用户设计需要的值
.DATA
R_SystemClock:
.DW 0x0018                                //buffer of save the system clock

//======================================================
// 汇编格式: _F_18B20_Delay
// C格式:        void F_18B20_Delay(unsigned int Timers);
// 实现功能: 在49MHz的主频下的uS延时程序
// 入口参数: 需要延时的时长(以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
       r1=0xfc26;
       [P_TimerA_Data]=r1;
       r1=0x000c;
       [P_TimerA_Ctrl]=r1;
       r1=0x5400;
       [P_INT_Ctrl]=r1;
       int IRQ;
       retf;
//======================================================
// 汇编格式: _F_18B20_Delay1
// C格式:        void F_18B20_Delay1(unsigned int Timers);
// 实现功能: 在49MHz的主频下的uS延时程序
// 入口参数: 需要延时的时长(以uS为单位)
// 出口参数: 无
//======================================================      
 .PUBLIC _F_18B20_Delay1
       r1=DQ;                        //将端口b15设置成带数据缓存器的高电平输出
      [P_IOB_Attrib]=r1;
      [P_IOB_Dir]= r1 ;
      [P_IOB_Data] = r1;            
_F_18B20_Delay1:                    //延时750ms用来完成温度转换
       r2=760
Delay:
       r1=1000
Delay_Loop1:
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop      
      r1-=1
      cmp r1,1 
      jnb Delay_Loop1
      r2-=1
      cmp r2,1
      jnb Delay
      retf
               
//======================================================
// 汇编格式: _F_18B20_SetSystemCLK
// C格式:     void   F_18B20_SetSystemCLK(void);
// 实现功能: 将CPU主频设置为49MHz,为的是在时序控制时
//                                     可以获取到较精确的延时
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_SetSystemCLK
_F_18B20_SetSystemCLK:
        r1 = 0x88
        [P_SystemClock] = r1                 //set system clock upto 49MHz
        retf
        
//======================================================
// 汇编格式: _F_18B20_RsuSystemCLK
// C格式:        void F_18B20_RsuSystemCLK(void);
// 实现功能: 恢复系统及CPU主频,而至于恢复为多少,则
//            由前面定义的变量R_SystemClock的值确定,用
//            户可根据各自的程序设计需求进行改动
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_RsuSystemCLK
_F_18B20_RsuSystemCLK:
        r1 = [R_SystemClock]
        [P_SystemClock] = r1
        retf

//======================================================
// 汇编格式: _F_18B20_Initial_IO
// C格式:        void F_18B20_Initial_IO(void);
// 实现功能: 端口初始化子程序
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Initial_IO              
_F_18B20_Initial_IO:               //端口初始化将b15口作为悬浮式输入
        r1=DQ;
        [P_IOB_Attrib]=r1;
        r1=0x0000;
        [P_IOB_Data] = r1;
        [P_IOB_Dir]= r1  
        retf

//======================================================
// 汇编格式: _F_18B20_Reset
// C格式:        unsigned int F_18B20_Reset(void);
// 实现功能: 一线总线复位及从设备应答控制程序
// 入口参数: 无
// 出口参数: 0表示复位失败   1表示复位成功
//======================================================      
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
      r1=DQ;                        //将端口b15设置成带数据缓存器的低电平输出
      [P_IOB_Attrib]=r1;
      [P_IOB_Dir]= r1 ;
      r1=0x0000;
      [P_IOB_Data] = r1;
      r1 = 600
      call _F_18B20_Delay               //延时600us,发送复位脉冲(400us--960us)
      r1=0x0000;                        
      [P_IOB_Attrib]=r1;                 //将端口b15设置成带上拉电阻的输入端
      [P_IOB_Dir]= r1 ;
      r1=DQ;
      [P_IOB_Data] = r1;               
      r1 = 30
      call _F_18B20_Delay                          //Delay 30us
      r2 = 1000
F_18B20_Reset_L:
        r2 -=1                    
        r1 = [P_IOB_Data]
        r1 = r1&DQ;              //====================================
        cmp r1,0x0000
        jne F_18B20_Reset_L           //关键所在:先检测DQ是否为低电平,检测到低电平后      
        r2 =1000                      //检测高电平,这个时候表示DS18B20完全复位成功
F_18B20_Reset_L2: 
        r2-=1                     
        r1 = [P_IOB_Data]
        r1 = r1&DQ;                //=================================
        cmp r1,0x0000
        je F_18B20_Reset_L2
        r1 = 1
        jmp F_18B20_Reset_Exit
F_18B20_Reset_Exit:
        retf
//======================================================
// 汇编格式: _F_18B20_Write_1
// C格式:        void F_18B20_Write_1(void);
// 实现功能: 向一线总线写1
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
        r1=DQ;                        //将端口b15设置成带数据缓存器的低电平输出
        [P_IOB_Attrib]=r1;
        [P_IOB_Dir]= r1 ;
        r1=0x0000;
        [P_IOB_Data] = r1;
        r1 = 15
        call _F_18B20_Delay                         
        r2 = r2|DQ                      //将DQ线拉高进行写1操作
        [P_IOB_Data] = r2
        r1 = 45
        call _F_18B20_Delay
         r1=0x0000;                            
        [P_IOB_Attrib]=r1;                 //将端口b15设置成带上拉电阻的输入端
        [P_IOB_Dir]= r1 ;
        r1=DQ;
        [P_IOB_Data] = r1; 
        retf
        
//======================================================
// 汇编格式: _F_18B20_Write_0
// C格式:        void F_18B20_Write_0(void);
// 实现功能: 向一线总线写0
// 入口参数: 无
// 出口参数: 无
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
        r1=DQ;                        //将端口b15设置成带数据缓存器的低电平输出
        [P_IOB_Attrib]=r1;
        [P_IOB_Dir]= r1 ;
        [P_IOB_Data] = r1;
        r1=0x0000;
        [P_IOB_Data] = r1;
        r1 = 60                           //Delay 60us,进行写0操作
        call _F_18B20_Delay
         r1=0x0000;                            
        [P_IOB_Attrib]=r1;                 //将端口b15设置成带上拉电阻的输入端
        [P_IOB_Dir]= r1 ;
        r1=DQ;
        [P_IOB_Data] = r1; 
        retf

//======================================================
// 汇编格式: _F_18B20_Read_DQ
// C格式:        unsigned int F_18B20_Read_DQ(void);
// 实现功能: 读一位一线总线的数据
// 入口参数: 无
// 出口参数: 当前读回的位的值0/1
//======================================================      
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
        r1=DQ;                        //将端口b15设置成带数据缓存器的低电平输出
        [P_IOB_Attrib]=r1;
        [P_IOB_Dir]= r1 ;
        r1=0x0000;
        [P_IOB_Data] = r1;
        r1 = 2                              //延时1us
        call _F_18B20_Delay                         
        r1=0x0000;                        
        [P_IOB_Attrib]=r1;                 //将端口b15设置成带上拉电阻的输入端
        [P_IOB_Dir]= r1 ;
        r1=DQ;
        [P_IOB_Data] = r1; 
        r1=15
        call _F_18B20_Delay
        r3 = [P_IOB_Data]                     //将端口b15设置成带上拉电阻的输入端
        r3 = r3&DQ
        jz L18B20_Read_0                     //jz:运算结果为0,则z=1跳转             
        r3 = 0x8000;
L18B20_Read_0:
        r1 = 45
        call _F_18B20_Delay
        r2 = r2|DQ
        [P_IOB_Data] = r2
        r1 = 1
        call _F_18B20_Delay                          //Delay 1us
        r1 = r3
        retf
        
        
        
 //==============================================
 //        IRQ中断
 //==============================================
 .text
 .public _IRQ1;
 _IRQ1:
      push r1,r5 to[sp];
      r1=0x0001;
      [P_Watchdog_Clear]=r1;
      r1=0x1000;
      [P_INT_Clear]=r1;
      pop r1,r5 from [sp];
      reti;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -