⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plji.c

📁 单片机接口技术实用子程序配套源代码:里面有许多基本实用的例子
💻 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(); 
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -