简易频率计数器的设计Word格式.docx
- 文档编号:15783376
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:14
- 大小:1.85MB
简易频率计数器的设计Word格式.docx
《简易频率计数器的设计Word格式.docx》由会员分享,可在线阅读,更多相关《简易频率计数器的设计Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
在计数器工作方式下,加至外部引脚的待测信号发生从1到0的跳变时计数器加1。
外部输入在每个机器周期被采样一次,这样检测一次从1到0的跳变至少需要2个机器周期(24个振荡周期),所以最大计数速率为时钟频率的1/24(使用12MHz时钟时,最大计数速率为500kHz),也就是说使用12MHz时钟的AT89S51单片机设计的频率计数器系统,所测的信号的频率不能大于500kHz,若大于则必须通过分频器分频才能测试,而本次任务的要求是对0~300KHz的信号进行测量,所以可以直接进行。
利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数。
设置定时器
0
工作在定时方式1,定时1S,并产生方波信号从P1.1引脚输出。
1
工作在计数方式1,对输入脉冲进行计数,溢出产生中断。
将定时器
1中断定义为优先。
由于16位二进制加法计数器的最大计数值为
65535,1S之内可能会产生多次溢出,所以需要在中断处理程序里对中断次数进行计数。
1S到后,将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送显示。
定时器T0的计数初值:
由于定时器T0工作在定时方式时最大的定时时间大约为65ms,若要定时1S,可以采用定时20ms,中断50次来完成1s的定时。
对于定时20ms来说,用定时器方式1可实现。
机器周期为:
Tp=12/晶振频率=12/12MHz=1μS
计数初值为:
X=2n-TC=216-20000=45536=B1E0H
故TH0=B1H,TL0=E0H。
信号频率的计算:
T1工作在计数方式时最大的计数值为216,若假设1S内溢出C1次,最后未溢出的计数值为C2,则F=C1*216+C2=C1*65536+(TH1*256+TL1)。
编写的源程序如下:
//plj.c
#include<
reg51.h>
#include<
stdio.h>
#defineucharunsignedchar
uchardisplay_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
//定义数组存放显示数据的编码
uchardisplay_data[8]={0,0,0,0,0,0,0,0};
//定义数组存放显示数据的各位
ucharc1,b1;
sbitP1_1=P1^1;
voiddelay(void)//延时
{
uchari;
for(i=500;
i>
0;
i--);
}
voiddisplay()//显示程序
uchari,k;
k=0x01;
for(i=0;
i<
8;
i++)
{
P2=0;
P0=display_code[display_data[i]];
P2=k;
k=k<
<
1;
delay();
voidconvert()//转换程序
uchari,f2;
longf,f1,k;
f=c1*65536+TH1*256+TL1;
f1=f-f%10;
//此变量是为了让八位LED的高位为0时不显示而设置
for(i=7;
i--)//此循环将计数值转换为显示数组,从高位到低位依次存放在
//display_data[0]至display_data[7]
{display_data[i]=f%10;
f=f/10;
}
display_data[0]=f;
k=1e7;
//从这开始到本子程序结束的语句完成让八位LED的高位为0时不显示
for(i=0;
7;
{f2=f1/k;
if(f2==0)
display_data[i]=10;
k=k/10;
voidtimer1(void)interrupt3//定时器1中断服务程序
c1++;
voidtimer0(void)interrupt1//定时器0中断服务程序
TH0=0xb1;
//装入时间常数
TL0=0xe0;
P1_1=!
P1_1;
//P1.1取反,从P1.1引脚输出25Hz的方波信号,通过导线连接
//到P3.5引脚输入,以方便调试程序。
若使用其它信号源,则去掉即可。
if(b1==49)
convert();
c1=0;
//将计数值清零
b1=0;
TH1=0;
TL1=0;
elseb1++;
voidmain(void)//主函数
P0_1=0;
TMOD=0x51;
TH0=0Xb1;
TL0=0Xe0;
IE=0x8a;
TCON=0x50;
while
(1)
display();
4.程序调试与电路仿真
将KeilC51程序编译过程中建立的plj.hex文件添加进Proteus中的单片机芯片,如图2,点击模拟调试按钮的运行按钮,进入调试状态。
此时可看到数码管显示25。
图2添加plj.hex文件进单片机芯片
源程序编译软件keilC51的使用
KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编、PLM语言和C语言的程序设计,界面友好,易学易用。
在51系列单片机的学习与开发过程中,keilC51软件的使用为程序设计开发提供了一个高效率的平台。
本设计通过一个C语言程序的实现,来学习KeilC51软件的基本使用方法和基本的调试技巧。
运行keilC51编辑软件,软件界面如图3所示:
图3keilC51启动界面
1.建立一个新的工程项目
单击Project菜单,在弹出的下拉菜单中选中NewProject选项,如图4所示。
图4“建立新工程项目”操作框
2.保存工程项目
选择要保存的文件路径,输入工程项目文件的名称,如保存的路径为C51文件夹,工程项目的名称为C51,如图5所示,单击保存:
图5
3.为工程项目选择单片机型号
在弹出的对话框中选择你需要的单片机型号,如图6所示,这里我们选择51核单片机中使用较多的89S51,选定型号后,单击确定,出现如图7所示的开发平台界面:
图6“CPU选择”对话框
图7新工程项目建好后的对话框
4.新建源程序文件
在下图中单击“File”菜单,选择下拉菜单中的New选项,新建文件后得到如图8的界面:
图8新建文件后屏幕图
5.保存源程序文件
单击“File”菜单,选择下拉菜单中的Save选项,在弹出的对话框中选择保存的路径及源程序的名称,如图9所示。
图9“保存源程序文件”对话框
6.为工程项目添加源程序文件
在编辑界面中,单击“Target”前面的“+”,再在“SourceGroup”上单击右键,得到如图10所示的对话框,选择“AddFiletoGroup’SourceGroup1’”,弹出如图11所示的对话框,选中要添加的源程序文件,单击“Add”,得到如图12所示的界面,同时,在“SourceGroup1”文件夹中多了一个我们添加的“Text1.c”文件。
图10“为工程项目添加源程序文件”操作框
图11“为工程项目添加源程序文件”对话框
图12“输入源程序文件”对话框
7.输入源程序文件
源程序输入完成后,保存,得到如图13所示的界面。
程序中的关键字以不同的颜色提示用户加以注意,这就是事先保存待编辑的文件的好处,即Keilc51会自动识别关键字。
图13“源程序输入完成后”对话框
8.编译调试源程序
在上图中,单击Project菜单,在弹出的下拉菜单中选中BuiltTarget选项,再单击Debug菜单,在弹出的下拉菜单中选中Start/StopDebugSession选项,编译成功后,再单击Debug菜单,在弹出的下拉菜单中选中Go选项,进行源程序调试。
如图14所示。
图14“编译调试程序”对话框
9.查看分析结果
单击Debug菜单,在弹出的下拉菜单中选中StopRunning选项,单击View菜单,在弹出的下拉菜单中选中SerialWindows#1选项,可以看到程序运行的结果,如图15所示:
图15“查看分析结果”对话框
10.生成Hex代码文件
将编译调试成功的源程序生成可供单片机加载的Hex代码文件,单击Project菜单,在弹出的下拉菜单中选中OptionsforTarget’Target1’选项,在弹出的对话框中单击Output选项,选中其中的“CreateHEXFile”项。
如图16所示:
图16“设置生成Hex代码文件”操作框
则一个完整的工程项目就在KeilC51软件上就编译完成了。
参考文献
[1]杨恢先,黄辉先.《单片机原理及应用》.北京:
人民邮电出版社.2006
[2]张永革,何乃味.《单片机C语言应用技术与实践》.北京:
北京交通大学出版社.2009
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 频率 计数器 设计