?? wfrequence.asm
字號:
;參考程序B WFrequence.ASM 此程序運行前將S3的第2和第4撥碼開關撥到ON,用跳線將T0和P0.0短接,撥碼開關S1打開任一方波信號通道(2000KHZ,1000KHZ,500KHZ,250KHZ);T0作為外部計數器,T1作為定時器,T1定時在1ms范圍內察看計數器T0所計的數。計算出被測信號的頻率并顯示在8255驅動的LED數碼管上. 在定時1ms范圍內察看計數器T0所計的數: 2000D=07D0H, 1000D=03E8H, 500D=1F4H, 250D=0FAH.
$include (c8051f020.inc) ;SFR定義
PPA EQU 8000H ;8255的端口地址
PPB EQU 8001H
PPC EQU 8002H
CWR EQU 8003H
P31 EQU P3.1
ORG 0
LJMP main
ORG 0BH
LJMP TIMER0_ISR ;T0中斷入口
ORG 1BH
LJMP TIMER1_ISR ;T1中斷入口
ORG 100H
main: MOV SP,#50H
MOV WDTCN,#0deH ;無效看門狗
MOV WDTCN,#0adH
MOV 0E3H,#40H; /*使能交叉開關,弱上拉*/
MOV 0B5H,#0FFH ;/*設置P7,P6,P4,P5為推拉模式
MOV 0A3H,#2CH ;EMIF工作在地址/數據復用方式,只用外部存儲器,ALE高/
;低脈寬占1個SYSCLK周期
MOV 0A1H,#6DH ;地址建立/保持時間占1個SYSCLK周期,/WR和/RD占12個SYSCLK
;周期
LCALL SYSCLK_Init ;初始化時鐘
LCALL PORT_Init ;初始化交叉開關和IO口
LCALL Time01_Init ;初始化定時器0/1
SA: CLR P31 ;清P3.1,起動計數
SETB EA ;開總中斷
SETB TR1 ;開定時器1,計時一毫秒1ms后產生T1中斷
SETB TR0 ;開定時器0
SS: JNB F0,$
ACALL DISPLED
CLR F0
AJMP SA
RET
;初始化外部11.0592MHz作為系統時鐘
SYSCLK_Init:
MOV OSCXCN, #67h ;使能外部晶體
;震蕩在11.0592MHz
CLR A ;等待最少1ms
DJNZ acc, $ ;等待512us
DJNZ acc, $ ;等待512us
osc_wait: ;查詢XTLVLD-->1
MOV a, OSCXCN
JNB acc.7, osc_wait
ORL OSCICN, #08h ;選擇外部晶體作為系統時鐘
RET
;初始化I/O口
PORT_Init:
MOV XBR0,#00H
MOV XBR1,#02H ;交叉開關使能T0
MOV XBR2,#40H ;使能交叉開關和弱上拉
; ORL P3MDOUT,#0ffH ;P3口推挽輸出
RET
;定時器0/1初始化
Time01_Init:
CLR EA ;關總中斷
CLR TR0 ;關計數器T0
CLR TR1 ;關定時器 T1
MOV IE,#0AH ;允許TF1/TF0標志位(TCON.7/TCON.5)的中斷請求
MOV TMOD,#15H ;定時器T1是16位定時器方式,T0是16為計數器方式
MOV IP,#08H ;定時器T1是高優先級中斷
MOV CKCON,#10H ;定時器T1的時基是系統時鐘
MOV TH1, #0d4H ;FFFFH-D4CDH=2B23H=11059D
MOV TL1, #0cdh ;T1定時:11059/11.0592MHZ=1000us=1ms
RET
;計數器T0中斷服務子程序
TIMER0_ISR:
CLR TF0 ;清中斷標志
RETI
;定時器T1中斷服務子程序
TIMER1_ISR:
CLR TF1 ;清中斷標志
CLR TR1 ;關定時器1
;Frequence=TH0*0x100+TL0; ;外部脈沖數 單位 KHz
CLR TR0
ACALL EXCH ;整理數據
MOV TH0,#00H
MOV TL0,#00H
MOV TH1, #0d4H ;定時器1使用系統時鐘的1/12分頻
MOV TL1, #0cdH
SETB TR1 ;使能定時器1
SETB TR0 ;使能定時器0
SETB F0
RETI
EXCH: MOV A,TH0 ;LED顯示7AH-7DH中的內容
ANL A,#0FH
MOV 7BH,A
MOV A,TH0
SWAP A
ANL A,#0FH
MOV 7AH,A
MOV A,TL0
ANL A,#0FH
MOV 7DH,A
MOV A,TL0
SWAP A
ANL A,#0FH
MOV 7CH,A
MOV 7EH,#10H
RET
;顯示功能子程序
DISPLED: ACALL C8255
MOV R2,#01H ;字位選擇在R2中
MOV R5,#5 ;共顯示5個字符
MOV R0,#7AH ;顯示內容存放在7AH,7BH,7CH,7DH,7EH中.
DSP1:MOV DPTR,#PPB ;PPB=8001H,字位選擇
MOV A,R2
MOVX @DPTR,A
MOV A,@R0
DSP2: MOV DPTR,#BCD ;查表,BCD是表頭
MOVC A,@A+DPTR ; 查出要顯示的數據
MOV DPTR,#PPC
MOVX @DPTR,A
ACALL DELY
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 76H,3EH,31H,6EH ;H,U,Z,Y
DB 0FFH,00H ;8,滅
C8255: MOV A,#80H ; 設置PC口,PB口為輸出,PA口為輸入
MOV DPTR,#CWR ;#8003H為8255的控制寄存器地址
MOVX @DPTR,A
RET
DELY: MOV 08H,#0FH ;延時子程序
TM: MOV 07H,#0FFH
DJNZ 07H,$
DJNZ 08H,TM
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -