📄 wspilm74.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 + -