0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用单片机和计数电路设计一个数字频率计的资料和代码概述

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-06-07 11:33 次阅读

设计思路

频率的测量实际上就是在1S时间内对信号进行计数,计数值就是信号频率。用单片机设计频率计通常采用两种办法,1)使用单片机自带的计数器对输入脉冲进行计数,或者测量信号的周期;2)单片机外部使用计数器对脉冲信号进行计数,计数值再由单片机读取。

由于单片机自带计数器输入时钟的频率通常只能是系统时钟频率的几分之一甚至几十分之一,因此采用单片机的计数器直接测量信号频率就受到了很大的限制。

本实验电路采用方式2,使用一片74LS393四位双二进制计数器和Atmega8的 T1计数器组成了24位计数器,最大计数值为16777215。如果输入信号经过MB501分频器进行64分频后再进行测量,则固定1S时基下最高测量频率为1073.741760Mhz。

为了方便得到准确的1秒钟测量闸门信号,我们使用了Atmega8的异步实时时钟功能,采用32.768Khz的晶振由TC2产生1秒钟的定时信号。

测量原理:

单片机打开测量闸门,即PB1输出高电平,同时TC2定时器启动。74LS393开始对输入脉冲进行计数,74LS393每计数达256时,Atmega8的T1计数器也向上计数1次。当1S定时到达时,单片机产生中断,PB1输出低电平关闭测量闸门,然后Atmega8读取74LS393和T1的计数值,然后送LCD显示。

由于1S的测量闸门时间在业余条件下不好测试,因此,实验程序中在LCD上同时显示实时时钟用于判断1S闸门时间的准确性。实验中,我使用CDMA手机上显示的GPS卫星精确时间进行比较。手机时间显示的最小单位是分钟,测量时一旦手机分钟值发生跳变,则立即记录下LCD显示的秒值,这样的话让频率计运行一段时间后,再多次记录下LCD显示的秒,就可以准确判断频率计的异步时钟是否准确。实验过程中,我让频率计走了10个小数左右,测量的1S时钟还是非常准确的。

#include 《iom8v.h》

#include 《macros.h》

#include lcd.h

#include 6x8.h

#include chinese.h

/*-----------------------------------------------------------------------

LCD_init : 3310LCD初始化

编写日期 :2004-8-10

最后修改日期 :2004-8-10

-----------------------------------------------------------------------*/

void LCD_init(void)

{

PORTB &= ~LCD_RST; // 产生一个让LCD复位的低电平脉冲

delay_1us();

PORTB |= LCD_RST;

PORTB &= ~LCD_CE ; // 关闭LCD

delay_1us();

PORTB |= LCD_CE; // 使能LCD

delay_1us();

LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式

LCD_write_byte(0xc8, 0); // 设置偏置电压

LCD_write_byte(0x06, 0); // 温度校正

LCD_write_byte(0x13, 0); // 1:48

LCD_write_byte(0x20, 0); // 使用基本命令

LCD_clear(); // 清屏

LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示

PORTB &= ~LCD_CE ; // 关闭LCD

//LCD_clear();

}

/*-----------------------------------------------------------------------

LCD_clear : LCD清屏函数

编写日期 :2004-8-10

最后修改日期 :2004-8-10

-----------------------------------------------------------------------*/

void LCD_clear(void)

{

unsigned int i;

LCD_write_byte(0x0c, 0);

LCD_write_byte(0x80, 0);

for (i=0; i《504; i++)

LCD_write_byte(0, 1);

}

/*-----------------------------------------------------------------------

LCD_set_XY : 设置LCD坐标函数

输入参数:X :0-83

Y :0-5

编写日期 :2004-8-10

最后修改日期 :2004-8-10

-----------------------------------------------------------------------*/

void LCD_set_XY(unsigned char X, unsigned char Y)

{

LCD_write_byte(0x40 | Y, 0); // column

LCD_write_byte(0x80 | X, 0); // row

}

/*-----------------------------------------------------------------------

LCD_write_char : 显示英文字符

输入参数:c :显示的字符;

编写日期 :2004-8-10

最后修改日期 :2004-8-10

-----------------------------------------------------------------------*/

void LCD_write_char(unsigned char c)

{

unsigned char line;

//c -= 32;

//for (line=0; line《6; line++)

//LCD_write_byte(font6x8[c][line], 1);

for (line=0; line《7; line++)

LCD_write_byte(font7x13[c][line], 1);

for (line=7; line《14; line++)

LCD_write_byte(font7x13[c][line], 1);

}

