简易频率计数器_第1页
简易频率计数器_第2页
简易频率计数器_第3页
简易频率计数器_第4页
简易频率计数器_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要在当代电子设备中运用中,经常要测量一个波形的频率,然后对其进行分析研究。为了测量频率,就要用到频率计。在传统的电子测量仪器中,示波器在进行频率测量时测量精度较低,误差较大。但是频率计能够快速准确的捕捉到被测信号频率变化,因此,频率计拥有非常广泛的应用范围。本次课程设计总结和回顾了所学的单片机的相关知识,运用了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中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。单片机各引脚功能及引脚图单片机各引脚功能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-SEQ图2_-\*ARABIC1单片机引脚图四位一体数码管各引脚介绍及引脚图(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-SEQ图2_-\*ARABIC2数码管引脚图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-SEQ图3_-\*ARABIC1外接晶体振荡电路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-SEQ图3_-\*ARABIC2复位电路3.3数码管电路四位一体共阴极数码管用于显示频率计数结果。A,B,C,D,E,F,G引脚与普通七段数码管的作用相同,dp为小数点控制,在这次课程设计中不需要用到,1234为四位位选控制端,分别控制个位、十位、百位、千位。实际情况下四位数码是按顺序轮流点亮的,在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,所以从表面看起来是同时点亮。数码管电路如图3-3所示。本次电路设计中,用单片机的P0口控制数码管的片选端,P2口的低四位控制数码管的位选端。当P0口作一般I/O口使用时,由于输出驱动电路工作于漏极开路状态,因此,仿真和焊接过程中P0口都需接上拉电阻,即排阻RP1,其作用是稳定高电平。排阻第一位需要外接+5V电源。图3-SEQ图3_-\*ARABIC3数码管电路3.4外接信号电路外接信号电路如图3-4所示。本次课程设计中,设定定时器0工作在定时方式,定时/计数器1工作在计数方式,因此P3.5口作为外部脉冲输入端。在实际过程中外部信号脉冲由函数信号发生器提供。图3-SEQ图3_-\*ARABIC4外接信号电路3.5系统仿真结果1.外部输入信号为1kHz时,仿真结果如图3-5所示。接通电源,计数频率显示为0000,然后跳变为1000,随后在1000附近跳动。图3-SEQ图3_-\*ARABIC5外部信号为1kHz2.外部输入信号为500Hz时,当电路正常运行时,按下复位按钮,仿真结果如图3-6所示。可见,此时电路正常复位。图3-SEQ图3_-\*ARABIC6按下复位按钮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程序流程图开始开始初始化初始化T0计时,T1计数T1计数T0定时满1T1计数T0定时满1sT1Count++T1Count++计算脉冲个数送数码管显示送数码管显示图4-SEQ图4_-\*ARABIC1程序流程图4.2程序说明1.程序预处理,申明头文件,定义相关变量#include<reg51.h> bitint_flag;unsignedcharvolatileT0Count;unsignedcharvolatileT1Count;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示段码值为0、1、2、3、4、5、6、7、8、9unsignedcharcodetemp[]={0xf7,0xfb,0xfd,0xfe};//数码管选通1234左到右unsignedlongsum;//1s内脉冲的个数unsignedcharLed[4];//LED显示缓存2.子函数声明(1)延时程序,在程序开始前生命延时程序,以便主函数调用voiddelay(unsignedintnum){ while(--num);}//延时程序(2)init函数声明,该函数用于定时器、计数器置初值。TMOD寄存器是工作方式控制寄存器,用于设定两个定时/计数器的工作方式。各位定义如图4-2所示。图4-SEQ图4_-\*ARABIC2GATE——门控制: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毫秒 }主函数Main函数是程序的入口,开启中断控制总控制和所需的定时器、计数器。利用while循环将脉冲数的千位、百位、十位、个位分离并分别储存在已定义的字符数组Led[4]中,同时准备开启下一秒的计数工作。其中TCON寄存器既参与中断控制,又参与定时控制。如图4-2为各位定义。图4-SEQ图4_-\*ARABIC3TF1:定时器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<TH<T1Count 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(); }}中断程序(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<reg51.h> bitint_flag;unsignedcharvolatileT0Count;unsignedcharvolatileT1Count;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示段码值为0、1、2、3、4、5、6、7、8、9unsignedcharcodetemp[]={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<TH<T1Count 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-SEQ图5_-\*ARABIC1外部信号为100Hz2.外部输入信号为500Hz时,仿真结果如图5-2所示。接通电源,计数频率显示为0000,然后跳变为500,随后在500附近跳动。图5-SEQ图5_-\*ARABIC2外部信号为500Hz3.在调试过程初期,复位电路电阻所用阻值为10kΩ,但仿真时复位电路不能正常进行。仿真如图5-3所示。图5-SEQ图5_-\*ARABIC3R1为10kΩ5.2硬件测试在软件调试时,复位电路电阻为10KΩ时,复位电路不能正常运行,但按照正常情况,不该出现此现象,故推断软件仿真有误,在焊接硬件时电阻使用10KΩ进行测试。1.如图5-4所示,在外接信号频率为1kHz时,数码管显示在1000左右跳动。图5-4显示为1080,硬件频率计数测试成功。图5-SEQ图5_-\*ARABIC42.如图5-5所示,为按下复位按钮后的测试图,此时数码管显示为0000,即电路复位。硬件复位测试成功。图5-SEQ图5_-\*ARABIC5六、总结与体会本次课程设计的课题是简易频率计数器,简易频率计数器是计算机、各种通讯设备和音频视频等科研生产领域不可缺少的测量仪器。在这次课程设计中,我收获颇多。在初期复习准备的过程中巩固了单片机方面的知识,另外,在后期查找相关知识时开阔了视野,学到了很多课本上学不到的知识。比如,在这个过程中,我又重新复习了《C语言程序设计》中的相关编程知识,较为熟练地掌握了C语言的编写,重新翻阅了《单片机原理及应用》,温故而知新,能够更加熟练地掌握了单片机的相关知识;另外,我自行学习了仿真软件Proteus、编程软件Keil和串口烧入器的使用方法。虽然课程设计成功完成,但是在此过程中出现了大大小小的问题。比如,课程设计刚开始时,由于单片机知识的遗忘和自己基础知识不牢固,在分析设计电路时略显吃力,但是经过两天的准备后,就能够很好的完成电路的设计。然而,在编程时,由于C语言所学的时间太久,知识遗忘比较大,在编写程序时遇到了很大的困难。但是我们没有放弃,最终,在汤老师的耐心帮助和我们队友同学之间互相帮助下,经过一番努力,最终成功编写出了程序。除了在知识上收获了很多之外,我在与队友的相互交流学习时,与人交流的能力有所提升。而且,更加意识到团队合作的重要性。在此次课程设计中,我想感谢我的队友和耐心负责的汤老师,也感谢学校给我们提供如此难得的机会锻炼自己。在以后的学习中,我一定会更加努力。

附录一元件清单序号器件名称型号数量12345678单片机芯片电阻电容电容晶振按钮排阻数码管AT89C5110kΩ10uF20pF12MHz-A472GF5461AH1个2个1个2个1个1个1个1个附录二程序清单程序如下:#include<reg51.h> bitint_flag;unsignedcharvolatileT0Count;unsignedcharvolatileT1Count;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示段码值为0、1、2、3、4、5、6、7、8、9unsignedcharcodetemp[]={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;//置定时器、计数器初始值,周期为5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论