单片机频率计C程序

来源:本站
导读:目前正在解读《单片机频率计C程序》的相关信息,《单片机频率计C程序》是由用户自行发布的知识型内容!下面请观看由(电工学习网 - www.9pbb.com)用户发布《单片机频率计C程序》的详细说明。

//---------函数声明,变量定义--------------------------
#include <reg51.h>
sbit GATE=P3^0; //预制门限
sbit CLR =P3^1; //请零
sbit RGATE=P3^2; //实际门限
sbit SEL0=P3^4; //数据选择位0
sbit SEL1=P3^5; //数据选择位1
sbit SEL2=P3^6; //数据选择位2
#define data_in P1
unsigned char Nx[4]; //待测频率计数值
unsigned char Ns[4]; //标准频率计数值
unsigned char GATE_time=1; //门限时间,预定义为1S
unsigned char time_count;
bit PRE_judge=1;
//-----------------------变量声明---------------------------------------------------------------------
void system_init(void ); //初始化,设置定时器0的工作方式,供主程序调用
void TIMER0_SCANkey(); //定时器0中断处理函数

//--------------------------------------------------------------------------------------------------
// 函数名称: system_init()
// 函数功能: 初始化设置
// 设定INT0的工作方式
//--------------------------------------------------------------------------------------------------
void system_init(void )
{
TMOD=0x01; //定时器0工作在方式1
ET0=1; //定时器0中断允许
TH0=-5000/256; //12M时钟时,定时0.01秒
TL0=-5000%256;
TR0=1; //定时器0开始计数
EA=1; //系统中断允许
}
//--------------------------------------------------------------------------------------------------
// 函数名称: read_result
// 函数功能: 将计数值读出到Nx、Ns
//--------------------------------------------------------------------------------------------------
void read_result()
{
GATE=0;
while(RGATE); //等待实际门限的结束
SEL0=0;
SEL1=0;
SEL2=0;
Nx[0]=data_in; //SEL=000
SEL0=1;
Nx[1]=data_in; //001
SEL1=1;
Nx[3]=data_in; //011
SEL0=0;
Nx[2]=data_in; //010
SEL0=0;
SEL1=0;
SEL2=1;
Ns[0]=data_in; //100
SEL0=1;
Ns[1]=data_in; //101
SEL1=1;
Ns[3]=data_in; //111
SEL0=0;
Ns[2]=data_in; //110
}
//--------------------------------------------------------------------------------------------------
// 函数名称: judge_Prage
// 函数功能: 判断频率范围,
// 大于1M 即Nx>0x00 0F 42 40, GATE=1
// 小于1M大于1k即0x00 00 03 E8<Nx<0x00 0F 42 40,GATE=5
// 小于1k 即 Nx<0x00 00 03 E8, GATE=10
//--------------------------------------------------------------------------------------------------
void judge_Prage()
{
if((Nx[3]==0)&&(Nx[2]==0))
if((Nx[1]<3)||((Nx[1]==3)&&(Nx[0]<0xE8)))
GATE_time=10;
else GATE_time=5;
else if((Nx[3]==0)&&(Nx[2]<0x0f))
GATE_time=5;
else if((Nx[3]==0)&&(Nx[2]==0x0f))
if(Nx[1]<0x42)
GATE_time=5;
else if((Nx[1]==0x42)&&(Nx[0]<0x40))
GATE_time=5;
else
GATE_time=1;
else GATE_time=1;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: calcu_Fx
// 函数功能: 计算频率,根据Fx=(Nx/Ns)Fs 计算结果
//--------------------------------------------------------------------------------------------------
void calcu_Fx()
{

}
//--------------------------------------------------------------------------------------------------
// 函数名称: TIMER0_intrupt
// 函数功能: 定时器0中断处理程序
//--------------------------------------------------------------------------------------------------
void TIMER0_intrupt() interrupt 1 using 1
{
EA=0; //系统中断禁止
GATE=1;
TH0=-5000/256; //12M时钟时,定时0.01秒
TL0=-5000%256;
time_count++;
if(++time_count==100) GATE_time--;
while(GATE_time==0)
{
GATE=0;
read_result();
if(PRE_judge) //预测,判断频率范围
{
judge_Prage();
PRE_judge=0;
if(GATE_time) //如果频率大于1M,直接计算,无须再测
calcu_Fx();
}
else
calcu_Fx(); //不是预测,直接计算结果
}
EA=1;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主函数
//--------------------------------------------------------------------------------------------------
void main()
{
CLR=0;
GATE=1;
system_init();
}

提醒:《单片机频率计C程序》最后刷新时间 2023-07-10 03:57:25,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机频率计C程序》该内容的真实性请自行鉴别。