/*-----------------------------------------------------------------------

LCD_write_char : 英文字符串显示函数

输入参数:*s :英文字符串指针;

X、Y : 显示字符串的位置

编写日期 :2004-8-10

最后修改日期 :2004-8-10

-----------------------------------------------------------------------*/

void LCD_write_String(unsigned char X,unsigned char Y,char *s)

{

unsigned char line;

unsigned char i=0;

while (*s)

{

LCD_set_XY(X+i*7,Y);

for (line=0; line《7; line++)

LCD_write_byte(font7x13[*s-0X30][line], 1);

LCD_set_XY(X+i*7,Y+1);

for (line=7; line《14; line++)

LCD_write_byte(font7x13[*s-0X30][line], 1);

s++;

i++;

}

}

/*-----------------------------------------------------------------------

LCD_write_chi: 在LCD上显示汉字

输入参数:X、Y :显示汉字的起始X、Y坐标;

ch_with :汉字点阵的宽度

num :显示汉字的个数;

line :汉字点阵数组中的起始行数

row :汉字显示的行间距

编写日期 :2004-8-11

最后修改日期 :2004-8-12

-----------------------------------------------------------------------*/

void LCD_write_chi(unsigned char X, unsigned char Y,

unsigned char ch_with,unsigned char num,

unsigned char line,unsigned char row)

{

unsigned char i,n;

LCD_set_XY(X,Y); //设置初始位置

for (i=0;i《num;)

{

for (n=0; n《ch_with*2; n++) //写一个汉字

{

if (n==ch_with) //写汉字的下半部分

{

if (i==0) LCD_set_XY(X,Y+1);

else

LCD_set_XY((X+(ch_with+row)*i),Y+1);

}

LCD_write_byte(china_char[line+i][n],1);

}

i++;

LCD_set_XY((X+(ch_with+row)*i),Y);

}

}

/*-----------------------------------------------------------------------

LCD_write_chi: 汉字移动

输入参数:X、Y :显示汉字的起始X、Y坐标;

T :移动速度;

编写日期 :2004-8-13

最后修改日期 :2004-8-13

-----------------------------------------------------------------------*/

void LCD_move_chi (unsigned char X, unsigned char Y, unsigned char T)

{

unsigned char i,n,j=0;

unsigned char buffer_h[84]={0};

unsigned char buffer_l[84]={0};

for (i=0; i《156; i++)

{

buffer_h[83] = china_char[i/12][j];

buffer_l[83] = china_char[i/12][j+12];

j++;

if (j==12) j=0;

for (n=0; n《83; n++)

{

buffer_h[n]=buffer_h[n+1];

buffer_l[n]=buffer_l[n+1];

}

LCD_set_XY(X,Y);

for (n=0; n《83; n++)

{

LCD_write_byte(buffer_h[n],1);

}

LCD_set_XY(X,Y+1);

for (n=0; n《83; n++)

{

LCD_write_byte(buffer_l[n],1);

}

delay_nms(T);

}

}

/*-----------------------------------------------------------------------

LCD_draw_map : 位图绘制函数

输入参数:X、Y :位图绘制的起始X、Y坐标;

*map :位图点阵数据;

Pix_x :位图像素(长)

Pix_y :位图像素(宽)

编写日期 :2004-8-13

最后修改日期 :2004-8-13

-----------------------------------------------------------------------*/

void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char *map,

unsigned char Pix_x,unsigned char Pix_y)

{

unsigned int i,n;

unsigned char row;

if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数

else

row=Pix_y/8+1;

for (n=0;n《row;n++)

{

LCD_set_XY(X,Y);

for(i=0; i《Pix_x; i++)

{

LCD_write_byte(map[i+n*Pix_x], 1);

}

Y++; //换行

}

}

/*-----------------------------------------------------------------------

LCD_write_byte : 使用SPI接口写数据到LCD

输入参数:data :写入的数据;

command :写数据/命令选择;

编写日期 :2004-8-10

最后修改日期 :2004-8-13

-----------------------------------------------------------------------*/

void LCD_write_byte(unsigned char data, unsigned char command)

{

PORTB &= ~LCD_CE ; // 使能LCD

if (command == 0)

PORTB &= ~LCD_DC ; // 传送命令

else

PORTB |= LCD_DC ; // 传送数据

SPDR = data; // 传送数据到SPI寄存器

while ((SPSR & 0x80) == 0); // 等待数据传送完毕

PORTB |= LCD_CE ; // 关闭LCD

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44500

    浏览量

    632235
  • 频率计
    +关注

    关注

    8

    文章

    174

    浏览量

    44311
  • 计数器
    +关注

    关注

    32

    文章

    2253

    浏览量

    94298
收藏 人收藏

    评论

    相关推荐

    频率计数器的技术原理和应用场景

    频率计数器,又称频率计,是种专门用于测量信号频率的电子测量仪器。以下是对其技术原理和应用场景的详细分析:、技术原理
    发表于 10-18 14:03

    基于51单片机数字时钟数码管显示设计

    本资源内容概要:       这是基于51单片机数字时钟数码管显示设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(exc
    发表于 06-25 10:42 0次下载

    基于51单片机数字时钟闹钟设计

    本资源内容概要:       这是基于51单片机数字时钟闹钟设计包含了PDF版本电路图、C语言程序源代码(keil软件打开)、proteus仿真。本资源适合人群:     
    发表于 06-25 10:17 0次下载

    频率计测试波形如何设置?

    频率计种用于测量信号频率的电子测量仪器。它可以测量各种周期性波形的频率,包括正弦波、方波等。
    的头像 发表于 05-30 16:35 639次阅读

    频率计的使用方法

    频率计,作为电子测量领域的重要工具,主要用于测量信号的频率。在现代电子工程、通信、航空航天等领域,频率计的应用日益广泛。然而,对于许多初学者或新用户来说,如何正确使用频率计可能是
    的头像 发表于 05-15 16:52 991次阅读

    频率计的工作原理和分类详解

    在电子工程、通信和科研领域,频率计种不可或缺的电子测量仪器。它以其高精度、高速度和高分辨率的频率测量能力,为科研和工程实践提供了极大的便利。本文将深入解析频率计的工作原理,并详细介
    的头像 发表于 05-15 16:52 2108次阅读

    频率计的基本原理及分类 频率计的功能特点及应用场景

    在现代电子技术领域中,频率极其重要的物理量。无论是无线通信、雷达探测,还是音频处理、电子测量,频率的准确测量和控制都至关重要。因此,频率计
    的头像 发表于 05-10 15:27 3061次阅读

    频率计的使用方法和注意事项

    首先,选择与被测信号频率范围相匹配的频率计,并确保其工作正常。
    的头像 发表于 05-08 18:21 1820次阅读

    频率计有哪些作用

    频率计又称为频率计数器,是种专门对被测信号频率进行测量的电子测量仪器。其主要由四部分构成:时基(T)
    的头像 发表于 05-08 18:16 1273次阅读

    数字电路仿真软件单片机怎么用

    数字电路仿真软件是种用于模拟和测试数字电路设计的工具。其中,单片机仿真软件是种专门针对单片机
    的头像 发表于 04-21 10:28 983次阅读

    基于FPGA设计频率计方案介绍分享

    数字电路识别的脉冲信号,然后通过计数器计算这段时间间隔内的脉冲个数,将其换算后显示出来,这就是数字频率计的基本原理。 系统设计图如下所示:
    发表于 03-31 16:22

    基于51单片机的智能频率计毕设,C代码,仿真,原理图,论文

    ; (3)测量误差:低于0.1%; (4)频率测量结果采用LCD1602液晶显示; 系统概述 本设计给出了种以AT89C52单片机为控制核心的数字
    发表于 03-18 12:57

    单片机定时器与单片机计数器分析

     从生活中的例程看起:水盆在水龙头下,水龙没关紧,水滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过
    发表于 02-15 16:24 438次阅读

    基于单片机数字频率计的实现论文分享

     频率计测频原理方框图如图1所示。被测输入信号通过脉冲形成电路进行放大与整形(可由放大器与门电路组成),然后送到单片机入口,单片机
    发表于 02-15 16:17 520次阅读
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>数字频率计</b>的实现论文分享

    微波数字频率计的基本工作原理是什么?

    微波数字频率计的基本工作原理是什么? 微波数字频率计种用于测量微波信号频率的仪器。它通过将输入信号与参考信号混合,然后通过数字处理技术来
    的头像 发表于 12-21 15:37 750次阅读