频率计设计思路

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档