8052频率计(计数器2和定时器0的结合)

发布者:诚信与爱最新更新时间:2024-04-15 来源: elecfans关键字:频率计  计数器  定时器0 手机看文章 扫描二维码
随时随地手机看文章

这里在对其进行了些许修改,以便把量程改一下,同时改为6位LED显示:


/*******http://hi.baidu.com/zhangjiayue123/home************************************

函数功能:51单片机制作的频率计(当然这个频率计的频率范围是有限制的理论值为2Hz-1MHz)

编译环境:keil4

测试环境:科技创新实验室学习板

整理人:张家越      QQ:435835181

整理时间:2011-06-22


设计思想:测频率,其实就是一个定时计数的过程,在一定时间内,检测脉冲的个数,最后用脉冲个数除以时间便可以得到频率


修改    :     LiMing WangQiDong

板子    :    CCDZ-C board 

CPU        :     STC89C52RC

晶振    :    12MHz

修改部分:    


1、LED显示部分,改为6位显示

2、修改delay函数    延时5ms 优化LED显示 改为一个for循环 代码更为简练

3、删除定时器1的8位重载计数器,

4、添加定时器2,并设置为16位重载计数器提高量程范围



    在2Hz~999999Hz之间

    信号输入引脚为P1.0(T2)




版本    :     0.4.0


********http://hi.baidu.com/zhangjiayue123/home****************************************/


#include

#include

#define uchar unsigned char

#define uint unsigned int


sbit dula=P2^6;

sbit wela=P2^7;

//uchar seg_du[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //数码管的段选

uchar seg_du[]=

0x3f, 0x06, 0x5b, 0x4f,0x66,

0x6d, 0x7d, 0x07,0x7f,0x6f

};  //数码管的段选


uchar dbuf[6]={0,0,0,0,0,0};      //用来装显示数据的空数组

unsigned int count;    //定时1s只之用

unsigned int couL;

unsigned char timer2_cnt;

unsigned long frequency;


void delay(void)  //延时函数用于数码管动态扫描

{

    uchar i ,j;

    

    for(j=0; j<6; j++)

        for(i=0;i<110;i++)

            ;

}


void display_simplified(void)

{

    unsigned int i =0;

    for(i=0; i<6; i++)

    {

        dula = 1;

        P0 = seg_du[dbuf[5-i]];

        dula = 0;

        

        P0 = 0xff;

        wela = 1;

        P0 = 0xff & ( ~(0x01 << i) );

        wela=0;

        delay();

    }

}


void timer0 (void)interrupt 1  //定时器0中断,用与定时计数

{

    count++;

    if(count == 4000)    //定时1s到,

    {

        

        count = 0;     // 将定时标志清零

        TR2 = 0;       //关闭计数器

        couL = TH2*256 + TL2 - 6;         //将小于65536次脉冲的计数加上

        

        frequency = timer2_cnt * 65536 + couL;

         dbuf[5]=(frequency)/100000;

        dbuf[4]=(frequency)/10000%10;

        dbuf[3]=(frequency)/1000%10;

        dbuf[2]=(frequency)/100%10;

        dbuf[1]=(frequency)%100/10;

        dbuf[0]=(frequency)%10;      //显示处理函数

                

        timer2_cnt = 0;          //计数器2计数器清零

        TH2 = (65536-65530)/256;

        TL2 = (65536-65530)%256;          // 打开计数器中断

        

        TR2=1;            //开启计数器2,使之工作

    }

}



//timer 2 interrupt ISR

void timer_2_ISR(void) interrupt 5

{

    TF2=0;//!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!

    timer2_cnt++;    //TL2+TH2 = 65536 时,计数器2的     TF2置1,引发中断

    /*说明有几个65536溢出的次数,因为大于65536的时候,TH1+TL1 8+8位 2^16=65536的空间就容不下了,就会溢出*/    

}


//timer 0 timer mode mode-2:     8 bits-reload

//250us*4000=1s

