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

📄 mainend.asm

📁 用单片机8051控制DS18B20温度传感器
💻 ASM
字号:

FLAG     EQU     20H
BUFFER   EQU     21H         ;DEBUG BUFFER
MODE     EQU     0X08
HTEMP    EQU     23H
LTEMP    EQU     24H
BUFF     EQU     25H
;
BUZZER   BIT     P3.4
LED      BIT     P3.7
TEMP     BIT     P3.2
SDA      BIT     P1.6
SCL      BIT     P1.7	
;      	
         ORG     0x00      
    	 LJMP    MAIN
	 ORG     0X03	           ;INT0  INTERRUPT
	 RETI
	 ORG     0X0B              ;TIMER0  INTERRUPT
	 LJMP    TIMER0
	 ORG     0X13              ;INT1  INTERRUPT
	 RETI 
	 ORG     0X1B	           ;TIMER1  INTERRUPT
	 RETI
	 ORG     0X23	           ;SERIAL  INTERRUPT
 	 LJMP    UART

         ORG     0X30
MAIN:    MOV       R0,0X00
	 DJNZ      R0,$
         CLR       LED
	 CLR       BUZZER
	 MOV       FLAG,#0X00
	 MOV       SP,#0X40
         ;串口初始化
         MOV       TMOD,#0X20          ;TIMER 1 MODE 2
	 MOV       TH1,#0XFA           ;BAUD RATE=4800 BIT/S
	 SETB      TR1	               ;START TIMER
	 MOV       SCON,#0XD0          ;SIO MODE 3,HAVE A ODD PARITY BIT (有一位效验位,在后面传送时通过TB8设置成奇效验)
         ;TIMER0初始化
         MOV       A,TMOD
	 ANL       A,#0XF0
	 CLR       ACC.3              ;gate=0
	 CLR       ACC.2              ;c/t=0
	 SETB      ACC.1
	 CLR       ACC.0              ;MODE 2 自动载入方式
	 MOV       TMOD,A
	 MOV       TH0,#0XC0          ;#0XC0          ;70US TIMER
	 MOV       TL0,#0XC0          ;#0XC0
	 CLR       TR0
         ;interrupt初始化
	 CLR       PT0
	 SETB      PS                  ;串口中断优先
         SETB      ES                  ;ENABLE UART INTERRUPT
	 SETB      ET0
	 SETB      EA                  ;ENABLE SYSTEM INTERRUPT
         ;标志位清零
 	 CLR       RI
         CLR       TI
	 CLR       TF0	 
	 
	 MOV       R1,#BUFF
         MOV       R7,#0X00
STO:     JNB       FLAG.7,NTLS        ;设置最新温度限    
         ACALL     THLSET  
         CLR       FLAG.7  
NTLS: 	 MOV       A,R7
         CJNE      A,#0X00,HDAT
         ACALL     CONVERT            ;温度转化
 	 ACALL     SALARM             ;警情查询
	 ACALL     DIS                ;温度显示	 JNB    
         SJMP      STO
HDAT:    MOV       A,R1
         CLR       C
         SUBB      A,R7
	 MOV       R0,A
         MOV       A,@R0
	 JNB       FLAG.2,NHS
 	 MOV       HTEMP,A         ;读入最高温度??????/应该对数值做判断	 
         SETB      FLAG.7
         CLR       FLAG.2
	 SJMP      ENDD
NHS:	 JNB       FLAG.3,NLS
	 MOV       LTEMP,A         ;读入最低温度
	 SETB      FLAG.7
	 CLR       FLAG.3
	 SJMP      ENDD
NLS:     CJNE      A,#0XA5,COM      ;a     
       	 SETB      FLAG.1           ;IF RECEIVED COMMAND
	 SJMP      ENDD
COM:     JNB       FLAG.1,NCOM             ;后面改成0X00/01根据模块号决定
	 CJNE      A,#0X08,COMM      ;b
   	 SETB      FLAG.1
         SJMP      ENDD
COMM:	 JNB       FLAG.1,NCOM
         CJNE      A,#0X11,TL
	 SETB      FLAG.2           ;SET H TEMP ELDGE;CLR WHEN RE_SET
	 CLR       FLAG.1
	 SJMP      ENDD
