?? 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 + -