单片机课程设计报告书Word格式.doc
《单片机课程设计报告书Word格式.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告书Word格式.doc(10页珍藏版)》请在冰豆网上搜索。
三.频率计原理:
本系统采用测量频率法,可将频率脉冲直接连接到AT89C51的T0端,将T/C1用做定时器。
T/C0用做计数器。
在T/C1定时的时间里,对频率脉冲进行计数。
在1S定时内所计脉冲数即是该脉冲的频率。
图1:
测量时序图
由于T0并不与T1同步,并且有可能造成脉冲丢失,所以对计数器T0做一定的延时,以矫正误差。
具体延时时间根据具体实验确定。
四.功能及按键说明
P0.0~P0.5为LED位选择,其中P0.5指向十万位P0.0指向个位,RP1为P0口的上拉电阻。
P2.0~P2.7为LED的段位选择,对应LED的A,B,C,D,E,F,G,DP。
P3.4为待测频率入口。
五.程序流程图
1.主程序main流程图
2.定时50ms中断子程序xtimer1()流程图
3.显示子程序display流程图
六.原理图
图2:
频率计原理图
七.源程序代码
/*简易数字频率计:
T1定时计器,T0计数器,由P34(/T0)口输入待测频率*/
/*T1定时1S,在这1S内T1的计数值就是待测的频率值。
*/
#include<
reg52.h>
//头文件
intrins.h>
#defineucharunsignedchar//宏定义
#defineuintunsignedint//宏定义
sfr16DPTR=0x82;
//定义DPTR
bitstatus_F=1;
//状态标志位
uintaa,qian,bai,shi,ge,bb,wan,shiwan;
//定义变量
ucharcout;
unsignedlongtemp;
//定义长整型变量
/*数码管显示0-9*/
ucharcode
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*子函数声明*/
voiddelay(uintz);
voidinit();
voiddisplay(uintshiwan,uintwan,uintqian,uintbai,uintshi,uintge);
voidxtimer0();
voidxtimer1();
/*主函数*/
voidmain()
{
P0=0XFF;
//初始化P0口
init();
//调用定时器,计数器初始化
while
(1)
{
if(aa==19)//定时20*50MS=1S
{
aa=0;
//定时完成一次后清0
status_F=1;
//完成计数
TR1=0;
//关闭T1定时槛,定时1S完成
delay(46);
//延时较正误差
TR0=0;
//关闭T0
DPL=TL0;
//计数量的低8位
DPH=TH0;
//计数量的高8位
temp=DPTR+cout*65535;
//计数值放入变量
shiwan=temp%1000000/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
//显示千位
bai=temp%1000/100;
//显示百位
shi=temp%100/10;
//显示十位
ge=temp%10;
//显示个位
}
display(shiwan,wan,qian,bai,shi,ge);
//调用显示函数
}
}
/*定时器,计数器初始化*/
voidinit()
temp=0;
//变量赋初值
aa=0;
cout=0;
IE=0X8A;
//开中断,T0,T1中断
TMOD=0x15;
//T1为定时器工作于方式1,T0为计数器工作于方式1
TH1=0x3c;
//定时器赋高8初值,12M晶振
TL1=0xb0;
//定时器赋低8初值,12M晶振
TH0=0;
//计数器赋高8初值初值
TL0=0;
//计数器赋低8初值
TR1=1;
//开定时器1
TR0=1;
//开计数器0
/*显示子函数*/
voiddisplay(uintshiwan,uintwan,uintqian,uintbai,uintshi,uintge)
P0=0xdf;
//P0口是位选11011111改成11111101==0XDF
P2=table[shiwan];
//显示shiwan位
delay(5);
P0=0xef;
//P0口是位选11101111改成11111110==0XFE
P2=table[wan];
//显示wan位
delay(3);
P0=0xf7;
//P0口是位选111101111改成01111111==0X7F
P2=table[qian];
P0=0xfb;
//P0口是位选11111011改成10111111==0XBF
P2=table[bai];
P0=0xfd;
//P0口是位选11111101改成11011111==0XDF
P2=table[shi];
P0=0xfe;
//P0口是位选 11111110改成11101111==0XEF
P2=table[ge];
/*定时中断子函数*/
voidxtimer1()interrupt3
//定时器赋高8初值
//定时器赋低8初值
aa++;
/*计数器中断子函数*/
voidxtimer0()interrupt1
{
cout++;
/*延时子函数。
延时1MS*/
voiddelay(uintz)
uinti,j;
for(i=0;
i<
z;
i++)
for(j=0;
j<
110;
j++);
//j上限为125
八.仿真结果与分析
此简易频率计的特点是由于加入了延时补偿,对于低频率脉冲能够准确计数,对于较高频率,则频率越高,误差越大。
但总体来讲,误差相对较小。
1.在1~3257HZ,测量结果是准确的,如图1所示1HZ,1KHZ,3257HZ的仿真图:
图3:
1HZ,1KHZ,3257HZ的仿真图:
2.在3258HZ~9.5KHZ的时候测量有误差并且慢慢减少。
在3258HZ时候达到最大误差0.03069%,如图。
9.5KHZ时候达到最小误差0.01368%。
如图。
测量3258HZ的仿真结果
图4:
测量95013HZ的仿真结果
3.从9.6KHZ~999.7629KHZ,测量误差越来越大,在9.6KHZ为0.01458%,在999.7629KHZ时为0.0237%
图5:
测量9.6KHZ的仿真结果
图6:
测量999.7629KHZ的仿真结果
九.课程设计心得体会
在单片机应用系统设计时,必须先确定该系统的技术要求,这是系统设计的依据和出发点,整个设计过程都必须围绕这个技术要求来工作。
在设计时遵循从整体到局部也即自上而下的原则。
把复杂的问题分解为若干个比较简单的、容易处理的问题,分别单个的加以解决。
在设计开始时,我们应根据应用的和设计要求提出设计的总体任务,绘制硬件和软件的总框图。
将总任务分解成可以独立表达的子任务,这些子任务再向下分,直到每个子任务足够简单,能够直接而容易的实现为止。
在程序调试时应按各个功能模块分别调试。
在程序设计时,正确合理的设计是非常重要的,比如说,有些执行程序以实时中断方式调用时,如果不正确的设计,有可能陷入无休止的中断申请,使程序无法正常工作。
正确的程序设计包括程序的结构是否合理,一些循环结构和循环指令的使用是否恰当,能否使用较少的循环次数或较快的指令,是否能把某些延迟等待的操作改为中断申请服务,能否把某些计算方法和查表技术适当简化等。
另外程序的设计要具有可扩展性,程序的结构要标准化,便于阅读、修改和扩充。
通过本次课程设计,我更加地了解和掌握单片机的基本知识和基本的编写程序,也更加深入地了解单片机这么课程,掌握汇编语言的设计和调试方法,熟悉DVCC系统的操作及其功能应用,更加熟悉设计的流程及程序的组合、调用和系统的调试。
在程序设计中,要善于调用或参考已有程序并加以修改,得到自己想要的能够实现硬件系统性能,这样可以节省很多时间,比如说,本次设计中的那个额外增加的功能——脉冲计数,就是调用DVCC实验指导书里的程序并做一些修改而实现的。
九.参考文献
[1]苏家.柏荣,志锋,单片机原理及应用技术,等教育出版社,
[2]李群芳,肖看.单片机原理、接口及应用.清华大学出版社.
[3]DVCC系列单片机微机仿真实验系统实验指导书(附录)
9