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

📄 test2.asm

📁 C8051F020读取DS18B20时的汇编语言程序
💻 ASM
字号:
$include(c8051f020.inc)

WDDATA        bit  P1.3          ;//数据总线
exist1820     bit  20H;//表示是否检测到18B20的标志位

tempH   data   40h   ;从18B20读取的温度高位数
tempL   data   41h   ;从18B20读取的温度低位数


ORG  0000H
LJMP  MAIN

MAIN:
							 MOV    SP,#80H
               MOV    WDTCN,#0DEH
               MOV    WDTCN,#0ADH

 				       MOV	  OSCXCN,#67H		;外部晶振11.0592MHz
               CLR   	A
               DJNZ  	ACC,$
               DJNZ  	ACC,$
PORT1: 	       MOV   	A,OSCXCN
               JNB   	ACC.7,PORT1
				       MOV   	OSCICN,#88H		;允许检测到时钟丢失触发复位, 切换为外部时钟

               MOV    XBR2,#40H
						   MOV    P1MDOUT,#00H
						   MOV    P1,#0FFH

LOOP11:				 LCALL  GETTEMP;(读取的温度值在tempH,tempL中)
	             SJMP LOOP11;


;温度存放格式(右对齐)
;	D7     D6     D5     D4     D3     D2     D1      D0
;tempH  0      0      0      0      0      2_+6   2_+5    2_+4
;tempL  2_+3   2_+2   2_+1   2_0    2_-1   2_-2   2_-3    2_-4



Init_1820:
          SETB WDDATA   ;按照时序拉高P3.0
					MOV  R5,#10
          DJNZ R5,$           ;延时一个机器周期1.8微秒
          CLR WDDATA   ;拉低数据线
          MOV R5,#36
          LCALL Delay    ;调用延时子程序,发出一个540微秒的低脉冲
          SETB WDDATA    ;再次拉高数据线
          NOP
          NOP
          MOV R0,#36
					MOV R1,#11
     TZ2: JNB WDDATA,TZ3  ;运行36次跳转指令,等待72微秒,其间收到低脉冲,证明18B20存在,否则不存在
          DJNZ R0,TZ2
					MOV  R0,#36
					DJNZ R1,TZ2
          LJMP TZ4
     TZ3: SETB exist1820  ;收到低脉冲,标志位置高,证明18B20存在
          LJMP TZ5
     TZ4: CLR  exist1820  ;没有低脉冲反馈,证明18B20没有连接上,标志位置低
          LJMP Init_1820        ;TZ7将P3.0拉高
     TZ5: MOV  R0,#6EH    ;复位成功,按照时序延时240微秒
		      MOV  R1,#11
     TZ6: jb   WDDATA,tz8
		      DJNZ R0,TZ6
		      MOV  R0,#6EH
		      DJNZ R1,TZ6
					sjmp Init_1820
    ; TZ7: SETB WDDATA
     tz8: ret;


;540微秒延时;14.5us
Delay:
 LOOP:MOV R4,#4EH
 LOOP1:DJNZ R4,LOOP1
      DJNZ R5,LOOP
      ret;


;读出转化后温度值的子程序
GetTemp:
	       setb  WDDATA;		  //定时入口
	       lcall Init_1820;	  //运行前先复位
         jnb  exist1820,gettempend;	 //如果检测到18B20存在,跳到退出
         mov   A,#0cch;
         lcall Write1820;	 //调用SKIP ROM命令
         mov   A,#044h;
         lcall Write1820;	 //调用CONVERT命令,一定要先执行ROM命令再执行RAM命令
         MOV R5,#55 ;             //根据时序要求延时750微秒等待A/D转换结束
         LCALL Delay;
 	       lcall Init_1820;	//在读温度值前先复位
         mov  A,#0ccH;
	       lcall Write1820;       //每下一个命令都要调用写程序写入
         mov  A,#0BEH;
         lcall Write1820;
         lcall Read1820;
         mov tempL,A;         //低位数
         lcall Read1820;
	       mov tempH,A;       //高位数
gettempend:
        ret;

Write1820:
;程序入口为ACC
;写温度子程序
 	          MOV  R2,#8     ;//一个字节共8位
            CLR  C         ;//清空进位位
wr18201:    CLR  WDDATA    ;//拉低总线
            ;MOV  R5,#10
            ;DJNZ R5,$           ;延时一个机器周期1.8微秒
            MOV  R3,#39H
            DJNZ R3,$      ;//18B20开始工作,对数据进行采样,等待1
						;jnb  acc.0,dd0
	          RRC  A         ;
            MOV  WDDATA,C  ;//命令字按位依次送给18B20
dd0:        MOV  R3,#32
						MOV  R4,#11
DD1:        DJNZ R3,DD1      ;//保证写过程持续在60微秒
						MOV  R3,#32
						DJNZ R4,DD1
            SETB WDDATA
	          NOP
            DJNZ R2,WR18201 ;//未写完一个字节的话继续进行
            SETB WDDATA

            ret;
;读温度子程序,可以读出9个8位数据,分别存入以60H开始的9个地址内
Read1820:
       RE0: MOV R2,#8 ;//数据共有8位
       RE1: CLR C
            SETB WDDATA
            NOP
            NOP ;//
            CLR WDDATA
            MOV  R5,#15
            DJNZ R5,$    ;//保持低电平2微秒
            SETB WDDATA  ;//
						nop
						;clr  wddata
            MOV R3,#75
       RE2: DJNZ R3,RE2  ;//等待9微秒,让字节传来
            MOV C,WDDATA ;//主机按位依次读入18B20数据
            RRC A ;//读取数据移入A
						
            MOV R3,#24   ;
						MOV  R4,#11
       RE3: DJNZ R3,RE3
			      MOV  R3,#24
						DJNZ R4,RE3
 
            DJNZ R2,RE1
            SETB WDDATA
            ret;        返回数据在A中

end

⌨️ 快捷键说明

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