简易频率计数器概要.docx

上传人:b****5 文档编号:30084517 上传时间:2023-08-04 格式:DOCX 页数:29 大小:549.81KB
下载 相关 举报
简易频率计数器概要.docx_第1页
第1页 / 共29页
简易频率计数器概要.docx_第2页
第2页 / 共29页
简易频率计数器概要.docx_第3页
第3页 / 共29页
简易频率计数器概要.docx_第4页
第4页 / 共29页
简易频率计数器概要.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

简易频率计数器概要.docx

《简易频率计数器概要.docx》由会员分享,可在线阅读,更多相关《简易频率计数器概要.docx(29页珍藏版)》请在冰豆网上搜索。

简易频率计数器概要.docx

简易频率计数器概要

《单片机设计与实训》

设计报告

 

题目:

简易频率计数器

姓名:

班级:

学号:

指导教师:

 

完成日期:

2016年10

 

目录

摘要1

一、设计题目与要求2

1.1设计题目2

1.2设计要求:

2

二、系统方案设计2

2.1功能需求2

2.2设计流程2

2.3资料查询与硬件选型2

2.4器件说明5

三、系统原理图设计与仿真6

3.1外接晶体振荡电路6

3.2复位电路6

3.3数码管电路7

3.4外接信号电路8

3.5系统仿真结果8

3.6仿真结果分析10

四、程序设计11

4.1程序流程图11

4.2程序说明11

4.3程序设计如下:

15

五、系统调试19

5.1软件测试19

5.2硬件测试20

六、总结与体会23

附录一元件清单24

附录二程序清单25

附录三硬件原理图与实物图28

摘要

在当代电子设备中运用中,经常要测量一个波形的频率,然后对其进行分析研究。

为了测量频率,就要用到频率计。

在传统的电子测量仪器中,示波器在进行频率测量时测量精度较低,误差较大。

但是频率计能够快速准确的捕捉到被测信号频率变化,因此,频率计拥有非常广泛的应用范围。

本次课程设计总结和回顾了所学的单片机的相关知识,运用了C51芯片的相关功能和编程的知识。

简易频率计数器系统包括串口下载、复位电路,外部计数器T0或T1作为外部频率输入,信号源提供外部频率,四位数码管显示结果等6部分。

关键词:

C51芯片,C语言编程,Proteus软件,keil软件

一、设计题目与要求

1.1设计题目

简易频率计数器

1.2设计要求:

自制一个单片机最小系统,包括串口下载、复位电路,采用外部计数器T0或T1作为外部频率输入,外部频率由信号源提供,测量出来的频率显示在四位一体的数码管上。

二、系统方案设计

2.1功能需求

要求所设计电路能够进行串口下载、手动复位、测量外接信号源的频率,并且测量出的频率能在四位一体数码管上显示出来。

2.2设计流程

实验过程首先用Proteus软件进行电路设计和仿真,利用keil软件进行编程并检查程序,然后根据仿真电路布局把元件焊接在电路板上,并进行通电测试,最终到一个满足设计要求的简易频率计数器。

(1)根据设计要求和已知条件,确定频率计数器电路方案,计算和选取单元电路的原件参数,确定系统总体方案的设计,画出系统框图;

(2)单元电路设计、参数计算和器件的选择;

(3)应用Proteus软件进行仿真,并分析系统性能;

(4)应用Keil软件进行编程,并检查程序与仿真相匹配;

(5)系统的硬件设计及制作;

(6)硬件调试及分析:

利用函数信号发生器,万用表等实验室现有工具检查复位电路,外接晶振电路以及主干电路的各项技术指标,并与设计要求值进行比较,若有不同则仔细分析调试至出现预期实验结果;

(7)按要求按时撰写设计报告。

2.3资料查询与硬件选型

89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:

4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。

1.单片机各引脚功能及引脚图

(1)单片机各引脚功能

VCC/GND:

供电电源。

P0口(P0.0-P0.7):

可以被定义为数据/地址的低八位,能够用于外部程序/数据存储器。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口(P1.0-1.7):

标准输入输出I/O,P1口管脚写入1后,被内部上拉为高,可用作输入。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口(P2.0-P2.7):

既可用于标准输入输出I/O,也可用于外部程序存储器或数据存储器访问时的高八位地址。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口(P3.0-P3.7):

既可以作标准输入输出I/O,也可作为AT89C51的一些特殊功能口。

P3口管脚备选功能

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(定/计时器0外部输入)

P3.5T1定/计时器1外部输入)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

RST/VPD(9脚):

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG(30脚):

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

