找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的频率计仿真实验报告 附源码与proteus工程

[复制链接]
跳转到指定楼层
楼主

电子测量实验报告

电子频率计数器

课程:电子测量技术

             班级:电子141

             姓名:施*萍

             学号:14072001



  • 实验原理

测频原理

所谓“频率”,就是周期性信号在单位时间变化的次数。电子计数器是严格按照的定义进行测频,其对应的测频原理方框图和工作时间波形如图1 所示。从图中可以看出测量过程:输入待测信号经过脉冲形成电路形成计数的窄脉冲,时基信号发生器产生计数闸门信号,待测信号通过闸门进入计数器计数,即可得到其频率。若闸门开启时间为、待测信号频率为,在闸门时间T内计数器计数值为N,则待测频率为
                                  
    若假设闸门时间为1s,计数器的值为1000,则待测信号频率应为1000Hz或1.000kHz,此时,测频分辨力为1Hz。


图1 测频原理框图和时间波形

二、系统设计


(一)设计框图


主要原理:该频率计数器主要是由信号处理电路部分、单片机AT89C51控制部分、8位LED数码管显示器部分等组成。该系统的功能是将信号输入P3.4口,通过单片机程序控制,对LED数码管显示器进行段控和位控,这些就是为了实现动态显示。

  • 硬件设计

1、单片机的时钟电路

图2 晶振电路

晶振是一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定、精确的单频振荡。在通常情况下,晶振的精确度达到百万之五十。我们需要晶振提供时钟周期然后使得单片机能够执行代码。晶振X1、电容C2/C4及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C4、C2的容量有关,但主要由电路中晶振频率决定.。

我选用2.4MHz频率的晶体,电路允许输入的脉冲频率为10kHz。电容的大小范围为一般为20pF~40pF,本次设计我们居中选用33pF电容。电容的作用还在于能够容易起震并减少频率的温漂。

  • 单片机的复位

单片机的复位一般情况下都是靠外部电路链接来实现的,在时钟电路工作之后,仅仅需要在单片机的RST引脚上出现高于24个时钟振荡脉冲(相当于2个机器周期)以上的高电平,这样的单片机便能够实现初始化状态复位。为了能够保证应用系统能够可靠正常的复位,在设计复位电路的时候,通常使RST引脚保持10ms以上的高电平的水平。只要保持高电平的状态,那么单片机就能够实现循环复位;当RST从高电平顺利地转变为低电平以后,AT89C51单片机从0000H地址开始执行程序。

图3复位电路

它的工作原理在于当电源接通,上电瞬间,电源对C1进行充电,此时复位引脚9即RST高电平有效,随着时间推移,RST电平下降,此时转为单片机正常工作。一般情况下复位时间为3~5个的RC时间。

按键开关的使用是为了避免死机状态下能够正常复位。而设置并联电容C3(这里也可以选择串联一个远小于R1的电阻可以达到一样的效果)是为了限制按下瞬间电容C1的电流,避免产生火花,以达到保护按键开关的目的。RC复位电路的复位电路增加了二极管,在电源电压瞬间下降时使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。

3、信号输入

图4 信号输入

如图4所示,信号从单片机P3.4/T0口输入。

  • 显示电路

采用7SEG-MPX8-CC-BLUE,里面有八个数码管的显示电路,这里只用到6个。

图5 显示电路

我们知道共阴和共阳结构的LED显示器各笔划的段名和安排的位置是相同的。当其中的二极管导通时,相应的笔划部分会发亮,由发亮的笔划段组合而显示的各种字符。

图6 数码管显示电路

其中的8个笔划段a、b、c、d、e、f、g、dP对应于一个字节(8位)的D0、D1、D2、D3、D4、D5、D6、D7。如下表1.1,用LED显示器显示十进制转换成十六进制数的字形代码如下所示:

  • 整体电路

图7 整体电路

  • 软件设计流程图






  • 仿真结果及分析

(一)性能指标

频率范围:0~1MHz; 频率分辨率1.010x10^-6,输出范围:0~990KHz

分析:当输入达990KHz以上,LED显示值存在特别大误差,故输入值不可过高。

(二)典型值及误差分析

输入值/Hz

990000

800000

700000

500000

100000

5000

1000

500

5

1

测量值(平均值)/Hz

991515

801422

