由于输入信号的变化可能很大,在大信号时能满足要求而在 50 mv( 峰 — 峰值 ) 时,很容易受到干扰。电路在设计时,采用大面积接地和金属屏蔽层,输入引线采用高频输入线,以消除外界的电磁场干扰;在每一部分的电源电路均采用电感、电容滤波,消除各部分电路的相互干扰;而且在电路中采用施密特触发器,提高比较门限,消除了大部分杂波,保证了信号的纯真度;对机械按键在闭合时伴有的抖动,加上了防抖控制; 单片机 还采用了 “ 看门狗 ” 电路.防止 CPU 失控,确保系统安全运行;在软件上采用软件陷阱、容错技术和均值滤波等抗干扰措施,提高了抗干扰特性;采用四字节乘除法保证了测试的精度在数据处理时不受影响。
9 ,频率计的软件设计
9.1 计数原理
信号经过整形成为方波,输入到 端,在 P3.2 处于低电平时进行初始化操作; TR0 置位,打开定时器 / 计数器; GATE=1 ,使 T0 在 TR0 和 均为 1 时开始计数;将 T0 的高八位单元 TH0 和低八位单元 TL0 均赋值 00H, 使 T0 由 0 开始计数(如图 7 所示)。
图 7 计数原理
T0 初始化完成后, TR0=1,GATE=1, 此时 T0 等待 升为高电平,高电平到达, T0 启动计数。每一机器周期, T0 自动加 1 计数。当 降为低电平后,由于不能同时满足 TR0 和 均为高电平,故 T0 停止计数。 T0 中存储的是以周期数表示的脉宽。
经式( 2 )计算得出频率 f 为
( 8 )
此计算过程调用无符号双字除法程序来实现。
为显示频率,必须将二进制码转换为 BCD 码,这一过程分两步完成。第一步,二进制转换成压缩 BCD 码;第二步,将压缩 BCD 码分送各缓冲区,调用显示子程序,送数码管延时显示频率值。
9.2 总体软件编程:
9 . 2 . 1 、 设计方案
利用 AT89C51 单片机 的 T0 、 T1 的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过 4 位动态数码管显示出来。要求能够对 0 - 10KHZ 的信号频率进行准确计数,计数误差不超过± 1HZ 。
9 . 2 . 2 、 电路图
9 . 2 . 3 、 工作原理
1). 定时 / 计数器 T0 和 T1 的工作方式设置,由图可知, T0 是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的 T0 ,最大计数值为 fOSC/12 ,由于 fOSC = 12MHz ,因此: T0 的最大计数频率为 10KHz 。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以 T1 工作在定时状态下,每定时 1 秒中到,就停止 T0 的计数,而从 T0 的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。
2) . T1 工作在定时状态下,最大定时时间为 65ms ,达不到 1 秒的定时,所以采用定时 50ms ,共定时 20 次,即可完成 1 秒的定时功能。
9 . 2 . 4 、源程序
#include <AT89X52.H>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char dispbuf[4]={0,0, 10,10};
unsigned char temp[4];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
void main(void)
{
unsigned char i;
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
while(1)
{
if(flag==1)
{
flag=0;
x=T0count*65536+TH0*256+TL0;
for(i=0;i<4;i++)
{
temp[i]=0;
}
i=0;
while(x/10)
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];
}
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}
void t0(void) interrupt 1 using 0
{
T0count++;
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
timecount++;
if(timecount==10)
{
TR0=0;
timecount=0;
flag=1;
}
P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];
dispcount++;
if(dispcount==4)
{
dispcount=0;
}
}
10 小论
本文的工作基础是应用 单片机 设计的数字频率计。利用 C 语言进行单片机应用系统数字频率计的设计,不仅编程简单,精度高,而且避免了汇编语言在进行乘除法运算时要考虑采用浮点运算的要求。与汇编语言相比编程语句大大减少。数字频率计的软件均经过测试。并进行了误差分析。频率的测量范围从 1Hz 到 1MHz ,具有一定的实用价值。
结论
大学四年中,我系统的学习了 单片机 的知识,也看到了单片机控制程序的广阔前景,选择这个课题,正是希望能加深自己对单片机各方面的理解,并在运用先前学到的知识进行设计的过程中,进一步的理解其实质和作用,巩固和拓展以前的学习成果,从而希望今后能在这个领域作出成绩。
由于 单片机 技术发展已经很成熟,我们更多的是借鉴前人的工作,完善我们的设计。当然,我们在前人的基础上向前走了一步,无论是原器件的选择,还是程序的设计,我们做的比他们复杂,这并不是简单意义上的重复,而是消化吸收和创新。
在设计的过程中,我们一方面澄清了先前的一些错误理解,另一方面也真正的体会到了书本知识转化为实践时的困难,往往很不起眼的一件事情,就是设计的关键,必须得搞清楚。为了查找相关的技术文献资料,我们上网,去学校图书馆甚至去省图书馆查找资料,虽然辛苦一点,但是令人欣慰的是学到了书本上学不到的东西,并且掌握了设计的一般方法。
三个月的时间很短,我们的能力也有限,很可能我们的设计存在这样或那样的不足,希望各位多多批评斧正。我在这次设计中学到了很多东西,我认为最大的收获就是学会了和别人分工协作去完成一件事。这次设计的成功是我和本组同学团结协作的成果。
三个月的时间很快过去了,本篇论文也已初步完成。在这里首先要感谢院、系领导给予的大力支持,特别是张清林主任的支持,为本组提供了良好的设计环境和必要的设计装备,特别要感谢指导老师——张清林老师给予的悉心指导和不厌其烦的热情帮助,张老师以其渊博的知识、严谨的治学态度、开拓进取的精神和高度的责任心,给我的学习、工作、生活以很大的影响,并将永远激励我奋发向上。在此谨向导师表示最衷心的感谢、并致以崇高的敬意!
感谢答辩组的各位老师在炎热的天气下为我们所作的各种工作和对我们论文所作的批评斧正。
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
本文关键字:单片机 51单片机,单片机-工控设备 - 51单片机
上一篇:一种基于C51的多任务机制及应用