找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1456|回复: 0
收起左侧

发一个基于STC12C5A60S2单片机的频率计的代码

[复制链接]
ID:1020821 发表于 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;    //定义数据端口地址,0时分频处理,1时不分频
unsigned char count;      //定时 1s 计数
unsigned char d[4];       //对应数码管的各位
unsigned char dangwei;    //档位
unsigned int timeN;       //不同档位计时值
unsigned int fCount;      //脉冲下降沿次数
unsigned int regCount;    //脉冲次数暂存
unsigned int pCount;      //频率显示
unsigned char Num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//七段数码管代码共阳极
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); //带小数点
       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,计数器1,工作方式1
   TH0= (65536-50000)/256;
   TL0= (65536-50000)%256;
                                                    //计数器1计数初值
   TH1=0xff;         // 256-1;      
   TL1=0xff;         // 256-1;
   TR0=1;           //开定时器0中断
   ET0=1;           //定时器0允许
   TR1=1;           //开计数器1中断
   ET1=1;           //允许计数器1中断
   EA=1;            //总中断允许
  }
void main()
  {
        intial();
    while(1)
       {
          dispbuf();
       }
  }
void timer0() interrupt 1
  {
   count++;
   if(count==timeN)
    {
     ET1=0;      //计时1s,暂停外部计数1
     TR1=0;
     count=0;
    regCount=fCount;        //更新显示
     fCount=0;               //频率计数清零
     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;               //恢复外部计数 1
  TR1=1;  
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
  }
void enterFre() interrupt 3       //外部频率输入
{
fCount++;         
}

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表