频率计设计思路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总体:先用测频法测得一个数据,然后判断F<100HZ ? ,否就送数码管显示,是就转用测周法再次测量,然后显示。
测频法:Fx=N/T , T 为定时时间,N 为T 时间内统计的脉冲个数。
编程:定一个时间,在设定时间内统计被测信号的脉冲个数,时间到,取出N->N/T。
测周法:Fx=1/Tx ,Tx=N*Tc , 12M晶振时,机器周期Tc=0.000001s 。
编程:在一个被测周期内,统计系统时钟的个数N,然后*0.000001s 就是Tx,再倒数就是被测频率值。外部中断INT0或INT1 设置成下降沿中断,两个下沿之间就是一个Tx ; 或者两个计数器计数模式溢出中断中断之间也是一个Tx 。一个Tx后取出计数器里面的值N , N*0.000001s->Tx 。
(思路仅供参考!)
定时器T0,T1工作模式:
定时模式时,计数器对系统时钟计数,每一个机器周期,计数器加1,直到记满溢出。计数模式时,计数器对来自外部P3.4( T0 ) , P3.5( T1 )的脉冲计数,每来一个下降沿,计数器加1,直到记满溢出。(这些课本里都有的)
可以参考人家的思路:
/***************************************************************************
标题:51频率计
说明:通过对信号在1s内的脉冲计数值求得频率,并通过数码管显示结果
工作于:L Y5A-L2A开发板
作者:YangTing
日期:2012年4月9日
备注:使用12M晶振,频率量程<10000Hz
******************************************************************************/
TIMER_H EQU 46H ;定时器高位字节单元
TIMER_L EQU 47H ;定时器低位字节单元
TIMCOUNT EQU 48H ;时间中断数
INT_H EQU 45H ;T1计数缓冲单元高地址
INT_L EQU 44H ;T1计数缓冲单元低地址
;脚功能定义
SMG_q EQU P1.0 ;定义数码管阳级控制脚,千位
SMG_b EQU P1.1 ;定义数码管阳级控制脚,百位
SMG_s EQU P1.2 ;定义数码管阳级控制脚,十位
SMG_g EQU P1.3 ;定义数码管阳级控制脚,个位
;数据存放
ORG 0100H
TABLE: DB 0C0h,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H
;共阳数码管0-9
ORG 0000H
LJMP START
ORG 000BH
JMP T0_interrupt
ORG 0200H
;-------------------------------------------------------------
;主程序
;-------------------------------------------------------------
START: LCALL PRO_init
LCALL TIM_set
LOOP:
MOV R0,INT_H
MOV R1,INT_L
LCALL HEX2BCD
MOV A,R4
MOV B,#16
DIV AB ;除以16,目的是分离出高、低四位
MOV R1,A ;存放十位
MOV R0,B ;存放个位
MOV A,R2
MOV A,R3
MOV B,#16
DIV AB
MOV R3,A ;存放千位
MOV R2,B ;存放百位
LCALL DISPLAY
JMP LOOP
;---------------------------------------------------------
;初始化程序
;---------------------------------------------------------
PRO_init:
MOV A,#00H
MOV B,#00H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV INT_H,#00H
MOV INT_L,#00H
MOV TIMCOUNT,#00H
MOV TIMER_H,#3CH ;定时50 MS
MOV TIMER_L,#0B0H
SETB P3.5 ;P3.5端口(T1)置输入状态
RET
;--------------------------------------------------------
;定时/计数器设置
;T0,T1均工作于方式1,T0用于定时,T1用于脉冲计数
;--------------------------------------------------------
TIM_set:
MOV TMOD,#0D1H ;T0,T1模式设置
MOV TH0,TIMER_H ;设置定时初值高位
MOV TL0,TIMER_L ;设置定时初值低位
MOV TH1,#00H ;清T1计数器
MOV TL1,#00H
MOV IE,#82H ;开总中断,开T0中断
SETB TR1 ;计数器T1开始工作
SETB TR0 ;定时器T0开始工作
RET
;-------------------------------------------------------
;十六进制数转十进制
;-------------------------------------------------------
HEX2BCD:
CLR A
MOV R2,A ;先清零
MOV R3,A
MOV R4,A
MOV R5,#16 ;共转换十六位数
ELOOP:
CLR C
MOV A,R1 ;从待转换数的高端移出一位到Cy
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4 ;送到BCD码的低端
ADDC A,R4 ;带进位加。自身相加,相当于左移一位
DA A ;十进制调整,变成BCD码
MOV R4,A