找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2338|回復: 0
打印 上一主題 下一主題
收起左側

發(fā)一個基于STC12C5A60S2單片機的頻率計的代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:1020821 發(fā)表于 2022-4-22 22:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "STC12C5A60S2.h"
//#include <reg52.h>
#define Segment P0
#define sl P2
sbit clear=P1^3;
sbit fp2=P1^2;    //定義數(shù)據(jù)端口地址,0時分頻處理,1時不分頻
unsigned char count;      //定時 1s 計數(shù)
unsigned char d[4];       //對應數(shù)碼管的各位
unsigned char dangwei;    //檔位
unsigned int timeN;       //不同檔位計時值
unsigned int fCount;      //脈沖下降沿次數(shù)
unsigned int regCount;    //脈沖次數(shù)暫存
unsigned int pCount;      //頻率顯示
unsigned char Num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//七段數(shù)碼管代碼共陽極
void Delay(unsigned int DelayTime)
  {
   while(DelayTime--);
  }
void dispbuf()
{
{
  if(dangwei==0)     //檔位
    {
     d[3]=0;
     d[2]=(pCount/100)%10;
     d[1]=(pCount/10)%10;
     d[0]=pCount%10;

     sl=0x01;Delay(1);Segment=Num[d[3]];Delay(200);   
     sl=0x02;Delay(1);Segment=Num[d[2]];Delay(200);
     sl=0x04;Delay(1);Segment=Num[d[1]];Delay(200);
     sl=0x08;Delay(1);Segment=Num[d[0]];Delay(200);
    }
   else if(dangwei==1)
    {
       d[3]=pCount/1000;
       d[2]=(pCount/100)%10;
       d[1]=(pCount/10)%10;
       d[0]=pCount%1;
       sl=0x01;Delay(1);Segment=Num[d[3]];Delay(200);      
       sl=0x02;Delay(1);Segment=Num[d[2]];Delay(200);  
       sl=0x04;Delay(1);Segment=Num[d[1]]&0x7f;Delay(200); //帶小數(shù)點
       sl=0x08;Delay(1);Segment=Num[d[0]];Delay(200);
    }  
else
  {
    d[3]=0;
    d[2]=0;
    d[1]=0;
    d[0]=0;
  }
}
}
void intial()
  {
   clear=1;           //分頻器初始化
   fp2=1;
   timeN=20;          //檔位初始化為 Hz 檔
   dangwei=0;
   TMOD=0x61;       //定時器0,工作方式1,計數(shù)器1,工作方式1
   TH0= (65536-50000)/256;
   TL0= (65536-50000)%256;
                                                    //計數(shù)器1計數(shù)初值
   TH1=0xff;         // 256-1;      
   TL1=0xff;         // 256-1;
   TR0=1;           //開定時器0中斷
   ET0=1;           //定時器0允許
   TR1=1;           //開計數(shù)器1中斷
   ET1=1;           //允許計數(shù)器1中斷
   EA=1;            //總中斷允許
  }
void main()
  {
        intial();
    while(1)
       {
          dispbuf();
       }
  }
void timer0() interrupt 1
  {
   count++;
   if(count==timeN)
    {
     ET1=0;      //計時1s,暫停外部計數(shù)1
     TR1=0;
     count=0;
    regCount=fCount;        //更新顯示
     fCount=0;               //頻率計數(shù)清零
     clear=0;                //硬件分頻器清零
     clear=1;
    }  
  if(dangwei==0)          //檔位切換
  {
    pCount=regCount;
   if(regCount>999)
    {
      pCount=0;              //顯示清零
      dangwei=1;
      timeN=1;               //定時 50ms
      fp2=0;                 //硬件分頻處理
      TH1=0xfb;              //50分頻 256-5
      TL1=0xfb;              //256-5
      pCount=regCount*10;    //換算成相應的顯示:f=regCount*100
    }
  }
  else if(dangwei==1)
   {
    if(regCount<1)
     {
      dangwei=0;
      timeN=20;             //定時 1s
      fp2=1;                //不分頻
      TH1=0xff;             //256-1
      TL1=0xff;             //256-1
     }
    else if(regCount<1000)       //KHz 檔
     {
      dangwei=1;
      timeN=1;               //定時 50ms
      fp2=0;                 //硬件分頻處理
      TH1=0xfb;              //50分頻 256-5
      TL1=0xfb;              //256-5
      pCount=regCount*10;    //換算成相應的顯示:f=regCount*100
     }
    else
       {   
        dangwei=3;        //超出范圍
       }
  }
  ET1=1;               //恢復外部計數(shù) 1
  TR1=1;  
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
  }
void enterFre() interrupt 3       //外部頻率輸入
{
fCount++;         
}

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表