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

📄 pinlv.c

📁 (可存5个频率数据. 利用记数器1记数,定时器0定时.)
💻 C
字号:
/*********************************************************************************
频率计程序    
可存5个频率数据.
利用记数器1记数,定时器0定时.
*********************************************************************************/

#include<AT89X52.H> //头文件//

//全局变量定义
unsigned int bittime=0,k=0,ds=0;//计数变量
double F=0;//频率
double T=0;//周期
double TORF=0;//要显示数的中间数据
bit tf=0;//状态变量 tf=0 显示频率/tf=1显示周期;
unsigned int disp=0;//显示的数值
unsigned long datas=0;//测量中间数据保存
unsigned long savedata[5]={0,0,0,0,0};//测量数据存储(最多存5个)
unsigned int dp=0;//小数点位置控制变量
//数码字型表
//unsigned char code seg7code[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*0~9*/
                               
unsigned char code seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
                              
//端口定义
sbit L0=P2^0;//hz/us 单位标识灯
sbit L1=P2^1;//khz/ms   单位标识灯
sbit L2=P2^2;//灯亮则显示的是周期
sbit L3=P2^3;//上下限报警灯
sbit k1=P1^4;//频率和周期切换键
sbit k2=P1^5;//存储键
sbit k3=P1^6;//显示存储的数据
sbit k4=P1^7;//返回测量程序
//函数声明
void datadeal(void);//数据处理(量程显示转换)
void keyset(void);//按键设定处理
void delay(unsigned int i);//延时
void display(void);//显示

//主程序//
void main (void)  
{ 
//端口初始化
    P0=0xff;
        P1=0xff;
        P2=0xff;
        P3=0xff;
        //定时/计数器初始化
    TMOD=0x51;
        TH0=0x3c;//(65536-50000)/256;定时50ms  0x3c
        TL0=0xb0;//(65536-50000)%256           0xb0
    IP=0x08;//设置T1为高优先级
    EA=1;
        ET0=1;
        ET1=1;
        TH1=0;
        TL1=0;
        TR0=1;
        TR1=1;
    while(1)//死循环
    {   
        keyset();//安键设定处理
        display();//显示
    }
}


//定时中断服务程序//                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
void timer0(void) interrupt 1 using 1  
{
        bittime++;
    if(bittime==19)//1秒时间到
        {   
            TR1=0;
                TR0=0;
                L0=1;
                L1=1;
        //dp=0;//清零
            F=k*65536+TH1*256+TL1;//频率值
                if(F>500000||F<1)//判断是否超限
                    L3=0;
                else 
                    L3=1;
        datas=F;//频率暂存变量

                k=0;//清零
                bittime=0;//清零
                datadeal();//数据处理
                TH1=0;
                TL1=0;
                TR1=1;
        }

    TH0=0x3c;//(65536-5000)/256;定时50ms
    TL0=0xb0;//(65536-5000)%256;
    TR0=1;
   
}

//T1计数器中断服务程序//
void timer1(void) interrupt 3 using 1
{
    TH1=0;
    TL1=0;
    k++;  
}



void delay(unsigned int i)//延时
{
    while(i!=0)
    {
            unsigned int j;
                for(j=0;j<100;j++);
                i--;
        }
}

/*数据处理(量程显示转换),频率0~9999999HZ,周期0~9999999微秒*/
void datadeal(void)                
{  
 
if(F!=0)                      
    T=1000000/F;//计算周期:单位为us
if(tf==0)
    TORF=F;
else
    TORF=T;

    if((TORF>0)&&(TORF<=9))//一位
    {   
        TORF=TORF*1000;
        dp=1;//1.000~9.000hz
        L0=1;//hz/us
        L1=0;
    }
    else 
      if((TORF>=10)&&(TORF<=99))//两位
        {
            TORF=TORF*100;
            dp=2;//10.00~99.00hz
            L0=1;//hz/us
            L1=0;
        }
        else
          if((TORF>=100)&&(TORF<=999))//三位
            {
                TORF=TORF*10;
                dp=3;//100.0
                L0=1;//hz/us
                L1=0;
            }
            else
              if((TORF>=1000)&&(TORF<=9999))//四位
                {
                    TORF=TORF*1;
                    dp=1;//1.000
                    L0=0;//khz/ms
                    L1=1;
                 }
                else 
                  if((TORF>=10000)&&(TORF<=99999))//五位
                    {   

                        TORF=TORF/10;//取高四位
                        dp=2;//10.00
                        L0=0;//khz/ms
                        L1=1;
                    }
                    else 
                      if((TORF>=100000)&&(TORF<=999999))//六位
                        {   

                            TORF=TORF/100;//取高四位
                            dp=3;//100.0
                            L0=0;//khz/ms
                            L1=1;
                        }            //51单片机速度有限,最高测500KHZ
                        /*
						else
                          if((TORF>=1000000)&&(TORF<=9999999))//七位
                            {   
   
                                TORF=TORF/1000;
                                dp=4;//1000.
                                L0=0;//khz/ms
                                L1=1;
                            }  
   						    */
						   else 
						     if(TORF>=1000000)//超范围时显示9999
							   {
							   TORF=9999;
							   dp=4;
							   L0=0;
							   L1=0;
							   }
}

/*数码管显示显示,P0段选,P2_0~P2_3片选*/
void display(void)                   
{   
    P2_4=0;//千位
        P2_5=1;
        P2_6=1;
        P2_7=1;
        P0=seg7code[disp/1000];
    if(dp==1)
            P0_7=1;//显示小数点
        delay(6);

        P2_4=1;
    P2_5=0;//百位
        P2_6=1;
        P2_7=1;
    P0=seg7code[(disp%1000)/100];
        if(dp==2)
            P0_7=1;//显示小数点
        delay(6);  

        P2_4=1;
        P2_5=1;
    P2_6=0;//十位
        P2_7=1;
        P0=seg7code[(disp%100)/10];
        if(dp==3)
            P0_7=1;
        delay(6);

        P2_4=1;
        P2_5=1;
        P2_6=1;
    P2_7=0;//个位
        P0=seg7code[disp%10];
        delay(6);           
}

/*按键设定处理*/
void keyset(void)
{   
    unsigned int i;
    if(k1==0)//周期与频率切换
        {   
		delay(3);//去抖动
        if(k1==0)
                {
                tf=!tf;               
                }
        }

if(tf==1)
        L2=1;//周期显示灯亮
else
        L2=0;//周期显示灯灭

disp=TORF;//把要显示的数据放入显示单元

    if(k2==0)//保存数据
        {             
            delay(3);
            if(k2==0)
			{
            savedata[ds]=datas;
                ds++;
                if(ds==5)
                    ds=0;
            //while(k3==0);
			}
        }

    if(k3==0)//显示保存的数据
        {   
            delay(3);
            if(k3==0)
                {
                TR0=0;
                  TR1=0;
                        L0=0;//清单位标志
                        L1=0;
                    F=savedata[ds];
                datadeal();//数据显示预处理
                    ds++;
                    if(ds==5)//只存储五个数据,超过则覆盖前面的数据
                        ds=0;
						tf=0;//显示保存的频率
                }
        }

     if(k4==0)//返回测量状态
        {
            delay(3);
            if(k4==0)
			{
            TR0=1;
                TR1=1;
        
                for(i=0;i<5;i++)
                    savedata[i]=0;//存储区清零
			}
        }       

}

⌨️ 快捷键说明

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