/PSEN(29脚):

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP(31脚):

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1(19脚):

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2(18脚):

来自反向振荡器的输出。

(2)单片机引脚图如图2-1所示

图2-1单片机引脚图

2.四位一体数码管各引脚介绍及引脚图

(1)数码管结构各引脚介绍

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一。

a,b,c,d,e,f,g,dp引脚为段选引脚,分别控制数码管8个显示笔画及小数点,显示动态驱动将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,1,2,3,4引脚分别表示四个数码管的位选引脚,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,即1、2、3、4引脚控制。

(2)数码管引脚图如图2-2所示

图2-2数码管引脚图

3.硬件选型

本次课程设计所用单片机型号为AT89C51RD,四位一体数码管为共阴极型。

2.4器件说明

本课程设计所需器件有:

89C51RD芯片(与89C51芯片管脚和指令共用,只是内部存储单元有差异)1个,12MHz晶振1个,10uF电容1个,20pF电容2个,10kΩ电阻2个,排阻1个,四位一体共阴极数码显示管1个,按钮1个,导线若干。

 

三、系统原理图设计与仿真

简易频率计数器系统设计主要分为四个部分,分别是外接晶体振荡电路、复位电路、四位一体数码管电路、信号源电路。

外接晶体振荡电路,形成反馈电路,构成一个稳定的自激振荡器,位单片机提供时钟信号;复位电路,用于重置计数器;四位一体数码管,用于显示频率计数结果;外接信号源,提供待测信号源。

这四部分电路都要与51单片机相连接,以下将从各部分电路进行分析设计。

3.1外接晶体振荡电路

单片机的时钟产生方法有两种,一种是外部时钟方式,一种是内部时钟方式,本方案设计采用内部时钟电路方式。

MCS-51片内有一个高增益反相放大器,XTAL1、XTAL2引脚分别为该反相放大器的输入端和输出端,在芯片的外部通过这两个引脚跨接石英晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。

本次课程设计需在高速串行通信下实现,故选用12MHz的晶振。

振荡电路产生的信号经过十二分频后才作为系统内部时钟信号,即12MHz的晶振得到的内部机器周期为1us。

微调电容C1和C2电容值均选用33pF,帮助晶振起振,这样可拥有较高的频率稳定性。

外接晶振电路图设计如图3-1。

图3-1外接晶体振荡电路

3.2复位电路

单片机复位电路的设计需要用到RST引脚(引脚9)。

外部电路在复位引脚RAT端产生大于两个机器周期的高电平信号,就可进行复位操作。

MCS-51单片机的复位方式有很多种,这里采用上电复位+手动复位的方式。

复位电路如图3-2所示。

在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。

当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。

随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。

根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平,单片机系统自动复位。

本电路电容选为10uF,电阻选为1kΩ,实际电路时选择阻值更大的阻值,如10k欧姆,可更有效的限制电流。

图3-2复位电路

3.3数码管电路

四位一体共阴极数码管用于显示频率计数结果。

A,B,C,D,E,F,G引脚与普通七段数码管的作用相同,dp为小数点控制,在这次课程设计中不需要用到,1234为四位位选控制端,分别控制个位、十位、百位、千位。

实际情况下四位数码是按顺序轮流点亮的,在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,所以从表面看起来是同时点亮。

数码管电路如图3-3所示。

本次电路设计中,用单片机的P0口控制数码管的片选端,P2口的低四位控制数码管的位选端。

当P0口作一般I/O口使用时,由于输出驱动电路工作于漏极开路状态,因此,仿真和焊接过程中P0口都需接上拉电阻,即排阻RP1,其作用是稳定高电平。

排阻第一位需要外接+5V电源。

图3-3数码管电路

3.4外接信号电路

外接信号电路如图3-4所示。

本次课程设计中,设定定时器0工作在定时方式,定时/计数器1工作在计数方式,因此P3.5口作为外部脉冲输入端。

在实际过程中外部信号脉冲由函数信号发生器提供。

图3-4外接信号电路

3.5系统仿真结果

1.外部输入信号为1kHz时,仿真结果如图3-5所示。

接通电源,计数频率显示为0000,然后跳变为1000,随后在1000附近跳动。

图3-5外部信号为1kHz

2.外部输入信号为500Hz时,当电路正常运行时,按下复位按钮,仿真结果如图3-6所示。

可见,此时电路正常复位。

图3-6按下复位按钮

3.6仿真结果分析

在仿真中发现,无论外部信号频率为多大,接通电源时,数码管显示均为0000,与按下复位按钮时的现象一致,即当电路接通时,就会复位;当外部信号频率改变时,数码管显示数据与相应的外接信号频率基本一致,说明本次仿真成功。

