简易单片机制作频率计

参数:测量范围1HZ-50KHZ 测量波形:半波,正弦波,方波,三角波,锯齿波

数码管显示频率

一、频率计原理


我们采用的方案是,用信号触发外部中断,外部中断触发定时器定时一秒,一秒时间到了之后计算一秒内触发了多少次外部中断,外部中断采用的是下降沿触发。

 二、使用步骤


 1.引入库


如果只需要玩玩那么直接复制就可以了,开发版是用的普中A2开发版,如果无法使用发私信联系。
只需要看定时器中断和外部中断。
 

#include <STC89C5xRC.H>
#define uint unsigned int 
#define uchar unsigned char 
sbit DIN = P1^0;//信号输入
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint HATA=0,lpoi=0;//计数位
uchar ii=0;
//**************************************************************************************************************************************
//***************数码管
uchar code sz1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//***************三八译码器
uchar code sp2[]={0xff,0x18,0x14,0x10,0xc,0x8,0x4,0x00};
//**************************************************************************************************************************************
uchar sp3[5];
/****************************************************************************
*函数名;dalay
*输  入:时间
*输  出:无
*功  能:延时
****************************************************************************/
void delay(time)
{
    uchar ti=0;
    while(time--)
    {
        for(ti=10;ti>0;ti--);
    }
}
/****************************************************************************
*函数名;Timer0Init
*输  入:无
*输  出:无
*功  能:定时器0初始化
****************************************************************************/
void Timer0Init(void)        //0微秒@11.0592MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0x00;        //设置定时初始值
    TH0 = 0x4C;        //设置定时初始值
    EA=1;
    EX0=1;
    IT0 = 1;//下降沿
    ET0=1;
}
/****************************************************************************
*函数名;show
*输  入:iny
*输  出:无
*功  能:数码管显示
****************************************************************************/
void show()
{
    uchar i,b=0;
    for(i=0;i<6;i++)
    {
        switch(i)     //位选,选择点亮的数码管,
        {
            case(0):
                LSA=1;LSB=0;LSC=1; break;//显示第2位
            case(1):
                LSA=0;LSB=0;LSC=1; break;//显示第3位
            case(2):
                LSA=1;LSB=1;LSC=0; break;//显示第4位
            case(3):
                LSA=0;LSB=1;LSC=0; break;//显示第5位
            case(4):
                LSA=1;LSB=0;LSC=0; break;//显示第6位
            case(5):
                LSA=0;LSB=0;LSC=0; break;//显示第7位
        }
        P0 = sz1[sp3[i]];
        delay(10);
        P0 = 0x00;
    }
}
/****************************************************************************
*函数名;Calculation_data()
*输  入:无
*输  出:无
*功  能:把计数值按位放到数组方便调用
****************************************************************************/
void Calculation_data()//计算数据
{
    HATA=lpoi;
    lpoi=0;
    sp3[0]=(HATA/100000);
    sp3[1]=(HATA%100000/10000);
    sp3[2]=(HATA%100000%10000/1000);
    sp3[3]=(HATA%100000%10000%1000/100);
    sp3[4]=(HATA%100000%10000%1000%100/10);
    sp3[5]=(HATA%100000%10000%1000%100%10);
}
void main()
{
    Timer0Init();
    while(1)
    {
        show();//数码管显示
    }
}
/****************************************************************************
*函数名;外部中断
*输  入:无
*输  出:无
*功  能:计触发次数
****************************************************************************/
void EX00() interrupt 0
{
    lpoi++;//记触发次数
    if(TR0==0)//***************此判断用来减小误差
    {
        lpoi-=1;
    }          //***************
    TR0=1;
}
/****************************************************************************
*函数名;定时器中断
*输  入:无
*输  出:无
*功  能:定时一秒后计算数据
***********************************************************************/
void ET00() interrupt 1
{
    TL0 = 0x00;        //设置定时初始值
    TH0 = 0x4C;        //设置定时初始值
    ii++;
    if(ii>=20)                //判断达到一秒后
    {
        ii=0;                //时间计数清零
        TR0=0;                //关闭定时器
        Calculation_data();//计算数据
    }
}

 2.知识点讲解


这一段代码是外部中断里的,加这个判断是为了测低频的时候减小误差用的
原理:判断定时器有没有触发,如果没有触发表示此脉冲是第一个脉冲,这一个脉冲我们不能要因为定时器还没有打开,所以此脉冲不能要

if(TR0==0)//***************此判断用来减小误差
    {
        lpoi-=1;
    }          //***************

# 总结


主要理解以上两个中断的程序,如果您有不同的方式请留言我们共同学习

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值