简易频率计数器概要.docx
- 文档编号:30084517
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:29
- 大小:549.81KB
简易频率计数器概要.docx
《简易频率计数器概要.docx》由会员分享,可在线阅读,更多相关《简易频率计数器概要.docx(29页珍藏版)》请在冰豆网上搜索。
简易频率计数器概要
《单片机设计与实训》
设计报告
题目:
简易频率计数器
姓名:
班级:
学号:
指导教师:
完成日期:
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
六、总结与体会
本次课程设计的课题是简易频率计数器,简易频率计数器是计算机、各种通讯设备和音频视频等科研生产领域不可缺少的测量仪器。
在这次课程设计中,我收获颇多。
在初期复习准备的过程中巩固了单片机方面的知识,另外,在后期查找相关知识时开阔了视野
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 频率 计数器 概要
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1