《单片机课程设计报告_数字频率计73586.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告_数字频率计73586.doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 湖南科技大学信息与电气工程学院单片机原理及应用 课程设计报告 题 目: 数字频率计 姓 名: 朱枫 学 号: 0904040214 班 级: 二班 专 业: 通信工程 指导老师: 罗朝辉 目录第 1 节 概述 31.1 数字频率计概述 31.2 基本设计原理31.3 系统主要功能31.4 设计中遇到的一些问题4第 2 节 数字频率计(低频)的硬件结构设计42.1 系统硬件的构成42.2 系统工作原理图42.3 单片机最小系统设计52.4 频率产生电路设计62.5 数据显示电路设计(8279)72.6 电源设计8第 3 节 软件设计83.1 程序图83.2 数据采集程序设计93.3 显示子程序
2、设计113.4 C语言程序清单12第 4 节 结束语16参考文献16第1节 概述1.1 数字频率计概述数字频率计是采用数字电路制成的实现对周期性变化信号的频率的测量。数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精度高,显示直观,所以经常要用到数字频率计。频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的
3、脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。本文。数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器。 电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠
4、性和速度。集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域。 本次设计的数字频率计由四部分组成: 频率源,单片机、8279显示驱动电路、显示电路。1.2 基本设计原理运用单片机TO,T1计数功能来完成对输入信号的计数。其T1为 计数器,T1为计时器。 为T1装入初值19466,定时50ms,重复50次即为1s,与此同时将同时计数的T
5、0里的值取出,即为该频率信号1s的频率示数1.3系统主要功能利用单片机的T0,T1计数定时器功能,来完成对输入信号进行率计数,计数结果通过8位动态数码管显示出来,能对0到250KHZ的信号频率进行准确计数。 特点1,由开关控制启动。 特点2,无脉冲信号时,数码管显为全0。 特点3,可以多次测量,自动刷新 1s一次。 特点4,使用溢出标志T0count,防止20ms内计数超过65536次的频率信号溢出造成的示数错误1.4 设计中遇到的一些问题1.计数器溢出造成数据错误解决方法:通过设置溢出中断T0count变量来记下溢出的次数再结合总数就不会有误差。2.定时器初值的设置解决方法:本实验才用11.
6、0592M晶振驱动,理论初值设为19456,仍然会有一些误差,经过反复调校,确认初值设为19466最佳。 第 2 节 数字频率计(低频)的硬件结构设计2.1 系统硬件的构成2.2 系统工作原理图选择AT89S52单片机芯片,选用两位8段共阴极LED数码管实现频率显示,利用8279作I/O口扩展,连接数码管。通过定时器1计时方式,定时器0计数方式,定时每秒钟对外部频率计数,把计数值通过8279芯片在数码管上显示2.3 单片机最小系统设计1.时钟电路单片机的时钟一般需要多相时钟,所以时钟电路由振荡器和分频器组成。 AT8951内部有一个用于构成振荡器的可控高增益反向放大器。两个引脚XTAL1和XT
7、AL2分别是该放大器的输入端和输出端。在片外跨接一晶振和两个匹配电容C1、C2如图4.3所示,就构成一个自激振荡器。振荡频率根据实际要求的工作速度,从几百千赫至24MHz可适当选取某一频率。匹配电容C1、C2要根据石英晶体振荡器的要求选取。当晶振频率为12MHz时,C1C2一般选30pF左右。上述电路是靠AT89C51单片机内部电路产生振荡的。也可以由外部振荡器或时钟直接驱动AT89C51。本设计采用内部电路产生振荡。 2.复位电路RST引脚是复位端,高电平有效。该引脚输入至少连续两个机器周期以上的高电平,单片机复位。RST引脚内部有一个ST触发器以对输入信号整形,保证内部复位电路的可靠,所以
8、外部输入信号不一定要求是数字波形。使用时,一般在此引脚与VSS引脚之间接一个8.2k的下拉电阻,与VCC引脚之间接一个约10F的电解电容,即可保证上电自动复位。2.4 频率产生电路设计频率发生电路是由CD2040芯片产生150HZ,300HZ,600HZ,153.6KHZ,2.4KHZ 的频率,比较稳定。1.频率产生电路2.频率产生电路的驱动电路2.5 数据显示电路设计(8279)1.8279部分数码管显示电路由4位八段共阴数码及8279芯片及74HS138芯片组成,共阴数码管在应用时将公共极COM接到地,当某一字段发光二极管的阴极为高电平时,相应字段就点亮。当某一字段的阴极为低电平时,相应字
9、段就不亮。通过数码管显示,可以简单而准确的实现显示频率。2.数码管2.6 电源的设计本电源电路是通过变压器,把外部接入的22V电源转变为5V电源,采用7805使电源稳定。第 3 节 软件设计3.1 程序流程图根据设计项目所需功能,我们先进行初始化,在待机状态下,采集频率。然后检测是否有按钮按下,若按钮按下,则数码管显示所采集的频率,再按下键0时则不显示。系统实现所有功能,其程序框图如图所示。 开始采集频率(1s内)频率转换十进制转换数码管显示YN按钮按下?3.2 数据采集子程序的设计1. 设置T1为定时器,T0为计数器,并设置变量x,用来装1s时间内的计数数值。unsigned char i;
10、init8279();/8279初始化while(1) TMOD=0x15;/T1, 设为方式1定时模式,TO设为方式1计数模式TH0=0;/T0的16位计数器高八位清0TL0=0;/T0的16位计数器低八位清0 /*经过测试,初值设为19466最佳,65536-46070*/TH1=(65536-46070)/256; /T1定时50ms处置的高八位送TH1,计算公式(65536-定时器初值)/晶振频率*12=0.05TL1=(65536-46070)%256;/T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080TR1=1;/启动定时器1TR0=1;/启动计
11、数器0ET0=1;/开计数器0中断ET1=1;/开定时器1中断EA=1;/开CPU中断while(1) if(k=1)/开关设置 C8279=0xd1; while(k=1); if(flag=1)/ 1s时间到? if(x=0)/如果没有脉冲,数码管显示全0C8279=0x80;/置显示位置D8279=ledseg0;/显示C8279=0x81;/置显示位置D8279=ledseg0;/显示C8279=0x82;/置显示位置D8279=ledseg0;/显示C8279=0x83;/置显示位置D8279=ledseg0;/显示C8279=0x84;/置显示位置D8279=ledseg0;/显示
12、C8279=0x85;/置显示位置D8279=ledseg0;/显示C8279=0x86;/置显示位置D8279=ledseg0;/显示C8279=0x87;/置显示位置D8279=ledseg0;/显示 flag=0;x=T0count*65536+TH0*256+TL0; /计算频率值 2. 计数器0中断设置变量T0count,防止20ms内计数器溢出造成的错误。void to(void) interrupt 1 using 0 / 定时器0中断处理函数 T0count+; / 16位计数器满,频率计最高八位计数变量加1 3. 定时器1中断void t1(void) interrupt 3
13、 using 0 /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; /T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(65536-46070)%256;/T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 timecount+; / 50ms时间到,1s计数器加1 if(timecount=20) TR0=0;/时间到,停止计数 TR1=0;/T1停止计时 timecount=0; /1s计数器变量清0 flag=1;/1s定时时间
14、到标志状态变量置1 3.3 显示子程序的设计1.先初始化8279void init8279()C8279=10; /置8279工作方式,8个字符显示,右入口C8279=0xd1; /清除 LED 显示delay();2.采用8279驱动数码管,先置显示位置,在置显示的段选码如下举例:while(x/10) i=x%10;C8279=0x80;/置显示位置D8279=ledsegi;/显示x=x/10;/ 第二个 i=x%10;C8279=0x81;/置显示位置D8279=ledsegi;/显示x=x/10;/第三个。3.4 C语言程序清单 /*数字频率计数器设计 designed by 李众*
15、/*利用单片机的T0,T1计数定时器功能,来完成对输入信号进行频率计数,计数结果通过8位动态数码管显示出来,能对0到250KHZ的信号频率进行准确计数*/* 特点1,由开关控制启动,关闭 特点2,无脉冲信号时,显示为0 特点3,可以多次测量,自动刷新 1s一次*/-头文件引用-#include#include/-宏声明-#define D8279 XBYTE0xF238/8279 数据口地址#define C8279 XBYTE0xF239/8279 状态/命令口地址#define uchar unsigned char#define uint unsigned int/-变量定义-uchar
16、 code ledseg = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71;/LED显示常数表unsigned char T0count ;/频率计最高八位计数变量unsigned char timecount;/ 1s定时器计数变量unsigned long x;bit flag;/标志位sbit k=P10;/启动开关定义1/-延时子程序-voiddelay()uint k,j;for(k=0;k100;k+)for(j=0;j500;j+);/-8279初始化子程序-void
17、 init8279()C8279=10; /置8279工作方式,8个字符显示,右入口C8279=0xd1; /清除 LED 显示delay();/-主程序-void main()unsigned char i;init8279();/8279初始化while(1) TMOD=0x15;/T1, 设为方式1定时模式,TO设为方式1计数模式TH0=0;/T0的16位计数器高八位清0TL0=0;/T0的16位计数器低八位清0 /*经过测试,初值设为19466最佳,65536-46070*/TH1=(65536-46070)/256; /T1定时50ms处置的高八位送TH1,计算公式(65536-定时
18、器初值)/晶振频率*12=0.05TL1=(65536-46070)%256;/T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080TR1=1;/启动定时器1TR0=1;/启动计数器0ET0=1;/开计数器0中断ET1=1;/开定时器1中断EA=1;/开CPU中断while(1) if(k=1)/开关设置 C8279=0xd1;/清屏 while(k=1); if(flag=1)/ 1s时间到? if(x=0)/如果没有脉冲,数码管显示全0C8279=0x80;/置显示位置D8279=ledseg0;/显示C8279=0x81;/置显示位置D8279=ledse
19、g0;/显示C8279=0x82;/置显示位置D8279=ledseg0;/显示C8279=0x83;/置显示位置D8279=ledseg0;/显示C8279=0x84;/置显示位置D8279=ledseg0;/显示C8279=0x85;/置显示位置D8279=ledseg0;/显示C8279=0x86;/置显示位置D8279=ledseg0;/显示C8279=0x87;/置显示位置D8279=ledseg0;/显示 flag=0;x=T0count*65536+TH0*256+TL0; /计算频率值while(x/10) i=x%10;C8279=0x80;/置显示位置D8279=ledse
20、gi;/显示x=x/10;/ 第二个 i=x%10;C8279=0x81;/置显示位置D8279=ledsegi;/显示x=x/10;/第三个 i=x%10;C8279=0x82;/置显示位置D8279=ledsegi;/显示x=x/10;/ 第四个i=x%10;C8279=0x83;/置显示位置D8279=ledsegi;/显示x=x/10;/ 第五个i=x%10;C8279=0x84;/置显示位置D8279=ledsegi;/显示x=x/10;/ 第六个i=x%10;C8279=0x85;/置显示位置D8279=ledsegi;/显示x=x/10;/ 第七个i=x%10;C8279=0x8
21、6;/置显示位置D8279=ledsegi;/显示x=x/10;/ 第八个i=x%10;C8279=0x87;/置显示位置D8279=ledsegx;/显示x=x/10; timecount=0;/1s定时计数器变量清0 T0count=0;/频率计最高八位计数变量清0 TH0=0;/ T0的16位计数器高八位清0 TL0=0;/ T0的16位计数器低八位清0 /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; /T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(655
22、36-46070)%256;/T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 TR0=1;/计数器0 TR1=1;/定时器1 void to(void) interrupt 1 using 0 / 定时器0中断处理函数 T0count+; / 16位计数器满,频率计最高八位计数变量加1 void t1(void) interrupt 3 using 0 /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; /T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*1
23、2=0.05 TL1=(65536-46070)%256;/T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 timecount+; / 50ms时间到,1s计数器加1 if(timecount=20) TR0=0;/时间到,停止计数 TR1=0;/T1停止计时 timecount=0; /1s计数器变量清0 flag=1;/1s定时时间到标志状态变量置1 第 4 节 结束语 这次为期两周的课程设计让我受益匪浅。以前只是对单片机更多的只是一些感性的,理论上的认识,自己真正动手的时候,才真正理解到其中的精华所在。 频率计的设计让我更好的了解如何应用单片机的定时器计数器模块,灵活应用IO口和应用8279的部分功能。其中最重要的是分析问题解决问题的能力,在我看来,写程序并不难,重要的是把程序优化,无论是在节省硬件资源,还是提高数据的准确度来看,都需要下一些功夫把它做到最好。 感谢罗老师指导我们的单片机的设计,是您的经验帮助我解决很多技术上的难题。参考文献:【1】杨恢先 黄辉先 单片机原理及应用人民邮电出版社【2】 南光群 刘金华 单片机课程设计指导书 北京理工大学15
限制150内