基于单片机数字频率计设计.docx
- 文档编号:27270800
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:53
- 大小:79.42KB
基于单片机数字频率计设计.docx
《基于单片机数字频率计设计.docx》由会员分享,可在线阅读,更多相关《基于单片机数字频率计设计.docx(53页珍藏版)》请在冰豆网上搜索。
基于单片机数字频率计设计
基于单片机的数字频率计设计
这个程序是正确的可以在单片机上运行
1引言1
2硬件设计2
3软件设计7
4调试过程及问题分析11
5结论12
参考文献12
附件13
一.引言
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案和测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
测量频率的方法有很多种,其中电子计数器测量频率具有精度高,使用方便,测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用月高频信号的频率测量,间接测频法适用于低频信号的测量。
本次为测量方波信号的数字频率计设计,设计要求如下:
(1)频率测量:
0Hz~250kHz;
(2)频率,周期显示切换
(3)用图形液晶LCD12864显示数值和单位
设计思路
由于本次测量范围较大,为保证精度我们分两段进行测量,一是500HZ-250KHZ我们用直接测频法进行测量,测量1秒内得周期个数N,被测量信号的周期为T,定时1秒,则1=NT。
由于单片机系统的标准频率比较稳定,而系统标准信号频率的误差通常情况下很小,系统的量化误差小于1,所以由式1=NT可知频率测量的误差主要取决于N值的大小,N值越大,误差越小,测量的精度越高。
因此,我们也可以取Ts内产生M个方波,则频率为f=M/T。
二是0-500HZ我们用周期测频法测量,计下两个下降沿的时间即测量周期,再计算出测量频率。
对于显示切换我们设置一个标志位,检测当标志位为高电平时为周期显示,低电平时为频率显示
基本设计原理
500HZ-250KHZ时,若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。
信号接外部中断,中断方式为下降沿,又程序设置一个变量,外部中断一次则变量加一,当信号来到时,定时器开通,由中断计数;定时器溢出时关闭,中断变量停止计数。
若定时器每次定时50ms,则中断20次即为1s。
计数器每次的值相加,则计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率f=N。
总的设计思想
我们的基本构想,将该题目分为三大模块。
第一:
信号源模块,包括方波信号的产生;第二:
计数器模块,它包括定时和计数两部分;第三:
LCD的显示,它包括字幕的显示和数字的显示。
方波信号由延时程序产生;定时和计数则通过定时器0和1来实现,LCD则通过LCD程序来实现。
二.硬件设计
本频率计的数据采集系统主要元器件是单片机STC89C52由它完成对待测信号频率的计数和结果显示等功能,外部有显示器,信号发生源。
可分为以下3个模块:
单片机系统,LCD显示模块,信号源模块。
各模块关系流程如下:
信号源→单片机→LCD显示
<500HZ
>500HZ
我设计的为单片机的计数器模块,主要用到单片机的外部中断0,定时计数器1,2,数据锁存器,等等
信号源
由另一片单片机做信号源,设计频率程序,产生一个方波信号。
LCD显示
模块接口说明
并行接口
管脚号
管脚名称
电平
管脚功能描述
1
VSS
0V
电源地
2
VCC
3.0+5V
电源正
3
V0
-
对比度(亮度)调整
4
RS(CS)
H/L
RS=“H”,表示DB7——DB0为显示数据
RS=“L”,表示DB7——DB0为显示指令数据
5
R/W(SID)
H/L
R/W=“H”,E=“H”,数据被读到DB7——DB0
R/W=“L”,E=“H→L”,DB7——DB0的数据被写到IR或DR
6
E(SCLK)
H/L
使能信号
7
DB0
H/L
三态数据线
8
DB1
H/L
三态数据线
9
DB2
H/L
三态数据线
10
DB3
H/L
三态数据线
11
DB4
H/L
三态数据线
12
DB5
H/L
三态数据线
13
DB6
H/L
三态数据线
14
DB7
H/L
三态数据线
15
PSB
H/L
H:
8位或4位并口方式,L:
串口方式(见注释1)
16
NC
-
空脚
17
/RESET
H/L
复位端,低电平有效(见注释2)
18
VOUT
-
LCD驱动电压输出端
19
A
VDD
背光源正端(+5V)(见注释3)
20
K
VSS
背光源负端(见注释3)
*注释1:
如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。
*注释2:
模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:
如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
四.模块主要硬件构成说明
控制器接口信号说明:
1、RS,R/W的配合选择决定控制界面的4种模式:
RS
R/W
功能说明
L
L
MPU写指令到指令暂存器(IR)
L
H
读出忙标志(BF)及地址记数器(AC)的状态
H
L
MPU写入数据到数据暂存器(DR)
H
H
MPU从数据暂存器(DR)中读出数据
E信号
E状态
执行动作
结果
高——>低
I/O缓冲——>DR
配合/W进行写数据或指令
高
DR——>I/O缓冲
配合R进行读数据或指令
低/低——>高
无动作
●忙标志:
BF BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.利用STATUSRD指令,可以将BF读到DB7总线,从而检验模块之工作状态.
●字型产生ROM(CGROM) 字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。
DFF=1为开显示(DISPLAYON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。
DFF的状态是指令DISPLAYON/OFF和RST信号控制的。
●显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。
●字型产生RAM(CGRAM) 字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。
●地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。
3)、光标/闪烁控制电路
此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。
三.软件设计
信号源模块
通过延时程序完成,想要得到多少的频率,只需改变变量从而改变定时的时间,以此达到产生方波的要求。
计数器模块
此模块为我和杨勇华在别人的帮助下设计
oiddo_for_fre()
{
unsignedlongintfre_temp1,fre_temp2;
if((fre<=1300000)&&(fre>1000000))
{
fre=1000000;
return;
}
if(fre>=100000)
{
fre_temp1=fre/100000*100000;
fre_temp2=fre-fre_temp1;
if(fre_temp2>=50000)
{
fre=fre_temp1+100000;
}
else
{
fre=fre_temp1;
}
}
}
voidfre_counter()
{
if(T0_counter>=20)
{
fre_P=fre;
if(fre>100)
{
EX0=0;
TR0=0;
}
else
{
count_style=1;
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T0_counter=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
T1_counter=0;
TR1=1;
while((count_style<3)&&(T1_counter<45));
{
if(T1_counter<=40)
{
fre=((unsignedlongint)T0_counter*50000+TH0*256+TL0+50000-65536);
do_for_fre();
fre=1000000/fre;
}
else
fre=0;
}
}
after_count();
}
}
voidT050ms()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T0_counter++;
}
voidT150ms()interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
T1_counter++;
}
voidInpt0()interrupt0
{
if(count_style==0)
{
fre++;
}
else
{
if(count_style==1)
{
TR0=1;
}
if(count_style==2)
{
TR0=0;
}
count_style++;
}
}
voidTimer_init()
{
TMOD=0x11;//设置T1,T0的工作方式(16进制定时器)
ET0=1;//开定时器T1,T0中断
ET1=1;
IT0=1;
EA=1;//开总中断
}
以上即定时计数程序
将方波信号直接连接到P3.2即外部中断口。
将TO做定时器,单片基的频率为12MHZ,则时基为,将如果让TIMER0工作在MODE1,即16位定时器模式下,每次载入初值,则可以让其产生每50ms时间间隔的中断,在中断中读取TIMER1的计数差值。
当产生20次中断得到的定时即为1s,因此要定时多久只需通过改变变量的值,这样能够很方便的得到想要的定时。
计数当外部输入脉冲发生负跳变时,中断变量加一,最后的所得的值保存
通过对保存的值求余得到频率的个位,十位,百位,千位,万位,将所得每位数字送给LCD显示器显示。
当低频时对两次下降沿间的时间进行测量,从而计算再显示
LCD显示
将转化了的十进制频率数值通过LCD显示出来。
将LCD初始化,LDC清屏设置LCD坐标函数,写左区,写右区,判断忙标志,送行命令,判断忙标志,送列命令,显示英文字符串、数字等先定义好LCD显示,在主函数时仅需调用LCD函数就可以了。
三,调试过程及问题分析
调试并将程序载入实验机的过程中出现了很多问题。
比如调试出现很多语法错误,全局变量局部变量弄混,通过问老师和同学解决了
刚开始设计时我们分块了,我和杨勇华设计时采用的是汇编语言,而显示模块的设计却是C语言,汇编语言和C语言不会互相调用。
在问了很多人不会的情况下我们又对定时计数程序进行改写,在别人的帮助下该为了C语言。
生成的频率达不到要求的范围,这个原因有很多,函数调用太过频繁,中断产生太过频繁等等这些都需要时间来响应,因此导致产生的频率不能达到所要求的范围,但是,经过很多的改动之后,最后终于能够实现我们所要求的范围了
再有就是我们设计好后两单片机下载程序时下不下来,显示不出,检查可能是数据线坏了,选择串口位置不对,显示器坏了,或者中断接口接错等
测量误差随频率变动较大,解决这个问题应该是多设置几个闸门时间,不同范围的频率用不同的闸门,但是由于我们最后时间太紧迫,没有时间去考虑这些问题所以没有改进,如果有机会就可以根据这个思路实现等精度测量
四,结论
这次单片机实习是我第一次运用刚学的知识去制作实际要运用的东西,这两个星期我学到了很多东西,不仅仅是学习上的,还有很多方面。
刚开始实习的时候我们什么也不懂,我甚至连干什么都不知道,以为就是一个人去编写老师布置的程序。
后来才发现不是,这不仅是个人的事,是一个团队的相互协作,没有团队不知道协作也做不了。
实习时我们得到一个课题老师就让我们做,刚开始我连做什么都不知道,不知道怎么运用我们所学的知识。
于是我们就去网上查找资料,这时我才发现原来查资料也不是一件容易的事情。
查资料不仅要查还要看懂,然后筛选出有用的东西。
而且对于所有资料要有方法,有选择的看,刚开始时我看到相关资料就去认真看,结果很多资料我们根本就没用或者根本看不懂,浪费了很多时间,后来我学会了怎样找资料,在后来的模块设计中有了很大的帮助。
找到资料明白了怎样做,我们就分给每个人任务,自己做自己的模块。
我和小华做计数器模块,我们相互协作,找老师问同学,整个过程还是比较顺利的,我们最后还是编写出来了程序。
我很高兴,那时我认为我们很快就要完成了,而且所有的都是自己努力做到的。
然而在最后我们将程序整合的时候却出现了问题。
我们组其他人编写的模块是用C语言编程的,而我和小华却是用汇编语言编程的,我们根本不会用C语言去调用汇编语言。
结果查了很多资料,问了老师同学,还是不会。
最后竟然要将我们的汇编语言全部改为C语言才可能做出来。
一下我就跌落到谷底,因为时间不多了,而且我们C语言也不是很好。
没办法,只能求助于其他同学了,在其他同学的帮助下,我们做了很长时间,付出了很大的努力才做出来。
通过这次事情我明白了很多,首先,明白了在一个团队中每个人都有自己的任务,我们应该做好自己的事,但是我们也不能对于其他队友的事一点也不了解,要适当知道一些,这样才可能事半工倍。
就像这次,如果我们相互知道对方的程序一点就不会倒最后还要改了。
其次,当我们有困难的时候也要想办法解决,不能放弃。
最后两天我们的程序还没出来,那时我都想放弃了,但是组员们都还在努力,我不能放弃,结果我们做出来了。
最后,我们在自己努力了还不会,那么就要问,同学老师都是身边的资源。
通过这次实习,对单片机,汇编语言,C语言,以及LCD显示器有了更加深入的了解。
更加明白团队合作的意义,学到了更多做人,做事的道理。
我很庆幸我参加了这次实习。
五,参考文献
[1]杨恢先,黄辉先.单片机原理及应用[M].北京:
人民邮电出版社,2006
[2]杨路明,郭浩志.C语言程序设计教程.北京邮电大学出版社,2005
六,附件
主要程序代码
#include
externvoidvWrite8x16String(unsignedchar*str,unsignedcharcol,unsignedcharrow,bitflag);
externvoidLcminit(void);
externvoidLcmcls(void);
externvoidWrite_HZ(unsignedchar*bm,unsignedcharrow,unsignedcharcol,bitflag);//LCD12864显示
externunsignedcharcodetable[]={0xfe,0xfd};、、、、、外部函数调用声明
sbita0=P1^4;
sbita1=P1^5;
sbita2=P1^6;
sbita3=P1^7;
#defineHC138_ENABLEa3=1
#defineHC138_UNABLEa3=0
#defineKEY_ENABLEa0=0;a1=0;a2=1
#defineLED_ENABLEa0=0;a1=1;a2=0
unsignedlongintfre=0;
unsignedlongintfre_P=0;
unsignedcharstr_buffer[7];
unsignedcharT0_counter=0;
unsignedcharT1_counter=0;
unsignedcharcount_style=0;
bitFT=0;
bitfinish=0;
voiddelayms(unsignedchartime)
{
unsignedchari,j;
for(i=0;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字频率计 设计