分析电路在开机时候复位的原因如下:

在电路图中,电容的的大小是10uf,电阻的大小是1k。

所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是1K*10UF=0.01S。

也就是说在电脑启动的0.01S内,电容两端的电压时在0~3.5V增加。

这个时候1K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。

所以在0.01S内,RST引脚所接收到的电压是5V~1.5V。

在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。

所以在开机0.01S内,单片机系统自动复位。

四、程序设计

4.1程序流程图

图4-1程序流程图

4.2程序说明

1.程序预处理,申明头文件,定义相关变量

#include

bitint_flag;

unsignedcharvolatileT0Count;

unsignedcharvolatileT1Count;

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示段码值为0、1、2、3、4、5、6、7、8、9

unsignedcharcodetemp[]={0xf7,0xfb,0xfd,0xfe};//数码管选通1234左到右

unsignedlongsum;//1s内脉冲的个数

unsignedcharLed[4];//LED显示缓存

2.子函数声明

(1)延时程序,在程序开始前生命延时程序,以便主函数调用

voiddelay(unsignedintnum)

{

while(--num);

}//延时程序

(2)init函数声明,该函数用于定时器、计数器置初值。

TMOD寄存器是工作方式控制寄存器,用于设定两个定时/计数器的工作方式。

各位定义如图4-2所示。

图4-2

GATE——门控制:

GATE=1时,由外中断请求信号和TR的组合状态启动定时器;GATE=0时,由运行控制位TR启动。

C/T——计数或定时选择位:

C/T=1时为计数工作方式;C/T=0时为定时工作方式。

M0、M1——工作方式选择位:

M0M1=00,为工作方式0,13位定时器/计数器工作方式;M0M1=01,为工作方式1,16位定时器/计数器工作方式;M0M1=10,为工作方式2,常数自动装入的8位定时器/计数器工作方式;M0M1=11,为工作方式3,两个8位定时器/计数器工作方式(仅适用于T0,此工作方式下T1停止计数)。

本程序中将其设置为0x51,转化为二进制为01010001,对照TMOD寄存器的位符号,可知,对定时器/计数器0,设置为由运行控制位TR启动,并开启定时工作方式,工作于工作方式2,16位定时器工作方式。

而对定时器/计数器1,设置为由运行控制位TR启动,并开启计数工作方式,工作于方式1,16位计数器工作方式。

同时给定时器0、计数器1置初值。

程序如下:

voidinit(void)

{

TMOD=0x51;//T0定时,T1计数

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=0x00;

TL1=0x00;//置定时器、计数器初始值,周期为50ms

}

(3)disp函数,用于控制数码管的显示

利用for循环依次将四位数码管位选端按个位、十位、百位、千位依次接通,并在每次接通的同时,将字符数组Led[]的储存内容赋值给P2端口,同时延时1ms。

程序如下:

voiddisp(void)

{

unsignedchari;

for(i=0;i<4;i++)

{

P2=temp[i];//片选

P0=table[Led[i]];//取数据显示

delay(100);//延时1毫秒

}

3.主函数

Main函数是程序的入口,开启中断控制总控制和所需的定时器、计数器。

利用while循环将脉冲数的千位、百位、十位、个位分离并分别储存在已定义的字符数组Led[4]中,同时准备开启下一秒的计数工作。

其中TCON寄存器既参与中断控制,又参与定时控制。

如图4-2为各位定义。

图4-3

TF1:

定时器1溢出标志位。

当定时器1计满溢出时,由硬件使TF1置“1”,并且申请中断。

进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。

TR1:

定时器1运行控制位。

由软件清“0”关闭定时器1。

当GATE=1,且/INT1为高电平时,TR1置“1”启动定时器1;当GATE=0,TR1置“1”启动定时器1。

TF0:

定时器0溢出标志。

其功能及操作情况同TF1。

TR0:

定时器0运行控制位。

其功能及操作情况同TR1。

IE1:

外部中断1请求标志位。

IT1:

外部中断1触发方式选择位。

当IT1=0,为低电平触发方式;当IT1=1,为下降沿触发方式。

IE0:

外部中断0请求标志位。

IT0:

外部中断0触发方式选择位。

当IT0=0,为低电平触发方式;当IT0=1,为下降沿触发方式。

程序如下:

voidmain(void)

{

EA=1;//CPU关中断

init();//初始化定时器

TR0=1;//启动定时器0

TR1=1;//启动计数器1

ET0=1;//定时器0开中断

ET1=1;//计数器1开中断

while

(1)

{

if(int_flag==1)

{

int_flag=0;

sum=TL1+TH1*256+T1Count*65536;//计算1s脉冲个数位数由低到高TL

Led[3]=sum%10000/1000;//显示千位

Led[2]=sum%1000/100;//显示百位

Led[1]=sum%100/10;//显示十位

Led[0]=sum%10;//显示个位

T0Count=0x00;

T1Count=0;

TH1=0x00;

TL1=0x00;

TR1=1;

}

disp();

}

}

4.中断程序

(1)定时器0中断,设置定时器T0初始值,周期为50ms,当T0Count为20时,即20×50ms=1秒时,计数器T1停止计数,且T0清零。

voidint_t0(void)interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

T0Count++;

if(T0Count==20)

{

TR1=0;//计数器1停止工作

int_flag=1;

T0Count=0x00;

}

}

(2)计数器1中断,T1Count是TH1的进位,在计数时T1的高低八位均在变化,每满65536,向T1Count进一,则由式子sum=TL1+TH1*256+T1Count*65536可计算出一秒内脉冲个数。

程序如下:

voidint_T1(void)interrupt3

{

T1Count++;

}

4.3程序设计如下:

#include

bitint_flag;

unsignedcharvolatileT0Count;

unsignedcharvolatileT1Count;

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示段码值为0、1、2、3、4、5、6、7、8、9

unsignedcharcodetemp[]={0xf7,0xfb,0xfd,0xfe};//数码管选通1234左到右

unsignedlongsum;//1s内脉冲的个数

unsignedcharLed[4];//LED显示缓存

voiddelay(unsignedintnum)

{

while(--num);

}//延时程序

voidinit(void)

{

TMOD=0x51;//T0定时,T1计数

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=0x00;

TL1=0x00;//置定时器、计数器初始值,周期为50ms

}

voiddisp(void)

{

unsignedchari;

for(i=0;i<4;i++)

{

P2=temp[i];//片选

P0=table[Led[i]];//取数据显示

delay(100);//延时1毫秒

}

}

voidmain(void)

{

EA=1;//CPU关中断

init();//初始化定时器

TR0=1;//启动定时器0

TR1=1;//启动计数器1

ET0=1;//定时器0开中断

ET1=1;//计数器1开中断

while

(1)

{

if(int_flag==1)

{

int_flag=0;

sum=TL1+TH1*256+T1Count*65536;//计算1s脉冲个数位数由低到高TL

Led[3]=sum%10000/1000;//显示千位

Led[2]=sum%1000/100;//显示百位

Led[1]=sum%100/10;//显示十位

Led[0]=sum%10;//显示个位

T0Count=0x00;

T1Count=0;

TH1=0x00;

TL1=0x00;

TR1=1;

}

disp();

}

}

voidint_t0(void)interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

T0Count++;

if(T0Count==20)

{

TR1=0;//计数器1停止工作

int_flag=1;

T0Count=0x00;

}

}

voidint_T1(void)interrupt3

{

T1Count++;

}

五、系统调试

5.1软件测试

1.外部输入信号为100Hz时,仿真结果如图5-1所示。

接通电源,计数频率显示为0000,然后跳变为100,随后在100和99之间跳动。

图5-1外部信号为100Hz

2.外部输入信号为500Hz时,仿真结果如图5-2所示。

接通电源,计数频率显示为0000,然后跳变为500,随后在500附近跳动。

图5-2外部信号为500Hz

3.在调试过程初期,复位电路电阻所用阻值为10kΩ,但仿真时复位电路不能正常进行。

仿真如图5-3所示。

图5-3R1为10kΩ

5.2硬件测试

在软件调试时,复位电路电阻为10KΩ时,复位电路不能正常运行,但按照正常情况,不该出现此现象,故推断软件仿真有误,在焊接硬件时电阻使用10KΩ进行测试。

1.如图5-4所示,在外接信号频率为1kHz时,数码管显示在1000左右跳动。

图5-4显示为1080,硬件频率计数测试成功。

图5-4

2.如图5-5所示,为按下复位按钮后的测试图,此时数码管显示为0000,即电路复位。

硬件复位测试成功。

图5-5

 

六、总结与体会

本次课程设计的课题是简易频率计数器,简易频率计数器是计算机、各种通讯设备和音频视频等科研生产领域不可缺少的测量仪器。

在这次课程设计中,我收获颇多。

在初期复习准备的过程中巩固了单片机方面的知识,另外,在后期查找相关知识时开阔了视野

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1