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

📄 wspilm74.asm

📁 C8051F.rar
💻 ASM
字号:
;参考程序B:;WSPILM74.ASM  2005.9.15
$include (c8051f020.inc) 
 PPA 	          EQU 	8000H    ;8255的端口地址,8255驱动数码管显示温度值
 PPB 	          EQU 	8001H    ;8255驱动数码管显示LM74测量出的温度值
 PPC 	          EQU 	8002H    ;LM74是高精度数字式温度传感器
 CWR            EQU 	8003H   
    	ORG  0000   ;为提高程序运行效率,数据传输采用中断方式。
 			LJMP MAIN
			ORG  033H        ;SPI中断程序入口
			LJMP  SPI_ISR
			ORG 0B3H
MAIN: LCALL INIT1            ;调初始化程序
ABC:  MOV   R4,#2            ;要从LM74读入的数据有两个字节
      SETB  EA				        ;CPU开中断
      MOV A,EIE1
      ORL A,#01
      MOV EIE1,A      	   ;置ESPI0位为1,允许SPI申请中断          
      MOV   R1,#40H	 	     ;数据接收区首地址.
		CLR   P0.7
		ACALL  DEL0 
MOV  SPI0DAT,A	;启动SPI发送,才会产生SCK.不启动SPI发送,就没有时钟SCK出现
ACALL  DEL0   ;中断服务程序从MISO端接收来自LM74的高8位(MOV  A,SPI0DAT)
MOV  SPI0DAT,A	;启动SPI发送,才会产生SCK
ACALL  DEL0    ;中断服务程序从MISO端接收来自LM74的低8位(MOV  A,SPI0DAT)
CJNE    R4,#0,ABC
SETB   P0.7   
LCALL  EXHH      ;整理温度数据
ABD:	LCALL  DISPLED   ;显示温度数据
      SJMP  ABC			        ;连续测量温度值
;中断服务程序:
SPI_ISR:PUSH ACC
		 PUSH PSW
        CLR     SPIF
        DJNZ    R4,BA 	          ;是否接收到2个数?未完转中断返回
        MOV     A,EIE1            ;已完,置ESPI0位为0,
        ANL     A,#0FEH
        MOV     EIE1,A      	    ;置ESPI0位为0,禁止SPI申请中断
BA:	 MOV     A,SPI0DAT
        MOV     @R1	,A		 ;取下一个数
        INC     R1   
BACK:   POP PSW
        POP ACC
	      RETI
EXHH:    MOV  A,41H     ; 2x(41h)+2x(40h)
         RLC  A
         MOV  A,40H
         RL   A
         ADDC A,#0
         ACALL   EXCH   ;将温度值由二进制数转化为十进制数.
         MOV  7DH,#0    ;          
         MOV  A,41H
         ANL  A,#40H
         CJNE A,#40H,PP1     ;加小数点
         MOV  7DH,#5H
	 PP1:  MOV  7EH,#0CH
	       MOV  79H,#0
	       MOV   A,40H        ;从40H最高位位符号判别位,
		   ANL   A,#80H
		   CJNE  A,#80H,PP2   ; 正号:79H<--#0
		   MOV   79H,#40H     ;负号: 79H<--#40H ("-")
  PP2:   RET 
 WR_8BIT:MOV    SBUF0,A
          JNB   TI,$
          CLR   TI
          RET
INIT1: MOV WDTCN, #0DEH  ;禁止看门狗
    MOV WDTCN,#0ADH
    MOV SPI0CFG ,#11000111B ;选择在时钟的第2个边沿采样,
			 ;SCK的空闲状态为高电平,移位数为8位
    MOV SPI0CN,#00000011B    ;允许主方式,允许SPI
    MOV SPI0CKR,#39 ;按照SPI0CKR的计算公式,选择SPI0CKR中的值应该为39
    MOV OSCICN,#00010110B;选择内部振荡器,按IFCN指定的频率运行,频率为8MHz
    MOV XBR0,#02
	  SETB  P0.7   ;选择P0.0~P0.3分别为SPI接口的SCK、MISO、MOSI和NSS
     MOV XBR1,#0 
	MOV P0MDOUT,#00000000B ;选择SCK、MOSI和NSS为推拉式输出,MISO为开漏式.
   MOV XBR2,#40H ;允许功能选择开关有效
	MOV   0B5H,#0C0H       ;设置P7为推拉模式,P4.N.P6为漏极开路
   MOV   0A3H,#2CH         ;EMIF工作在地址/数据复用方式,只用外部存储器,
                           ;  ALE高/低脉宽占1个SYSCLK周期
   MOV   0A1H,#6DH  ;地址建立/保持时间占1个SYSCLK周期,/WR和/RD占12
                     ;个SYSCLK周期
   RET     
EXCH  : MOV     B,#10    ;将温度值由二进制数转化为三位十进制数
        DIV     AB
        MOV     7CH,B  ;   7AH存百位数
        MOV     B,#10
        DIV     AB
        MOV     7AH,A  ;   7BH存十位数
        MOV     A,B
        MOV     7BH,A 
        MOV     A,7CH   ;   7CH存个位数
        MOV     7CH,A
        RET 
DEL0:MOV R6,#0FH
TM:  MOV R7,#0FFH
     DJNZ R7,$
     DJNZ R6,TM
     RET
;长延时子程序
DELY:MOV R5,#0FFH
TTM1: ACALL DEL0
      DJNZ R5,TTM1
      RET
DELYL:MOV R5,#0FFH
TTM2:CALL DEL0
     DJNZ R5,TTM2
     RET  
;TEMP: DB 54H,45H,4DH,50H,3AH,20H        
;初始化I/O口
	;显示功能子程序:被显示的数据在79H,7AH,7BH,7CH,7DH,7EH中
DISPLED:  ACALL   C8255    ;格式样品:     +/-029.5C
  MOV	R2,#01H
	MOV	R5,#6
	MOV	R0,#79H
DSP1:	MOV	DPTR,#PPB
	MOV	A,R2
	MOVX	@DPTR,A
	MOV	A,@R0
  ANL  A,#0FH
DSP2:	MOV	DPTR,#BCD
     	MOVC	A,@A+DPTR
      MOV   B,A
      MOV	DPTR,#PPC
      MOV   A,R5
      CJNE A,#3,SS0
      MOV  A,B
      ADD   A,#80H
      AJMP   SS1
 SS0: MOV   A,B
 SS1: MOVX	@DPTR,A
	    ACALL   DEL0
	    MOV	A,R2
    	RL	A
	    MOV	R2,A
	INC	R0
	DJNZ	R5,DSP1
	RET
BCD:    DB      3FH,06H,5BH,4FH ;显示数值,0,1,2,3
        DB      66H,6DH,7DH,07H           ;4,5,6,7
	     DB 	7FH,6FH,77H,7CH           ;8,9,A,B
	     DB 	39H,5EH,79H,71H           ;C,D,E,F
	     DB 	73H,3EH,31H,6EH           ;P,U,Z,Y
	     DB      0FFH,00H                  ;8,灭     
C8255:	MOV	A,#80H      ; 设置PC口,PB口为输出,PA口为输入
	    MOV 	DPTR,#CWR       ;#8003H为8255的控制寄存器地址
	    MOVX	@DPTR,A
	    RET
       END

⌨️ 快捷键说明

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