找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2632|回复: 5
收起左侧

求51单片机测频率代码

[复制链接]
ID:310799 发表于 2018-4-18 13:18 | 显示全部楼层 |阅读模式
求51单片机测频率代码
回复

使用道具 举报

ID:1078223 发表于 2023-5-18 02:34 | 显示全部楼层

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define wdm P0

sbit pulse = P3^4;                //脉冲输入端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;                      //控制数码管位


uchar code DM[] =
{
    0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f
};                         //段表


/******全局变量定义******/
uchar f0[5],pwm[2];                 //分别保存频率、占空比


/******函数声明******/
void Delay(uint n);                          //延时函数
void init();                  //初始化函数
void handle1_f(uint f);                         //处理频率函数
void handle2_p(uint p);         //处理函数
void Display_f();                 //显示占空比频率
void Display_p();                 //显示占空比


/******主函数******/
void main()
{
        uint th1,tl1,tf1,th2,tl2,tf2;       
        uint  f,p;
        int i,j;

        init();                           //初始化


        while(1)
        {
                   TH0 = 0;
                TL0 = 0;

                while(pulse);   //pulse为脉冲的输入引脚
                while(!pulse);  //等待上升沿来临
                TR0=1;          //打开定时器
                while(pulse);   //等待下降沿来临
                th1=TH0;
                tl1=TL0;
                tf1=TF0;
                while(!pulse);  //等待上升沿来临
                TR0=0;          //关闭定时器
                th2=TH0;
                tl2=TL0;
                tf2=TF0;

                p = ((1.0)*(th1*256+tl1+tf1*64536)/(th2*256 + tl2+tf2*64536))*1000;
                f = 1000000.0/((th2*256 + tl2+tf2*64536)*12/12);

                handle1_f(f);
                handle2_p(p);
               
                //刷新一次
                for(i=0;i<2;i++){
                                   Display_f();
                Display_p();
                                 }
        }



}

void init()
{
        TMOD = 0x11; //定时器T0、T1工作在方式1
        EA = 1;
    ET0 = 1;
    ET1 = 1;
        TH0 = 0;
        TL0 = 0;

}


void Delay(int x)
{
        int i, j;
        for(i = x; i > 0; i--)
                for(j = 114; j > 0; j--);
}

void handle1_f(uint x)
{
        f0[5] = x%10;
        f0[4] = x/10%10;
        f0[3] = x/100%10;
        f0[2] = x/1000%10;
        f0[1] = x/10000%10;
        f0[0] = x/100000%10;
}

void handle2_p(uint x)
{
        pwm[2] = x%10;
        pwm[1] = x/10%10;
        pwm[0] = x/100%10;
}

void Display_f()
{
        int i,j;
        for(i=0;i<6;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位       
                }
        j=f0[i];
                P0=DM[j];//发送段码
                Delay(5); //间隔一段时间扫描       
               
        }
  
}
void Display_p()
{
        int i,j;
        for(i=0;i<3;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位       
                }
        j=pwm[i];
                P0=DM[j];//发送段码
                Delay(5); //间隔一段时间扫描       
               
        }
  
}

回复

使用道具 举报

ID:149799 发表于 2023-5-20 16:15 | 显示全部楼层
这个频率计程序是沙发上传的,有谁实际实验过吗、
回复

使用道具 举报

ID:1034262 发表于 2023-5-21 14:39 | 显示全部楼层
51单片机测频最好方式是,产生一个高电平1秒、低电平10ms的信号,控制Timer0或Timer1做门控对外计数,外中断下降沿触发读取。输入电路用一般的逻辑IC处理可以到50MHz,用专用分频IC可以做到2.4GHz。
回复

使用道具 举报

ID:1012735 发表于 2023-5-22 01:20 | 显示全部楼层
供参考:
/*********************************
*实验:定时器,计数器
*做计数器,P3.4,若信号直接输入,
*最好为方波,信号源幅度(>2.9V)
*交流电压值:>1.0v,过低无效
*********************************/
void _Time0() interrupt 1
{
        TL0 = x;
        TH0 = y;

        nTrig++;
        P2++;  //LEDx8
}

/*********************************
* 时基:(1ms,晶振:12M)
*        定时:TL1=0x3C(理论计算=0x18),
*                                TH1=0xFC
*        计数测频:TL1=0x2C(测频校正)
* TL1取值与函数体内代码行数相关联
* 计数器,测得显示最高频率:
* 489.1K,信号源输入:501.111KHz时
* 与理论上480KHz相差不大

*********************************/
void _Time1() interrupt 3
{
        TL1 = 0x2C;
        TH1 = 0xFC;

        //5秒提取一次计数数字
        if(_x++>5000)
        {
                TR0 = 0;
                bInter = true;
                _x = 0;
        }
}



void main()
{
。。。

        TMOD = 0x15;                //设置定时器模式
        TF0 = 0;                //清除TF0标志
        TF1 = 0;                //清除TF1标志

        x = 0xB0;
        y = 0x3C;
       
        //0x3CB0=15536
        TL0 = 0xB0;
        TH0 = 0x3C;

        TL1 = 0x3C;                //设置定时初始值
        TH1 = 0xFC;                //设置定时初始值

        TR1 = 1;                //定时器1开始计
        ET1 = 1;
        TR0 = 1;
        ET0 = 1;       
       
        //中断总开关
        EA  = 1;
       
        while(1)
        {
                ...
                LcdDisplayStr(0, 2, "OutFreq:");
               
                if(bInter)
                {
                        Vout = nTrig*(0x10000-(y*0x100+x));
                        Max = (TH0 * 0x100 + TL0) - (y*0x100 + x);
                        //频率
                        Hz = (Vout + Max)/5;
                       
                        LcdDisplayNum(4,3,Hz,7,0,0);

                        //PROBE = true;
                        nTrig = 0;       
                        bInter = false;
                        TL0 = x;
                        TH0 = y;
                        TR0 = 1;
                }       
        }
}



回复

使用道具 举报

ID:526543 发表于 2023-5-22 13:32 | 显示全部楼层
#include <reg51.h>

#define TRIGGER_PIN P1                // 触发引脚
#define TIMER0_TH0 TH0                // 定时器0高字节
#define TIMER0_TL0 TL0                // 定时器0低字节

volatile unsigned long frequency = 0;        // 测量的频率

void timer0_init() {
        TMOD |= 0x01;        // 设置定时器0为模式1
        ET0 = 1;                // 允许定时器0中断
}

void delay(unsigned int milliseconds) {
        unsigned int i, j;
        for (i = 0; i < milliseconds; i++) {
                for (j = 0; j < 120; j++) {
                }
        }
}

void measure_frequency() {
        TRIGGER_PIN = 1;                // 设置触发引脚为高电平
        TRIGGER_PIN = 0;                // 设置触发引脚为低电平
        while (!TRIGGER_PIN);        // 等待触发引脚为高电平
        TH0 = TL0 = 0;                        // 清零定时器0
        while (TRIGGER_PIN);        // 等待触发引脚为低电平
        TR0 = 1;                                // 启动定时器0
        while (TRIGGER_PIN);        // 等待触发引脚为高电平
        TR0 = 0;                                // 停止定时器0
        frequency = (TIMER0_TH0 << 8) | TIMER0_TL0;        // 读取定时器0计数值
}

void main() {
        timer0_init();        // 初始化定时器0
        while (1) {
                measure_frequency();        // 测量频率
                delay(1000);                        // 延时1秒
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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