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

📄 test1.asm

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

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

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


ORG  0000H
LJMP  MAIN;

MAIN:
								MOV    SP,#0B0H
               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

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

;温度存放格式(右对齐)
;	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
          LCALL  DELAY1 ;延时一个机器周期1微秒
					LCALL  DELAY1
          CLR WDDATA   ;拉低数据线
          MOV R5,#38;38
          LCALL Delay ;调用延时子程序,发出一个540微秒的低脉冲
          SETB WDDATA  ;再次拉高数据线
          LCALL  DELAY1;
          LCALL  DELAY1;
          MOV    R5,#05 	;等待72微秒,其间收到低脉冲,证明18B20存在,否则不存在
					LCALL  DELAY;	
     TZ2: JNB WDDATA,TZ3 
          LJMP TZ4
     TZ3: SETB exist1820 ;收到低脉冲,标志位置高,证明18B20存在
          LJMP TZ5
     TZ4: SETB exist1820;CLR  exist1820 ;没有低脉冲反馈,证明18B20没有连接上,标志位置低
          LJMP TZ7 ;TZ7将P3.0拉高
     TZ5: MOV  R5,#18;17;复位成功,按照时序延时240微秒
     TZ6: LCALL  DELAY1;
     TZ7: SETB WDDATA
          ret;



;540微秒延时
Delay:
DSDLY0:	MOV R4,#230
	DJNZ R4,$
      DJNZ R5,DSDLY0;
      ret;
;延时1us
Delay1:
	nop;
	nop;
	NOP;
	ret;

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

        lcall Read1820;
        mov tempL,A;         //低位数

        lcall Read1820;
	mov tempH,A;       //高位数
gettempend:
        ret;

Write1820:
;程序入口为ACC
;写温度子程序
						setb  WDDATA;
						LCALL  DELAY1;
 	    MOV R2,#8 ;//一个字节共8位
            CLR C ;//清空进位位
   wr18201: CLR WDDATA ;//拉低总线
            MOV  R5,#01H;//18B20开始工作,对数据进行采样,等待16US
	    			LCALL  DELAY;
						;LCALL  DELAY1;
	    			RRC A ;
            MOV WDDATA,C ;//命令字按位依次送给18B20
            MOV  R5,#05H;//保证写过程持续在60微秒
            LCALL  DELAY;
	    		  SETB WDDATA
            MOV  R5,#02H;//30微秒
            LCALL  DELAY;
	    		  ;LCALL  DELAY1;
            DJNZ R2,WR18201 ;//未写完一个字节的话继续进行
            SETB WDDATA
            MOV  R5,#06H;//100微秒
            LCALL  DELAY;

            ret;
;读温度子程序,可以读出9个8位数据,分别存入以60H开始的9个地址内
Read1820:
						;setb  WDDATA;
						;LCALL  DELAY1;
       RE0: MOV R2,#8 ;//数据共有8位
       RE1: CLR C
            SETB WDDATA
            LCALL  DELAY1;
	    			LCALL  DELAY1;
            CLR WDDATA
            LCALL  DELAY1;//保持低电平2微秒
            LCALL  DELAY1
	    			LCALL  DELAY1;
	    			SETB WDDATA ;//
            MOV   R5,#01H;//等待18微秒,让字节传来
            LCALL  DELAY;
            LCALL  DELAY1;
            LCALL  DELAY1
	    			LCALL  DELAY1;

						;SETB WDDATA;
						;MOV  R5,#01H;
						;LCALL  DELAY;
						;CLR  WDDATA;
						;LCALL  DELAY1;
	    			;LCALL  DELAY1;

						;clr  wddata;
						;mov  r5,#01h;
						;lcall  delay;
						;setb  wddata;
						;lcall  delay1;
						;lcall  delay1;
						;lcall  delay1;
						;lcall  delay1;
						;mov  c,wddata;
						;mov  r4,#04
						;lcall  delay;
						;rrc  a;

	   				MOV C,WDDATA ;//主机按位依次读入18B20数据
            MOV   R5,#05H;
	   				LCALL  DELAY;
            RRC A ;//读取数据移入A
            DJNZ R2,RE1
            LCALL  DELAY1;
            LCALL  DELAY1
	    			;LCALL  DELAY1;            
            SETB WDDATA
            ret;        返回数据在A中

end

⌨️ 快捷键说明

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