下面是我大学时用过的一个频率计程序,你可以只
使用 T0 和 T1 的部分代码,使用 12MHz 晶体,测量
频率范围为:0Hz-400KHz,精度为 1Hz。
STATE_8279 EQU 0301H ;命令口地址
DATA_8279 EQU 0300H ;数据口地址
TIME_STATE_8279 EQU 32H ;20 分频
KEY_DISP_STATE EQU 00H ;显示方式命令字,8
字符左边输入,编码扫描键盘,双键锁定
CLR_STATE EQU 0D1H ;清除命令字
READ_FIFO_RAM EQU 40H ;
OUPT EQU P3.0
CLK EQU P3.1
TIME DATA 30H
ORG 0000H
LJMP START1
ORG 000BH ;定时器/计数器 0 用于计数
INC 41H ;用于计数溢出累加
RETI
ORG 001BH ;定时器/计数器 1 用于定时
LJMP STOP
;初始化 8279
START1:
INIT8279: MOV DPTR, #STATE_8279
MOV A, #CLR_STATE
MOVX @DPTR,A
WAIT: MOVX A, @DPTR
JB ACC.7,WAIT
MOV A, #TIME_STATE_8279
MOVX @DPTR,A
MOV A, #KEY_DISP_STATE
MOVX @DPTR,A
;8279 初始结束
;|---------------------------------------|
MOV TMOD, #15H ;|GATE| C/T| M1 | M0 |GATE|
C/T| M1 | M0 |
MOV TH1 , #4CH ;15535
MOV TL1 , #0AFH
MOV TIME, #20 ;50ms*20=1000ms
MOV 42H , #0
MOV TH0 , #00H
MOV TL0 , #00H
MOV IE , #8AH ;开 T0、T1 的中断
MOV TCON, #50H ;定时计数开始
MOV SP , #80H
MOV A , #0
MOV R0 , #10 ;显示缓冲个数
MOV R1 , #7FH ;清显示缓冲区
CLR 22H
CLR 23H
CLR 24H
CLR_DAT: MOV @R1 , A
DEC R1
DJNZ R0 , CLR_DAT
MOV 7FH , #00H
LCALL DISP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONT_D:
LCALL DIVRAT
HELLO: LCALL DISP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TEXT_D: JBC 20H , CONT_D ;数据刷判断
SJMP TEXT_D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 定时器/计数器 1 中断子程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STOP: DJNZ TIME, OUT ;一秒时间到了没了,没
到继续计时
MOV TCON, #0 ;时间到了停止时时
MOV 42H , 41H ;频率的高字节
MOV 43H , TH0 ;频率的中间字节,保存计数值
MOV 44H , TL0 ;频率的低字节
MOV TH0 , #0 ;计数器重赋初值
MOV TL0 , #0
MOV 41H , #0 ;计数溢出累加单元清零,为一下次
测量做准备
MOV TL1 , #0AFH
MOV TH1 , #3CH
MOV TCON, #50H ;重新开启计数和定时
MOV TIME, #20 ;50ms*20=1000ms
SETB 20H ;设置显示刷新位,防止刷新次数过多,
只有在测量后才刷新一次
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;运行状态显示,即每测量一次刷
新一次
MOV A , #9