void timer0_init() //定时器0初始化

{

    TMOD=0x02;   //  设置定时器0,和计数器1的模式

    TH0=6;

    TL0=6;    //定时器的初值,用于中断一次计时250us

    ET0=1;    //开定时器0中断

    TR0=1;    //开定时器0

}



//用作计数器:16位重载模式的计数器

void timer2_init(void)

{

    RCAP2H=(0xFFFF-65530)/256;

    RCAP2L=(0xFFFF-65530)%256;    //12MHz晶振下定时50ms,自动重装

    TH2=RCAP2H;

    TL2=RCAP2L;            //定时器2赋初值

    

    //16bits reload

    CP_RL2 = 0;        //reload mode

    T2MOD &= 0x00;    //T2OE = DCEN = 0;

    C_T2 = 1;        //counter mode

    EXEN2 = 0;    

    ET2=1;

    TR2=1;                //启动定时器2    

}


void main()

{

    count=0;

    timer0_init();

    timer2_init();

    EA=1;     //开总中断

    while(1)

    {

        display_simplified();

    }

}

具体的思想大家可以慢慢体验,在以后我再写点自己的理解。

最后附上一些照片:

 

 


关键字:频率计  计数器  定时器0 引用地址:8052频率计(计数器2和定时器0的结合)

上一篇:51定时器控制4个led,使用回调函数机制
下一篇:8052定时器2的用法

推荐阅读最新更新时间:2024-11-09 08:20

利用定时器使P1^0口输出指定占空比、周期矩形脉冲
原题如下: 代码如下:(代码就是写题思路都加有注释) #include reg52.h sbit FB = P1^0; unsigned char count =0 ; void Init_ET_0()//定时器初始化函数 { TMOD = 0x02;//启用定时器 0 ,工作模式为 模式2 。 EA = 1;//开总中断 ET0 = 1;//开定时器开关 TR0 = 1;//启动定时器 TH0 = 256 - 40;//给高八位赋初值 TL0 = 256 - 40;//给低八位赋初值 } void Servoce_ET_0() interrupt 1 //
[单片机]
利用<font color='red'>定时器</font>使P1^<font color='red'>0</font>口输出指定占空比、周期矩形脉冲
基于51单片机的四位数字频率计数码管显示设计
仿真原理图: 程序运行图: 部分程序: #include reg52.h #define uchar unsigned char #define uint unsigned int uchar duan ={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码 //uchar wei ={0XEf,0XDf,0XBf,0X7f}; //位的控制端 (开发板) uchar wei ={0X80,0X40,0X20,0X10}; //位的控制端 (仿真) uint z,x,c,v, date; //定义数据类型 uint dispcount=0;
[单片机]
STM32PWM频率计
PWM计算 PWM频率 = 定时器频率/(分频系数 x 自动重装载值) PWM占空比 = CCRx / 自动重装载值。 period = CLOCK/Freq -1; pulse = (period+1)*Dutycycle / 100; 注意:如果需要高精度,可以使用32位定时器
[单片机]
以AT89S52单片机为控制核心的数字频率计设计
在电子领域内,频率是一种最基本的参数,并与其他许多电参量的测量方案和测量结果都有着十分密切的测量精度。因此,频率的测量就显示得尤为重要,测频方法的研究越来越受到重视。频率计作为测量仪器的一种,常称为电子计数器,它的基本功能是测量信号的频率和周期,频率计的应用范围很广,它不仅应用于一般的简单仪器测量,而且还广泛应用于教学、科研、高精度仪器测量、工业控制等其他领域。随着微电子技术和计算机的迅速发展,特别是单片机的出现和发展,使传统的电子测量仪器在原理、功能、耗电、可靠性等方面都发生了重大的变化。目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。为适应实际工作的需要,本文考虑以单片机(AT89 S52)为控制平台和一个1
[单片机]
以AT89S52单片机为控制核心的数字<font color='red'>频率计</font>设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved