当前位置:文档之家› 基于单片机的等精度频率计的设计

基于单片机的等精度频率计的设计


图 1 频率计时序图
同步门时间T = N x ⋅ Tx = N 0 ⋅ T0
fx =
1 Nx = f0 Tx N 0
2、等精度频率计流程图
Page 1 of 6
等精度频率计设计
图 2 T0、T1 中断流程图图 3 主函数流程图Page 2 of 6
等精度频率计设计
图 4 电路简图
四.实验结果:
五.程序清单: #include <reg52.h> #include <stdio.h> #include <string.h>
Page 3 of 6
等精度频率计设计
//*****变量定义******// unsigned int st_count,signal_count; //st_count 为时标软件计数器, signal_count 为被测信号计 数器 float gate_count,gate_time; bit gate_flag; //闸门时间标志位 //*****定时器初始化******// void ini_T0T1() { TMOD=0x62; //计数器 1,方式 2,自动重装方式;定时器 0,方式 2,自动重装 方式 //最大定时时间 T_max=(2^8)*12/晶振值(22118400),此例中若定 时 1s 需要进中断 7200 次 TH1=0;TL1=0; //计数器 1 设置初值为 0 TH0=0;TL0=0; // 定 时 器 0 设 置 初 值 为 0, 定 时 时 间 最 长 T_max=256*12/(22118400),单位 s } //*****定时器 0 中断*****// void timer0() interrupt 1 { st_count++; //时标软件计数器加 1 if(st_count>gate_count) //判断闸门时间到否,到则闸门时间标志置 1 gate_flag=1; //标志位置 1,表示闸门时间到 } //*****计数器 1 中断*****// void timer1() interrupt 3 { signal_count++; //被测信号计数器加 1,计数信号来自外部引脚,负跳变 } //*****串口初始化*****// void ini_com(void) //T2 定时器产生波特率为 115200 { //SM0=0;SM1=1; //串行口工作方式 1 //REN=1; //允许接收 SCON=0x50; //T2CON=0x34; //T2 定时器作为波特率发生器 RCLK=1;TCLK=1; TR2=1; //定时器 2 开始 RCAP2H=0xff; RCAP2L=0xfa; // 波 特 率 =22118400/32 × [65536-(RCAP2H,RCAP2L)], 其 中
Page 4 of 6
等精度频率计设计
RCAP2H,RCAP2L 为自动重装值,(RCAP2H,RCAP2L)=65536-22118400/(32×波特率) TH2=0xff; TL2=0xfa; //波特率:115200 晶振=22.1184MHz } //*****串口数据传送*****// void transmit_byte(unsigned char send_byte) { SBUF=send_byte; while(TI==0); //当数据没传完时,TI=0,等待. TI=0; //TI=0,软件清零 } void main () { float N_x,N_0,fx; unsigned char freq[10],i,j; unsigned char Hz[3]={'H','z',' '}; st_count=0; signal_count=0; TH1=0;TL1=0; TH0=0;TL0=0; gate_flag=0; ini_T0T1(); ini_com(); EA=1;ET0=1;ET1=1;
等精度频率计设计
等精度频率计设计报告
一.实验目的: 1. 熟悉 C 语言在 51 系列单片机系统开发中的应用。 2. 熟练掌握 Keil 的使用方法,能够实现利用 Keil 进行程序设计。 3. 掌握串口初始化以及串口数据发送的程序设计。 4. 掌握等精度频率计的设计思想以及方法。 二.实验要求: 要求:设计一个等精度频率计,要求能够准确、实时测量输入 T12 测频点(详见原理 图)的信号频率。 三.实验原理: 1、 将需累加计数的信号 (频率测量时为被测信号, 时间测量时为时标信号) , 由一个“闸 门”(主门)控制,并由一个“ 门控”信号控制闸门的开启(计数允许)与关闭(计数停 止) 。
Page 5 of 6
等精度频率计设计
//***闸门设定时间到,fx 信号上升沿到,关闭闸门***// while(gate_flag==0); //闸门设定时间到 while(T1==1); while(T1==0); //fx 信号上升沿到,信号来自外部引脚 TR1=0;TR0=0; //关闭闸门 关闭计时器 1 和定时器 0 //***计算频率***// N_0=(float)st_count*256+TL0; N_x=(float)signal_count*256+TL1; fx=(N_x/N_0)*22118400/12; //*****数据输出到串口*****// sprintf(freq,"%.3f",fx); for (i=0;i<strlen(freq);i++) transmit_byte(freq[i]); for(j=0;j<3;j++) transmit_byte(Hz[j]); } }
Page 6 of 6
//计数器 1 清 0 //定时器 0 清 0
//T0,T1 初始化 //串口初始化 //中断允许
gate_time=1; //设置闸门时间 gate_time 为 1s gate_count=gate_time*22118400/(256*12); //进入中断 0 的次数 gate_count,即定时时长. while(1) { //***T0,T1 清零,软件计数器清零***// TH1=0;TL1=0; //计数器 1 清 0 TH0=0;TL0=0; //定时器 0 清 0 st_count=0; signal_count=0; gate_flag=0; //标志位 //***fx 信号上升沿到,打开闸门***// while(T1==1); while(T1==0); //fx 信号上升沿到,信号来自外部引脚 TR1=1;TR0=1; //打开闸门 打开计时器 1 和定时器 0
相关主题