700653

500655

100540

5010

1003

500

5

1

测量相对误差

0.153%

0.178%

0.093%

0.131%

0.540%

0.2%

0.3%

0.1%

0

0


分析:由表格明显看出,

1、随着输入频率值变大,测量绝对误差就越大;输入值越小,绝对误差越小。

2、当输入值从0至100KHz变化时,测量相对误差逐渐变大;输入值从100KHz至700KHz变化时,测量相对误差逐渐变小,随后又逐渐变大因而输入值在700KHz附近存在最佳测量点。

  • 误差曲线

图8 误差曲线

分析:当输入值从0至100KHz变化时,测量相对误差很快变大;输入值从100KHz至700KHz变化时,测量相对误差逐渐变小,随后又逐渐变大。因而输入值在700KHz附近存在最佳测量点。

(四)仿真结果截图

图9 输入值为500000Hz时的测量值

分析:此时测量相对误差为0.139%

图10 输入值为5000Hz时的测量值

分析:此时测量相对误差为0.22%

图11 输入值为500Hz时的测量值

分析:此时测量相对误差为0

图12 输入值为5Hz时的测量值

分析:此时测量相对误差为0.

  • 实验心得和体会

  • 总结

本次实验使用的仿真软件是Keil和Proteus结合,测量结果分析采用的是matlab。

遇到的问题有:

1、Proteus的安装问题

  • Proteus 的基本操作如找元件并放置在图板里
  • Keil和Proteus的联调问题

解决:1、安装问题通过询问学长获知正确破解方法

  • 基本操作问题通过自行网上搜索得知
  • 联调问题是自己从各方面寻求解决办法得以解决

  • 体会

通过本次实验达到了实验目的

1、理解电子计数器的工作原理。

2、掌握电子计数器各个组成部分的实现方法。

明白平时要注重理论学习与实践的结合,才能学得很深刻,更到位。


单片机源程序如下:
  1. #include<reg51.h>
  2.   unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3.   unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,   0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
  4.   unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
  5.   unsigned char temp[8];
  6.   unsigned char dispcount;
  7.   unsigned char T0count;
  8.   unsigned char timecount;
  9.   bit flag;  
  10.   unsigned long x;

  11. void main(void)                       //主函数
  12. {   
  13.   unsigned char i;      
  14.   TMOD=0x15;   
  15.   TH0=0;
  16.   TL0=0;   
  17.   TH1=(65536-5000)/256;   
  18.   TL1=(65536-5000)%256;   
  19.   TR1=1;   
  20.   TR0=1;   
  21.   ET0=1;   
  22.   ET1=1;   
  23.   EA=1;
  24.   while(1)   
  25.    {        
  26.    if(flag==1)         
  27.    {            
  28.    flag=0;            
  29.    x=T0count*65536+TH0*256+TL0;                  
  30.    for(i=0;i<8;i++)            
  31.    {               
  32.     temp[i]=0;            
  33.          }           
  34.         i=0;            
  35.         while(x/10)            
  36.         {               
  37.         temp[i]=x%10;
  38.         x=x/10;               
  39.         i++;            
  40.         }            
  41.         temp[i]=x;            
  42.         for(i=0;i<6;i++)            
  43.         {               
  44.         dispbuf[i]=temp[i];            
  45.         }            
  46.         timecount=0;           
  47.         T0count=0;           
  48.         TH0=0;           
  49.         TL0=0;           
  50.         TR0=1;         
  51.         }     
  52.         }
  53.         }      
  54.         void t0(void) interrupt 1 using 0             //中断1模块的函数编写
  55.         {
  56.             T0count++;
  57.         }  
  58.         void t1(void) interrupt 3 using 0             //中断3模块的函数编写
  59.         {     TH1=(65536-5000)/256;               
  60.         TL1=(65536-5000)%256;   
  61.         timecount++;     
  62.         if(timecount==200)                  
  63.         {         
  64.         TR0=0;         
  65.         timecount=0;        
  66. ……………………

  67. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



全部资料51hei下载地址(仿真+程序+论文):
频率计.rar (242.82 KB, 下载次数: 100)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:692438 发表于 2020-2-18 11:37 | 只看该作者
请问楼主 输入激励源放正弦波的话 这个数据显示为什么不太正常啊,该怎么解决才好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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