基于单片机的数字频率计的设计 - 图文(3)

2020-02-22 11:02

图10系统工作流程图

3.1.1 T0的1s定时

本次设计选用定时器T0完成定时功能,选用方式1时最多也只能定时

65536?12/(11.0592?106)?71.1ms

显然不能满足定时1 S的要求,可以用下面这种方法解决:采用T0定时50 ,连续循环定时20次即可完成1 定时,用一个计数单元存放循环的次数,每一次循环单元自加1,当加到20次时则1S 定时到时。其程序流程图如图11所示。 3.1.2 T1的计数原理

设计中T1采用计数功能,需要注意的一个问题是,输入的待测时钟信号的频率最高可以达到460800Hz,但本设计的最高频率为计数器的最多计数65536次,显然当所输入的频率大于65536Hz的时候将无法显示,所以每当计数器T1溢出回零时产生中断,中断程序执行显示提示错误信息显示为00000Hz。其程序流程图如图12所示。

图11 图12

11

3.2 软件工作原理

将整形后的波形送至单片机的T1计数器输入口,打开定时器0,初始化定时器0,将单片机的内部定时器T0定时为1S,此时T1输入口在1s内所计数到的脉冲个数即为该信号的频率。将该计数脉冲个数经单片机处理送至LCD显示。

3.3 软件处理方法

本频率计的设计以 AT89S52 单片机为核心 ,利用它内部的定时/ 计数器完成待测信号频率的测量 。单片机 AT89S52 内部具有 2 个 16 位定时/计数器 ,定时/ 计数器的工作可以由编程来实现定时 、计数和产生计数溢出中断要求的功能 。在构成为定时器时 ,每个机器周期加 1 (使用 12M Hz 时钟时 ,每 1us 加 1) ,这样以机器周期为基准可以用来准确定时1S。在构成为计数器时 ,在相应的外部引脚发生从 1 到 0 的跳变时计数器加 1 ,这样在计数闸门的控制下可以用来测量待测信号的频率 。外部输入每个机器周期被采样一次 ,这样检测一次从1 到 0 的跳变至少需要 2 个机器周期 (24 个振荡周期) ,所以最大计数速率为时钟频率的 1/ 24 ( 使用12M Hz 时钟时 ,最大计数速率为 500 KHz) 。定时/计数器的工作由相应的运行控制位 TR 控制 ,当 TR置 1 ,定时/ 计数器开始计数 ;当 TR 清 0 ,停止计数 。设计综合考虑了频率测量精度和测量反应时间的要求 。

[6]

4 实验结果与分析

4.1实验数据

为了衡量这次设计的频率计的工作情况和测量精度,本人对系统进行了多次测量。以南京电讯仪器厂生产的E312B型通用计数器为基准进行了测试对比。测量数据如下表

E312B频率测试值(Hz) 本设计频率计测量值(Hz) 相对误差(%) [7]

10 10 0 50 50 0 100 99 1% 500 492 1000 1001 5000 5003 8000 7995 10000 9995 50000 49973 0.4% 0.1% 0.06% 0.063% 0.05% 0.046%

4.2实验结果分析

基于单片机直接计数脉冲,受单片机晶振频率的影响,外围电路与外部中断口接触良好问题,外界

环境干扰等因素,故本频率存在一定客观和主观上的误差。经实际多次测试频率在小于1000Hz的时候最大相对误差达到1%,在1000Hz-65536Hz相对误差小于0.1%。

受本频率计的相对误差影响使得本频率计适合的场合受到一定的限制。但由于本频率计设计成本低、产品可模块化设计、电源直接使用干电池、体积小、使用时可随时随地移动、使用起来特别的方便,比起传统的频率计还是有非常大的使用价值和使用空间。

结 束 语

通过本次毕业设计,不但加深我对在课程上所学到的单片机理论知识的认识和理解,重新让自己认识到了这门学科的在应用方面的广阔前景,并且通过知识与应用于实践的结合更加丰富了自己的知识。扩展了知识面,不但掌握了本专业的相关知识,而且对其他专业的知识也有所了解,而且较系统的掌握单片机应用系统的开发过程,因而自身的综合素质有了全面的提高。 经过这次一个较完整的产品设计和制作过程,对于认识到自己在知识方面存在的不足,明确今后的学习方向是非常有益的,为将来的的就业提前打了下坚实的基础。

12

附录程序:

#include #include

typedef unsigned char BYTE; typedef unsigned int WORD; typedef bit BOOL ;

sbit rs = P1^0; //液晶模块接口 sbit rw = P1^1; sbit ep = P1^2;

delay(BYTE ms) { // 延时子程序 BYTE i; while(ms--) { for(i = 0; i< 250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }

BOOL lcd_bz() { // 测试LCD忙碌状态 BOOL result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(P0 & 0x80); ep = 0; return result; }

lcd_wcmd(BYTE cmd) { // 写入指令数据到LCD while(lcd_bz());

13

rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }

extern void lcd_pos(BYTE pos) { lcd_wcmd(pos | 0x80); }

extern void lcd_wdat(BYTE dat) { while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }

extern void lcd_init() { lcd_wcmd(0x38); delay(1);

//设定显示位置

//写入字符显示数据到LCD

//LCD初始化设定

// 8位数据接口,2行显示,5*7

14

lcd_wcmd(0x0c); // 显示开。关标关。闪烁关 delay(1); lcd_wcmd(0x06); // 数据读写AC加1。画面不移动 delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); }

#include //

typedef unsigned char BYTE; typedef unsigned int WORD; typedef bit BOOL ; //

extern void lcd_init();

extern void lcd_wdat(BYTE dat); extern void lcd_pos(BYTE pos); //

void main() {

lcd_init(); P0=0XFF; P1=0XFF; TMOD=0X01; TH0=0X3C; TL0=0XB0; IE=0X82; TR0=1; while(1); } //

void time0(void) interrupt 1 {

static BYTE count=0; TH0=0X3C; TL0=0XB0; //

if(count==19) {

count++; } else {

BYTE GE,SHI,BAI,QIAN,WAN; WORD SHU;

//读取数据存放在shu中

15

SHU=P3; //P3高位 SHU<<=8; SHU+=P2;//P2低位 SHU&=0XFFF9; //关闭定时器 TR0=0; //输出shu到lcd中 GE=SHU; SHI=SHU/10; BAI=SHU/100; QIAN=SHU/1000; WAN=SHU/10000; lcd_pos(0x00); lcd_wdat(WAN+48); lcd_wdat(QIAN+48); lcd_wdat(BAI+48); lcd_wdat(SHI+48); lcd_wdat(GE+48); lcd_wdat(' '); lcd_wdat('H'); lcd_wdat('Z'); //初始化 count=0; TH0=0X3C; TL0=0XB0; P1_3=1; //准备新一轮的计数 TR0=1; P1_3=0; } }

16


基于单片机的数字频率计的设计 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:英文颜色表达大全

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: