六位数显频率计数器_第1页
六位数显频率计数器_第2页
六位数显频率计数器_第3页
六位数显频率计数器_第4页
六位数显频率计数器_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、目录一、前言 1.1 课程设计任务1.2设计目的二、方案的提出与论证 2.1频率测量的原理和方法三、系统硬件设计3.1.1电源供电电路-3.1.2单片机时钟电路-3.1.3单片机复位电路3.1.4显示电路3.2 at89c51单片机芯片的功能及其参数- 四、系统软件设计4.1软件流程图及编写程序4.2软件减小测量误差的办法五、实验总结附录一:参考文献一、前言1.1 课程设计任务 本课程设计主要任务是设计一个频率计数器,其主要功能如下:利用at89c51单片机的t0、t1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过6位动态数码管显示出来。要求能够对025khz的信号频率进

2、行准确计数,计数误差不超过±2hz。1.2设计目的: a、熟悉和掌握51单片机的原理、结构和应用; b、用 protel/altium designer进行电路的设计,进一步了解相关软件的功能以及设计的一些规则; c、熟悉用c语言进行程序设计的一般方法、步骤和应用; d、积极发扬团队精神和集体荣誉感,互相协作、互相帮助; e、熟悉电路的调试的接线方法和调试方法及其原理 f、锻炼自己的实践和动手能力,为以后能更快的投入工作而做准备;二、方案提出与论证2.1频率测量原理与方法方案一:直接测频法。把被测频率信号经过脉冲形成电路后加到闸门的一个输入端,只有在闸门开通时间 1秒内,被计数的脉冲

3、被送到计数器进行计数。设计数器的值为n,由频率定义式计算得到被测信号频率为fn/t=n。 方案二:测量周期法。将被测量信号经过过零检测后转换成方波信号,利用单片机查询两个下降沿,在此期间根据晶体振荡器产生的时钟经过12分频的脉冲送计数器进行计数,设计数值为n,送入计数器的时钟周期为t,则得被测量信号的周期值为nt,然后取其倒数即为被测量信号的频率(1/nt) 。 理论上分析:采用直接测频法在测量低频段信号时的相对测量误差较大,但在高频段测量信号的频率有较高的精度。如果采用测频法测量低频段频率信号,要想提高精确度,势必会大幅度增加闸门开通时间t,时效性较差。相反,采用测量信号周期然后取其倒数的方

4、法在低频段测量时精度很高。但是本题目要求误差为±2hz,经过试验分析,加上必要的软件编程的措施,可以直接用高频的测法,在高频段,误差与示波器的显示频率基本一致,低频时,误差小于±0.5hz,满足题目的要求!我们都知道,52单片机中断的进入都是需要一定的时间的,如果我们没有把这个考虑进去,直接进行软件的设计,误差达到了±20hz。不满足题目的要求!因而在编程的时候,把中断事件也考虑进去!这样可以使得误差减小!三、系统硬件设计3.1电路原理图总图3.1.1电源供电电路 供电部份接口设计用的是dip2的插针,电路采用发光二极管检测电源是否已接通。3.1.2 单片机时钟电

5、路如下图所示:如图所示是采用内部振荡方式使8052单片机产生时钟信号,在单片机芯片的x1和x2引脚两端跨接石英晶体振荡器和两个电容构成稳定的自激振荡电路,其中电容对振荡频率起微调作用。晶振频率为12mhz。3.1.3单片机复位电路复位是单片机的初始化操作。其功能是使cpu从0000h单元开始执行程序。除了使系统正常初始化外,当程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需要按复位键重新启动。如图为按键手动复位方式,通过复位端经电阻和电源+5v接通实现复位功能,兼备上电复位功能。3.1.4显示及驱动电路该系统采用两个四位 led共阳极显示器动态显示6位数。共阳极数码管在应用时应将公

6、共极com接到+5v,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。要使数码管正常发光一般都要加驱动电路,不加驱动电路是很暗的,共阳数码管驱动加于位选端。该数码管用s8850 pnp型三极管作为驱动电路,在基极加以分压限流电阻,以防止数码管因电流过大而烧坏。3 .2 at89c51单片机芯片的功能及其参数 at89s51是一个有40个引脚的芯片,引脚配置如图3所示。与8031相比,at89c51自带4k的rom和128b的ram,因此编写中小型系统就无需任何硬件进行扩展。图3 at89s51引脚配置at89s51芯片的40个引脚功能为:vcc

7、:电源电压。gnd:接地。rst:复位输入。当rst变为高电平并保持2个机器周期时,所有i/o引脚复位至“1”。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡放大器的输出。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行mov

8、x,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。/ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。p0口:8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当

9、p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在fiash编程时,p0 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。p1口:8位双向i/o口。引脚p1.2p1.7提供内部上拉,当作为输入并被外部下拉为低电平时,它们将输出电流,这是因内部上拉的缘故。p1.0和p1.1需要外部上拉,可用作片内精确模拟比较器的正向输入(ain0)和反向输入(ain1),p1口输出缓冲器能接收20ma电流,并能直接驱动led显示器;p1口引脚写入“1” 后,可用作输入。在闪速编程与编程校验期间,p1口也可接收编码数据。

10、p2口:带内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。p3口:引脚p3.0p3.7为带内部上拉的双向i/0引脚。p3口的输出缓冲器能接收20ma的灌电流;p3口写入“1”后

11、,内部上拉,可用输入。p3口也可用作特殊功能口,其功能见表1。p3口同时也可为闪速存储器编程和编程校验接收控制信号。表3-1 p3口特殊功能 p3口引脚特殊功能p3.0rxd(串行输入口)p3.1txd(串行输出口)p3.2(外部中断0)p3.3(外部中断1)p3.4t0(定时器0外部输入)p3.5t1(定时器1外部输入)p3.6/wr(外部数据存储器写选通)p3.7/rd(外部数据存储器读选通)四、系统软件设计4.1软件流程图1 设计思路及原理单片机当工作方式寄存器tmod的c/t位=1时为计数方式,多路开关与定时器0的外部引脚连通,外部计数脉冲由引脚输入。当外部信号由1至0跳变时,计数器加

12、1,此时t0成为外部事件的计数器。由于确认一次由1至0的跳变要用24个振荡器周期,所以所设计计数器的最高计数频率为单片机时钟频率的1/24。1) 定时/计数器t0和t1的工作方式设置,t0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的t0,最大计数值为fosc/24,由于fosc12mhz,因此:t0的最大计数频率为250khz。所以对于设计要求即测量范围为025khz是完全满足的。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以t1工作在定时状态下,每定时1秒中到,就停止t0的计数,而从t0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来2) t

13、1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。因此每次放入定时器1的初值为th1=65536/256,tl1=65536%256.3) 工作方式的确定。首先,两个定时器都采用软件启动定时器,都工作在16位计数器状态,即方式1,所以tmod的高四位和低四位的gate=0,m1m0=01;定时器1用于定时,所以d6位=0,定时器0用于技术,所以d3位=1。所以tmod=0x15.控制方式寄存器tcon的相应位在程序中确定。开始t0清零,t1赋初值,tr0=1,tr1=1,允许定时器中断et0=1,et1=1,ea=1。t0

14、溢出中断或t1溢出中断timecount=20?了吗?tr0=0,tr1=0;读一秒钟的计数次数(也就是频率)x=t0count*65536+th0*256+tl0,处理数据temp0,temp1,temp2,temp3,temp4,temp5ny送数据到六位数码管显示结束软件流程图:设置变量t0count,temp等及字形码表及位选码表t0count+,th0,tl0=0t0溢出t1重新赋值not1溢出编写并调试好的程序如下:#include <reg51.h>#include <math.h>#define seg p0#define seg_w p2unsigne

