单片机频率计数器课程设计讲解.docx
《单片机频率计数器课程设计讲解.docx》由会员分享,可在线阅读,更多相关《单片机频率计数器课程设计讲解.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机频率计数器课程设计讲解.docx](https://file1.bdocx.com/fileroot1/2022-11/29/45d9095b-8e5a-45e6-b2e5-69667cc0cb2e/45d9095b-8e5a-45e6-b2e5-69667cc0cb2e1.gif)
单片机频率计数器课程设计讲解
课程设计报告
课程名称:
单片机课程设计
题目:
基于单片机的频率计数器设计
学院:
环境与化学工程系:
过程装备与测控工程
专业:
班级:
学号:
学生姓名:
起讫日期:
指导教师:
摘要
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
它是一种用十进制数字,显示被测信号频率的数字测量仪器。
它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。
本课程设计主要设计一个简易的频率计,来实现信号在0-9999HZ范围内周期变化的方波频率的测定。
该文主要介绍了基于STC89C52单片机频率计的设计方案和实现方法,该系统主要由硬件和软件两部分组成,其中重点给出了具体硬件电路图和软件流程图以及具体工作原理。
硬件部分通过洞洞板的布线设计帮助,可以确保焊接时尽量少的飞线和出错。
软件通过keilµvision编译及调试,其中在P1.7口编入了一个5500HZ的方波,用以仿真调试该频率计的软硬件功能是否能够实现输出频率的功能。
另外,本设计多增加了一个按键功能,通过一个按键来控制定时计数器的开始和关闭。
该频率计还带有3*3的矩阵键盘,可以作为扩展应用区,通过编程实现。
本设计中用的是LED共阴数码管,输出频率时采用的事动态显示的方法。
关键词:
频率计;单片机;动态显示
一、频率计数器的设计任务和要求
1.1频率计数器的设计任务
本课程设计任务主要是基于单片机系统,通过软件、硬件的调试,完成一个具有计数功能的频率计数器。
1.2设计要求及发挥部分
1.设计要求主要有:
●设计的方案合理、正确;
●完成系统硬件的设计及正确焊接;
●完成系统软件的设计与调试;
2.发挥部分:
本课程设计的发挥部分较小,只再增加了一个按键来控制定时器,计数器的开始。
二、方案的总体设计
2.1方案的设计
本课程设计的基于ATMEL公司STC89C52单片机的频率计数器,是利用该52单片机内部的定时计数器来完成待测信号频率的测量。
STC89C52单片机内部具有2个16位的定定时计数器T0与T1,可以通过编程来实现所需要的功能。
定时/计数器T0与T1的核心都是16位的加1计数器,TH0与TL0构成在构成定时器/计数器T0加1计数器的高8位和低8位;TH1与TL1构成在构成定/计数器T1加1计数器的高8位和低8位。
加1计数器的初值可以通过程序设定,这样就可以获得不同的计数器初值或定时时间。
加1计数器用作定时器时,每个机器周期加1,这样以机器周期为基准可以用来测量时间间隔。
定时/计数器用作计数器时,在相应的外部方波从1到0的跳变时计数器加1,这样在计数闸门的控制下可以测量待测信号的频率。
定时/计数器的工作由响应的运行控制位TR控制,当TR置1时,定时/计数器开始计数,当TR置零时停止计数。
在本设计方案中,我在程序中设定T0工作在计数状态,T1工作在计时状态下。
T0计数器对输入信号进行计数,由于信号的频率就是每秒钟信号的脉冲个数,于是我让T1工作在定时状态下,定时时间为1秒。
每定1秒钟到,就停止T0的计数,然后从T0的计数单元中读取计数的数值,即完成了信号的频率测量。
最后通过四位数码显示出频率值。
由于要尽可能的使用最少的元件,在满足设计要求的前提下,我将P1.7口与P3.4口(即T0)用导线连接,在设定程序时,利用T1定时的同时在P1.7口输出一个设定好的方波,以便直观的检测频率计数器的软件、硬件是否达到设计的基本功能。
2.2方案的整体框图
图1系统总体框图
2.3方案的说明
本课程设计采用内部给定的方波来实现频率计数的功能,缺陷在于只能测得一个方波的频率,但是这个方波的输入意在便于检测设计的软、硬件的功能是否实现,若功能可以实现,则可用于测量外部输入的0--10000HZ之间的任意频率值。
3、硬件设计
3.1单片机的最小系统
3.1.1上电复位电路
复位是单片机的初始化操作。
单片机系统在上电启动运行时,都需要先复位。
其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
而复位是一个很重要的操作方式,但单片机本身是不能自动经行复位的,必须配合相应的外部复位电路才能实现。
本设计的复位电路采用上电复位加按键手动复位,其电路如下图所示:
图2上电复位电路
3.1.2晶振电路
单片机工作是在统一的时钟脉冲控制下一拍一拍地进行的,这个脉冲是单片机控制器中的时序电路发出的。
单片机的时序就是CPU在执行指令时所需控制信号的时间顺序。
为了保证各部件的同步工作,单内部电路应在唯一的时钟信号下严格按时序进行工作。
其电路原理图如下:
图3晶振电路
3.2LED数码管显示电路
显示器是微机重要的输出设备。
显示器有显示监控结果、提供用户操作界面等功能。
在本次设计中采用了LED显示器,即数码管。
数码管的每一个数码段是一只发光二极管。
当发光二极管导通时,相应的一个点或者一个笔画发光,控制发光二极管发光组合,可以显示出所需字符。
我采用了共阴极结构。
在定义其显示字形的码段时,通过I/O口送出七段码
其段码表如下:
表1共阴数码管段选码
显示字形
0
1
2
3
4
5
6
7
8
9
共阴段选码
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH
数码管的电路图如下:
图4数码管接线电路
3.3整体电路
图5整体原理图
4、软件设计
本课程设计包含了主函数、初始化子函数、中断子函数、按键扫描子函数和延时子函数等多个函数。
开始
4.1程序流程图
初始化
中断程序
频率输出
图6主流程图
4.2初始化子函数
初始化子函数主要是:
1.对T0、T1定时/计数器进行初始化;2.对单片机各管脚及按键赋初值,以便主程序的执行。
4.3延时子函数
主要用于数码管动态显示的子程序中。
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
4.4中断子函数
流程图如下:
图7中断程序流程图
5、系统的调试和说明
5.1C程序的说明
C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,位操作能力强,适用于各种应用的程序设计。
使用C语言进行单片机应用系统开发,具有编程灵活、调试方便、目标代码编译效率高的特点。
C语言也是目前使用最广的单片机应用系统编程语言。
由C语言编程的单片机应用程序,称为单片机C语言程序。
MCS-51系列单片机开发系统的编译软件可以对51单片机C语言源程序进行编译,称为C51编译器。
在C51编译软件中可进行51单片机C语言程序的调试。
5.2C程序编译的结果
在keilµvision上编译的结果:
图8程序调试图
5.3实物图
图9正面实物图
图10反面实物图
6、设计总结与心得体会
6.1设计总结
为期一周的单片机课程设计已经接近尾声了,单片机课程设计的主要目的是让我们提高动手能力和综合运用能力。
经过这一周的设计,我更加深刻的体会到“万事开头难”这话的含义了。
这次单片机的课程设计,我选的课题是频率计数器。
这个看似很简单的课题,要实现起来却是困难重重。
首先是硬件的设计,通过在lochmaster上布线设计硬件的连接方式,这一步还是比较轻松,主要是布的线要尽可能的不交叉。
之后就开始对着图焊板子,开始把元器件焊上去还是比较简单好看的。
可是紧接着进入焊线阶段就难住我了,线拉不直,焊在板子上就很丑;另一方面,在焊的过程中就会发现有那么几根线是按照布线图来焊是实现不了的,于是,中途又会重新改布线图。
硬件部分我花了一天的时间,反反复复的修改,焊接,终于初步完成了。
板子焊好后就进入硬件调试阶段,硬件调试时,发现了线路的一些错误接法和元器件位置的错接等等,这样有花了半天时间调试修改,硬件就基本上算是完成了。
接着马上又进入了编写软件及调试过程,这是让我最头疼的一部分。
我自己边看视频边按着流程图慢慢的编写了一个,可是输入硬件后不出意外的,无法实现其功能。
于是就进入软件的调试阶段,这个过程持续了很长时间,最后是通过同学的帮助才能调试成功,实现它能实现的功能,当然还是有些微小误差的。
总的来说,这一个星期里学到了很多的东西,更觉得自己需要不断的提高自己。
6.2设计心得
通过一周的单片机课程设计,真的是感触颇多。
这一个星期以来我们每天早上9点就到教室一直待到晚上9点才回去,每天和大家在一起焊板子,一起讨论问题,一起互相帮助的画面还历历在目。
这其中有欢声笑语,也有苦有累。
在评优答辩的时候,看到了很多很多优秀的课程设计,让我一边敬佩,又一边自惭形秽。
每个优秀的人都有着不同常人的努力,而我还不够努力,所学的东西也很有限。
很多优秀的课程设计都是通过他们自己在课余时间自学而成的。
相比之下,我需要更加努力的去学习更多的知识,不断的填充自己。
7、参考文献
【1】张友德,《单片微型机原理应用与实践》(第四版),复旦大学出版社,2000
【2】李朝青.单片机原理及接口技术(第三版).北京航空航天大学出版社.2005.
【3】丁明亮、唐前辉.51单片机应用设计与仿真--基于KeilC与Proteus.北京航空航天大学出版社,2009.
【4】杨长兴、刘卫国.C++程序设计.中国铁道出版社.2010.
附录
1、源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbitD1=P1^0;
sbitD2=P1^1;
sbitD3=P1^2;
sbitD4=P1^3;
sbitD5=P1^7;
sbitA1=P2^4;
sbitA2=P2^5;
uintm,i,t;
uintA0,B0,C0,D0;
voiddisplay(uintA0,uintB0,uintC0,uintD0);
voidinit();
voiddelay(ucharz);
voidmain()
{
init();
A1=0;
A2=1;
while
(1)
{
if(A2==0)
{
A2=0;
TR0=1;
TR1=1;
if(i<1000)
{
A0=m/1000;
B0=m%1000/100;
C0=m%100/10;
D0=m%10;
}
display(A0,B0,C0,D0);
if(i==1000)
{while
(1)
{display(A0,B0,C0,D0);}
}
}
}
}
voidinit()
{
i=0;
m=0;
t=0;
D5=1;
TMOD=0x16;
TH1=(65536-20)/256;
TL1=(65536-20)%256;
EA=1;
ET1=1;
ET0=1;
TH0=0xff;
TL0=0xff;
TR0=0;
TR1=0;
}
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
voidtimer0()interrupt1
{
TR0=0;
TH0=0xff;
TL0=0xff;
m=m+1;
}
voidtimer1()interrupt3
{TR1=0;
TH1=(65536-20)/256;
TL1=(65536-20)%256;
i++;
t++;
if(t==15)
{
D5=~D5;
t=0;
}
TR1=1;
}
voiddisplay(uintA0,uintB0,uintC0,uintD0)
{D4=1;
D1=1;
P0=table[A0];
D1=0;
delay
(1);
D1=1;
D2=1;
P0=table[B0];
D2=0;
delay
(1);
D2=1;
D3=1;
P0=table[C0];
D3=0;
delay
(1);
D3=1;
D4=1;
P0=table[D0];
D4=0;
delay
(1);
}
2、硬件名称列表
序号
名称
数量
1
STC89C52单片机
1
2
排阻
1
3
LED数码管
1
4
按键
10
5
220Ω电阻
1
6
1KΩ电阻
2
7
USB接口
1
8
30pf电容
2
9
10µf电容
1
10
12M晶振
1