TL:      CJNE      A,#0X12,NCOM
         SETB      FLAG.3           ;SET L TEMP ELDGE
	 CLR       FLAG.1
	 SJMP      ENDD
NCOM:    CLR       FLAG.1
         MOV       B,#0X02
	 DIV       AB
	 MOV       A,B          
	 CJNE      A,#0X00,ENDD     ;收到的是偶数,可以由MODE来计算奇偶
	 JNB       FLAG.0,ENDD      ;有警情传送                 
         SETB      TR0              ;START TIMER0
	 SETB      FLAG.4           ;开始准备传送数据 
ENDD:    INC       R0
         DJNZ      R7,HDAT
	 SJMP      STO
;DS18B20 BEGIN
SALARM:	 LCALL     STARTD         
	 MOV       A,#0XEC             ;ALARM SEARCH     
	 LCALL     WRITED
	 MOV       A,#0X00
	 CLR       C
         LCALL     READB
	 LCALL     READB
	 CJNE      A,#0X80,NAL        ;
	 SETB      BUZZER
	 SETB      FLAG.0
	 SJMP      LOP
NAL:     CLR       BUZZER
         CLR       FLAG.0
LOP:     RET
;READ BIT
READB:   SETB      TEMP
         NOP
	 CLR       TEMP                ;START READ SLOT
         NOP                         ;DELAY >1US
	 NOP
	 SETB      TEMP                ;设P3.2为输入口
	 MOV       R0,#4               ;延时
	 DJNZ      R0,$
	 MOV       C,TEMP              ;读数据(在下降沿15US内)  
         RRC       A        
	 RET

CONVERT: LCALL     STARTD         
	 MOV       A,#0XCC      
	 LCALL     WRITED
	 MOV       A,#0X44             ;CONVERT COMMAND
         LCALL     WRITED

	 LCALL     STARTD         
	 MOV       A,#0XCC      
	 LCALL     WRITED
  	 MOV       A,#0XBE             ;READ DS18B20 SCRAPAD
         LCALL     WRITED

	 LCALL     READD
	 MOV       BUFFER,A            ;THE LOW BYTE CONVERT TEMP
	 LCALL     READD
 	 MOV       BUFFER+1,A          ;THE H BYTE CONVERT TEMP	
         JNB       FLAG.5,NALA         ;向UART传送温度????????????????????
	 MOV       A,BUFFER               ;THE LOW BYTE OF CONVERT TEMP
         ANL       A,#0XF0
	 SWAP      A
	 MOV       B,A
	 MOV       A,BUFFER+1             ;THE H BYTE OF CONVERT TEMP	 
	 ANL       A,#0X0F
	 SWAP      A
	 ORL       A,B                    ;A中为16进制温度	   
	 MOV       B,A
	 MOV       A,B
    	 MOV       C,P
	 CPL       C
	 MOV       TB8,C
         MOV       SBUF,A        
	 CPL       LED
	 CLR       FLAG.5
NALA:    RET
	
THLSET:	 LCALL     STARTD	       ;INITIAL DS18B20
         MOV       A,#0XCC             ;SKIP READ ROM
         LCALL     WRITED
	 MOV       A,#0X4E             ;WRITE SCRAPAD COMMAND
	 LCALL     WRITED
	 MOV       A,HTEMP             ;WRITE HI ALARM TEMP 33C
         LCALL     WRITED
	 MOV       A,LTEMP             ;WRITE LOW ALARM TEMP 28C
	 LCALL     WRITED
 
	 LCALL     STARTD         	
         MOV       A,#0XCC         
         LCALL     WRITED
	 MOV       A,#0X48             ;COPPPY TH,TL,CONFIGUR TO EEPROM
	 LCALL     WRITED  
         RET
;INITIAL DS18B20
STARTD:  SETB      TEMP                ;P3.2=1
         MOV       R0,#0X0F            ;DELAY  A WHILE
	 DJNZ      R0,$
	 CLR       TEMP                ;P3.2=0
         MOV       R0,#0XDD            ;DELAY LARGER THAN 480US             
         DJNZ      R0,$                                                                                
         SETB      TEMP                ;P3.2=1
	 MOV       R0,#0X0F            ;DELAY A WHILE 不可以用一个NOP替代,调试一下。。。。。。
	 DJNZ      R0,$
	 MOV       A,P3                ;READ THE P3.2 看可以用TEMP替代P3。。。。。。
	 JB        ACC.2,OVER
	  ;SETB      LED
