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