找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超简单的高精度频率测量例程(Proteus仿真80c52单片机)

[复制链接]
跳转到指定楼层
楼主
    打算做个stc32g12k128的频率相关东西,有朋友建议用proteus仿真一下。结果发现proteus里没有stc32g,与其相近的只有一个stc15w4k32s4.用了一下,结果无法运行,用尽全身解术也没玩转这个芯片(相信proteus8.9上能运行,但我无法成功安装这个版本。)只好再找相近的芯片,最后用80c52BUS成功调通了频率测量例程,现在分享给大家。供初学proteus的朋友参考作用。
    80C52是一款过时的芯片,选择这款芯片主要是因为在能使用的芯片中它的功能最接近stc32g的相应功能,可以实现不使用传统定时器进行频率测量。它使用的是T2定时模块的脉冲捕捉功能,在频率测量中做到程序简单而精度高。采用这种方法能极大地节省系统资源,让单片机做更多的事情。
   本文的意义在于使用51系列芯片在proteus中进行脉冲捕捉仿真。
    仿真电路极简单,只使用了一个80C52芯片。然后利用了proteus提供的信号源和SPI显示接口。程序中频率测量相关程序只是T2中断服务函数里的内容,其余语句基本都是显示驱动程序用的。程序中的TL2初值是用来补偿中断函数本身运行所耗费的时间的。
   proteus中仿真单片机有三种模式,一是与kiel联调,就是在proteus中启动远程编译监视器,然后在kiel里编写于编译程序。第二种是直接建立带固件的仿真工程,这样可以直接在proteus里编写和编译程序,这种模式方便对程序进行修改和调整。第三种是先把例程调试好,再转化成可执行的hex文件,最后直接把hex文件装进单片机(在单片机属性里有相应的选项)。
    本例程的测量模式适合低频段频率测量。
下面是程序内容,在附件中提供了源程序下载。
/* Main.c file generated by New Project wizard
*
* Created:   周六 10月 29 2022
* Processor: 80C52
* Compiler:  Keil for 8051
*/

#include <reg52.h>
#include <stdio.h>
sbit sclk=P3^2; //接口定义:lcd_sclk 就是 LCD 的 sclk
sbit sid=P3^1; //接口定义:lcd_sid 就是 LCD 的 sid
//sbit lcd_rs=P3^0; //接口定义:lcd_rs 就是 LCD 的 rs
//sbit lcd_reset=P1^0; //接口定义:lcd_reset 就是 LCD 的 reset
sbit cs1=P1^4; //接口定义:lcd_cs1 就是 LCD 的 cs1
//sbit key=P2^0; //定义一个按键

unsigned int cont1=123;
unsigned int cont2=234;
/*写数据到 LCD 模块*/
/*延时*/
void delay_us(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<1;k++);
}

void transfer_data(int data1)
{
char i;
cs1=0;
//rs=1;
for(i=0;i<8;i++)
{
sclk=0;
delay_us(1);
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
delay_us(1);
data1=data1<<=1;
}
cs1=1;
}
/*延时*/
void delay(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<110;k++);
}



void main(void)
{
TH2=0;
        TL2=0;
        T2CON=0x08;//包含下面四行了,还带上了中断标志位清零
        EA=1;
        ET2=1;
        TR2=1;//开始计数//这个是常变项,应该单独拿出来执行


while(1)
  {
       transfer_data(cont2);

     transfer_data(cont1);
  }
while (1)  ;
}
void t2_service() interrupt 5
{
      ET2=0;
        TR2=0;
        cont2=RCAP2H;
   cont1=RCAP2L;
   cont1=cont1;
        TH2=0;
        TL2=30;
                T2CON=0x0d;//带上了中断标志位清零

   ET2=1;        //        TR2=1;//开始计数//这个是常变项,应该单独拿出来执行

        
}

在提供的例程运行数据中可以看到,信号源脉冲频率设定为1400HZ,测量时程序输出的测量数据为02CA。这个数据为计数值,转换为相应的频率值为1400HZ。测量精度还是很高的。在其它频率上也做了测试,效果很理想。再次说明,这个程序适合低频率信号的测量,需要测量高频率,或高精度大频率范围的测量时,我之前已经分享过相应的例程。请朋友们自行查看。