OVER:    MOV       R0,#0X77            ;DELAY LARGER THAN 240US             
         DJNZ      R0,$
 	 RET

;WRITE DS18B20 SUBPROGRAM
WRITED:  MOV       R2,#0X08            ;8 bit
R:       CLR       TEMP                ;write slot start
         NOP 
         JNB       ACC.0,LL            ;write 1?   
         SETB      TEMP                ;write 1
LL:      MOV       R0,#30              ;DELAY ABOUT 65US FOR DS. SAMPLE
         DJNZ      R0,$
         SETB      TEMP                ;P3.2=1
         RR        A                   ;READ 1 BIT IN A
  	 NOP
         DJNZ      R2,R
         SETB      TEMP                ;P3.2=1
         RET

;READ DS18B20 
READD:   MOV       R2,#0X08            ;READ 8 BIT
         SETB      TEMP                ;看可以省略不
RE:      NOP
         CLR       TEMP                ;START READ SLOT
         NOP                           ;DELAY >1US
	 NOP
	 SETB      TEMP                ;设P3.2为输入口
	 MOV       R0,#4               ;延时
	 DJNZ      R0,$
	 MOV       C,TEMP              ;读数据(在下降沿15US内)
         RRC       A                   ;把读到的数据放到A
         MOV       R0,#25              ;READ SLOT >60US
         DJNZ      R0,$
         DJNZ      R2,RE               ;READ 1 BYTE?
         SETB      TEMP
         RET
;DS18B20 END

;DISPLAY THE BUFFER
DIS:  	MOV        A,BUFFER               ;THE LOW BYTE OF CONVERT TEMP
        ANL        A,#0XF0
	SWAP       A
	MOV        B,A
	MOV        A,BUFFER+1             ;THE H BYTE OF CONVERT TEMP
	ANL        A,#0X0F
	SWAP       A
	ORL        A,B                    ;A中为16进制温度
	MOV        B,#10 
	DIV        AB                     ;转换成BCD码显示
	ANL        A,#0X0F
	ORL        A,#0X10                ;十位显示
	MOV        P1,A
	MOV        R6,#0X032              ;ABOUT 100US
        DJNZ       R6,$
	MOV        A,B	
	ANL        A,#0X0F
	ORL        A,#0X20                 ;个位显示
	MOV        P1,A
	MOV        R6,#0X032
        DJNZ       R6,$
   	MOV        P1,#0X00     
        RET

UART:   PUSH       PSW
        JNB        TI,NRCE
        CLR        TI
	SJMP       ED
NRCE:   CLR        RI
        CLR        FLAG.4
        MOV        @R1,SBUF
	INC        R1
	MOV        A,R1
	CJNE       A,#BUFF+15,EE
	MOV        R1,#BUFF
EE:	INC        R7
ED:     POP        PSW
        RETI

TIMER0: PUSH      PSW
        CLR       EA
        PUSH      ACC	
        CLR       TF0                 ;第一次进来不对FLAG。4做判断且清0。区分正常的返回与数据传送
       	INC       R5                  ;等待传送数据的时间段
	CJNE      R5,#0X01,FIR
	SETB      FLAG.4              ;第一次进入,由于有其他模块的查询回应所以清零
	SJMP      RETUR
FIR:	JNB       FLAG.4,CL           ;是否有其他模块传送数据
TFIR: 	MOV       A,R5
	CJNE      A,#MODE,RETUR
	SETB      FLAG.5              ;开始传送缓冲区数据
CL:     CLR       TR0                 ;清除TIMER0及R5等待时间段计数,等待下一次巡检
        MOV       R5,#0X00
	MOV       TL0,#0XC0           ;#0XC0	
RETUR:  POP       ACC 
        SETB      EA   
	POP       PSW
        RETI
        END

⌨️ 快捷键说明

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