15、d char code dispbit=0x01,0x02,0x04,0x08,0x10,0x20; /数组对应6个数码管unsigned char code dispcode= 0xc0,/ 00xf9,/ 10xa4,/ 20xb0,/ 30x99,/ 40x92,/ 50x82,/ 60xf8,/ 70x80,/ 80x90,/ 90x88,/ a0x83,/ b0xc6,/ c0xa1,/ d0x86,/ e0x8e/ f;unsigned char dispbuf5=0,0,0,0,0; unsigned char temp5;unsigned char dispcount;unsi

16、gned char t0count; /t0计数器溢出次数unsigned char timecount; bit flag; / 标志位unsigned long x; /脉冲次数void delay1ms(unsigned char t) /延时1ms unsigned char j,tt;for(j=0;j<t;j+) for(tt=0;tt<120;tt+);void main(void)unsigned char i;tmod=0x15; /定时器0、1工作方式th0=0; /初始化tl0=0;th1=(65536-50000)/256;tl1=(65536-50000)

17、%256;tr1=1; /启动定时器1tr0=1; /启动定时器0et0=1; /允许t0中断et1=1; /允许t1中断ea=1; /开中断while(1) /等待中断,并处理和显示数据 if(flag=1) /1s计数到,标志位为1 x=0; tr1=0; /关定时器1 flag=0; /标志位清零 x=t0count*65536+th0*256+tl0; /1s内的脉冲个数 ,即频率 if(x>12000)&&(x<18000)x=x-1; /高频时减小误差 else if(x>18000)&&(x<20000)x=x-2; els

18、e if(x>20000)&&(x<30000)x=x-3; temp0=x%10; /数据处理 ,取个位 temp1=(x/10)%10; / 取十位 temp2=(x/100)%10; /取百位 temp3=(x/1000)%10; /取千位 temp4=x/10000; /取万位 t0count=0; /清零 th0=0; /清零 tl0=0; /清零 th1=(65536-50000)/256; /置初值 tl1=(65536-50000)%256; tr0=1; /开定时器0 计数 tr1=1; /开定时器1 for(i=0,dispcount=0;dis

19、pcount<5,i<5;dispcount+,i+) /送数据显示 seg=0xff; /开数码管 钢制闪烁 dispbufi=tempi; seg =dispcodedispbufdispcount; seg_w =dispbitdispcount; delay1ms(4); void t0(void) interrupt 1 using 0 /t0中断 t0count+;void t1(void) interrupt 3 using 0 /t1中断 th1=(65536-50000)/256; /置初值,每4ms中断一次 tl1=(65536-50000)%256; time

20、count+; if(timecount=20) /满250次为1s 即 250x4ms tr0=0; /关掉t0计数器 timecount=0; flag=1; 4.2程序调试及误差分析写好程序后用protues仿真。第一次仿真结果为:在低频时测得的数据很准确,在5khz以上开始有误差,且随着频率的上升,误差增大。当信号频率为25khz时,误差为+77hz。分析了一下程序觉得t1重装次多太多造成计数时间偏大是误差的主要原因。修改了程序,让t0从原来的每次定时5ms,定时1s重装200次变为每次定时50ms,定时1s重装20次后,第二次仿真。误差大大减小,为+5hz。此时,误差还是不能满足要求

21、。在程序中加以下几个语句if(x>12000)&&(x<18000)x=x-1; else if(x>18000)&&(x<20000)x=x-2;else if(x>20000)&&(x<30000)x=x-3;来减小较高频时的误差。虽然觉得这样不合理,不过这样处理后,误差真的减了好多。满足了设计的初始要求。五、制作pcb板及焊接元件调试将原理图导入pcb,布好线后如下图: 将布好线的pcb拿去打印,并将打印纸用电熨斗印在板子上。印好后放进三氯化铁溶液中腐蚀两个小时即可腐蚀完毕。清洗腐蚀好的板子,刮去铜线上的石墨。弄干净后准备安插焊接元件

温馨提示

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

评论

0/150

提交评论