找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 404|回复: 2
打印 上一主题 下一主题
收起左侧

单片机测频率程序 能在下降沿反应但测不准?

[复制链接]
跳转到指定楼层
楼主
求大佬解答,真的非常感谢我使用这段单片机代码他能在下降沿反应但他测不出来准确的值

求大佬帮帮,非常感谢

nsigned char c[50];
float a=0;
void Timer0_Isr(void) interrupt 1
{
        a=(float)(((TL1*256)+TH1)/0.65535);
        TL1 = 0;                                //设置定时初始值
        TH1 = 0;                                //设置定时初始值
        TR1 = 1;
}

void Timer0_Init(void)               
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0;                                //设置定时初始值
        TH0 = 0;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
void Timer1_Init(void)               
{
        
        TMOD &= 0x0F;                        //设置定时器模式
        TMOD |= 0xD0;                        //设置定时器模式
        TL1 = 0;                                //设置定时初始值
        TH1 = 0;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
                                        //定时器1开始计时
}

        
void main()
{
        EA=1;
        P3M0 &= ~0xdf; P3M1 &= ~0xdf;
        P2M0 = 0xff; P2M1 = 0x00;
        P4M0 = 0XFF; P4M1 = 0X00;
        ///////////////////////////
        XOSCCR=0XC8;
        while(XOSCCR&1);
        CLKDIV=0X00;
        CLKSEL=0X01;
        //////////////////////////
        EAXFR=1;
        CKCON=0X00;        
        WTST=0X00;
        /////////////////////////
        OLED_Init();
        Timer0_Init();
        Timer1_Init();
        
        //PWM_init();
    /////////////////////////        
        
//    P3M0 &= ~0x20; P3M1 |= 0x20;
        
//        P0M0 = 0x00; P0M1 = 0x00;
//    P1M0 = 0x00; P1M1 = 0x00;
//    P2M0 = 0x00; P2M1 = 0x00;
//    P5M0 = 0x00; P5M1 = 0x00;
//    P6M0 = 0x00; P6M1 = 0x00;
//        P7M0 = 0x00; P7M1 = 0x00;
        ///////////////////////////

        while(1)
        {
                sprintf(bug,"%.3f",a);
                OLED_ShowString(2,2,c,8);
                //delay_ms(1000);

        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-6-2 23:52 | 只看该作者
float运算对于51来说太浪费时间了,放在中断里面运算非常不合理,把TL1/TH1的值赋给整形变量,浮点运算在main函数while循环里面做。
回复

使用道具 举报

板凳
ID:332444 发表于 2023-6-3 08:09 | 只看该作者
刚好昨天做了个频率测试效果不错51单片机极致测量到1M,测量再高频就要用到分频器,代码按2秒累积计数均值,当然按1秒也很准确,不过频率越高则出现误差概率越大,误差在0.99范围,高精度建议用倍数累积求均值,测得数据后用哪种显示都是一样,测频原理很简单,打开定时器和外部中断计数>时间到关闭总中断>处理数据去显示>数据清零>打开总中断再次测量。

28196b9a807a1a2969ab29f5c41cb331.png (39.69 KB, 下载次数: 12)

28196b9a807a1a2969ab29f5c41cb331.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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