原理图截图.png (24.09 KB, 下载次数: 31)

仅用了一个芯片

仅用了一个芯片

运行截图.png (381.44 KB, 下载次数: 29)

运行截图.png

计算截图.png (445.76 KB, 下载次数: 26)

计算截图.png

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1039438 发表于 2022-10-30 12:59 | 只看该作者
补充:该例程在proteus8.12和8.13版本运行通过,使用的库函数是8.13版的。
回复

使用道具 举报

板凳
ID:123289 发表于 2022-11-1 16:34 | 只看该作者
你实际做一下就会发现问题了。
做个电子钟,看看一个月误差几秒,就知道你的方法灵不灵了。(不用时钟专用芯片)
回复

使用道具 举报

地板
ID:1039438 发表于 2022-11-1 20:39 | 只看该作者
yzwzfyz 发表于 2022-11-1 16:34
你实际做一下就会发现问题了。
做个电子钟,看看一个月误差几秒,就知道你的方法灵不灵了。(不用时钟专用 ...

有道理,我是想用这个程序测量脉冲频率,如果做电子钟的话要考虑系统时钟的精度和稳定性了。不是程序问题,当然程序本身也存在计数误差的限制。
回复

使用道具 举报

5#
ID:123289 发表于 2022-11-2 10:00 | 只看该作者
理论日差做到1秒内,需要的稳定度是 1S/24H/60M/60S = 1/86400 = 11.57*10^-6。
而随意一个晶振,其稳定度轻易就优于10^-6。
从这个道理说,使用普通晶振的单片机,做个日差1秒之内的时钟是应该能够达成的。
而实际上,由于程序设计不合理,做到这一点还是不易的。
实战比仿真更能说明问题。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:1049918 发表于 2022-11-2 13:21 | 只看该作者
yzwzfyz 发表于 2022-11-2 10:00
理论日差做到1秒内,需要的稳定度是 1S/24H/60M/60S = 1/86400 = 11.57*10^-6。
而随意一个晶振,其稳定度 ...

很专业的说明,希望有更多人能看到
回复

使用道具 举报

7#
ID:1039438 发表于 2022-11-2 18:50 | 只看该作者
yzwzfyz 发表于 2022-11-2 10:00
理论日差做到1秒内,需要的稳定度是 1S/24H/60M/60S = 1/86400 = 11.57*10^-6。
而随意一个晶振,其稳定度 ...

我认为程序方面现在存在的误差主要表现在正负一的计数误差,而解决这个问题并不难,在我发的其它帖子里的程序可以容易的解决,但主要是面向测量频率的任务,对时钟的需要还真没认真研究过。有空时会去分析一下对策。
回复

使用道具 举报

8#
ID:78901 发表于 2022-11-2 19:58 | 只看该作者
基准频率一定要稳和准,否则跳动厉害,频率计对于整数测量是比较容易的,非整数难点比较大,比如31.592Hz
回复

使用道具 举报

9#
ID:1039438 发表于 2022-11-3 08:56 | 只看该作者
fsj5098 发表于 2022-11-2 19:58
基准频率一定要稳和准,否则跳动厉害,频率计对于整数测量是比较容易的,非整数难点比较大,比如31.592Hz

     我对这点也有深刻的教训,在一个测量中发现测量结果没有误差,而从测量机制上,预期该有很大误差才对,具体实例在我的贴子《基于stc32g12k128单片机和jlx12864的简易脉冲测量器 附程序》中对11059200HZ的频率测量有图片显示,正是这种没误差测量结果使我意识到测量方法的合理性存在问题,并在后面做了提示说明。之后发的几种有关频率测量的例程都在从不同的侧面去规避这种漏洞的影响。我的观点是,整数测量的准确性本身体现的是一种测量方法的不合理性。但对非整数的测量,还会受限于单片机数字处理能力。特别是对宽频率范围进行测量的程序,小数部分的处理会受字节长度的影响而变得很麻烦。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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