单片机课程设计报告零件计数器.docx
《单片机课程设计报告零件计数器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告零件计数器.docx(15页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告零件计数器
摘要
本次单片机课程设计我组选择的题目是零件计数器,零件计数器本身在生产实践中具有很实际的用途,选择这个项目可以绕过我们更好的把课堂上学到的课本知识和理论内容与生产实践结合起来,提高对实际问题的动手操作能力以及解决问题的能力,进一步加深学生对于实际的电子元件电路功能的理解与运用,对于设计实际的实用程序来解决一系列生产生活遇到的问题的能力有着显著的家加强与提高。
零件计数器的功能是通过感应器对零件数量进行中断计数,并由数码管动态显示出来,并通过实用的程序将零件数目通过串口传送给PC机,还能够通过实时的检测电路将之与蜂鸣器连接起来,起到整十报警以及零件打包的功能。
基于单片机构成的零件计数器研究的主要内容包括:
AT89C51单片机用何种方式对外部计数脉冲进行计数显示控制、LED显示驱动模块的选择、如何通过串口与PC机完成实时连接。
在这个设计中主要需要解决的问题便是如何提高AT89C51单片机的抗干扰能力以及稳定性。
关键字:
单片机零件计数器LED显示串口连接
目录
第1章系统设计
1.1电路框图··············································3
1.2软件设计方框图及流程图································4
1.3电路功能··············································6
第2章计数器程序
2.1分段程序及功能········································8
2.2问题及解决方案·······································11
第3章实验结果及讨论
3.1实验结果·············································11
3.2结论·················································11
3.3心得体会·············································12
参考文献·················································12
附录·····················································13
第1章系统设计
1.1电路框图
电路总图与功能如图所示,每当来一次外部中断时,内部计数一次,并将数值通过4位共阴数码管动态显示出来。
而单片机的P2口可以选择四根不同的数码管来动态显示,通过视觉暂留达到同时显示的效果。
同时内部程序检测每当计数十次时,会形成一个继电器闭合的零件打包动作,并通过程序使得蜂鸣器发出警报。
1.2软件设计方框图及流程图
由于单片机实验箱的存在,因此硬件部分无需做过多准备,只需根据硬件部分完成软件设计即可,在此,我们使用基于单片机的C语言编程。
C语言是一种高级程序设计语言,其语法简单适用性强,在单片机编程时很方便。
本次设计中使用的C语言编程软件为Keil。
软件设计框图如下:
流程图如下:
否
是
否
是
是
否
编写零件计数程序时应当注意需要事先的几个功能,可以分段编写,最后通过主程序连接。
这段程序的重点便是一段循环中断计数程序,在数值加1的同时要给串口发出同样的信息,每当计数十次时还需要转到零件打包以及蜂鸣器程序中执行。
1.3电路功能
B部分是单片机的最小系统部分,只有这部分电路正常,整个系统才能工作。
单片机为内含8KFLASH程序存储器的STC89C52RC,EA接高电平;各并行口都加了10K的上拉电阻;晶振为11.0592M。
设置了上电复位和手动复位电路。
S1为手动复位按钮。
C部分电路由4位一体的数码管LED1、单个数码管LED2和8个独立发光二极管L1-L7组成。
这3个部分都是共阴结构,并联在一起,连接在P0口上。
LED1用于完成LED动态显示实验,各个位选线为P24-P27,段码由P0口输出;LED2的COM端接地,完成LED静态显示实验;L1-L7,可以方便地读出P0输出的二进制数据,亦可做流水灯实验。
7407在此起驱动作用。
F部分电路是由555和电容组成的单稳电路。
当S_INT0按钮按下后产生一个低电平单稳信号送单片机的INT0,同时D_PLUS1亮一次,作为外部中断请求信号。
I部分电路为蜂鸣器和继电器电路。
蜂鸣器采用9012三极管驱动,其基极接到RD端,当RD端为低电平时,三极管导通,蜂鸣器响。
否则关断。
继电器采用9013三极管驱动,其基极接到WR端,当WRD端为低电平时,三极管关断,继电器不吸合,常闭触点闭合,常开触点打开,D1熄灭;反之则反。
第2章计数器程序
2.1分段程序及功能
*******************开头及引脚对应程序******************
#include
sbitBEEP=P3^7;
sbitJDQ=P3^6;
unsignedintLedcount=0;
unsignedintLedOut[8];
**********************LED数字码表********************
unsignedcharcodeMABIAO[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
************************延时函数***********************
voiddelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
**********************串口发送函数*********************
voidsint()
{
SBUF=Ledcount%10000/1000+0x30;
while(!
TI);
TI=0;
SBUF=Ledcount%1000/100+0x30;
while(!
TI);
TI=0;
SBUF=Ledcount%100/10+0x30;
while(!
TI);
TI=0;
SBUF=Ledcount%10+0x30;
while(!
TI);
TI=0;
SBUF='\n';
while(!
TI);
TI=0;
}
**********************LED显示程序********************
voiddisplay()
{
inti;
LedOut[0]=MABIAO[Ledcount%10000/1000];
LedOut[1]=MABIAO[Ledcount%1000/100];
LedOut[2]=MABIAO[Ledcount%100/10];
LedOut[3]=MABIAO[Ledcount%10];
for(i=0;i<4;i++)
{
P0=LedOut[i];
switch(i)
{
case0:
P2=0xef;
break;
case1:
P2=0xdf;
break;
case2:
P2=0xbf;
break;
case3:
P2=0x7f;
break;
}
delay(100);
}
}
***********************初始化函数**********************
voidinit()
{
EA=1;//允许中断
EX0=1;//允许外部中断0
IT0=1;//下降沿触发
TR1=1;//启动T1定时器
TMOD=0x20;//定时器T1为工作方式2,初值自动重装八位计数器
TL1=0xfd;//预备单元
TH1=0xfd;//计数初值设定,波特率9600
SCON=0x50;//串行口为方式1,10步异位收发(1+8+1)
PCON=0x00;//特殊功能寄存器都为0,波特率不加倍
}
*********************INT0中断函数*********************
voidint0(void)interrupt0
{
Ledcount++;//中断计数
if((Ledcount%10==0)&&(Ledcount!
=0))
{
BEEP=0;
delay(10000);
BEEP=1;
JDQ=~JDQ;
}
if(Ledcount>9999)//超出计数上限后清零
Ledcount=0;
sint();
}
*************************主程序************************
voidmain(void)
{
init();
while
(1)
{
display();
}
}
2.2问题及解决方案
问题1:
运用指数函数计数以及选择四根数码管显示,导致程序运行速度过慢,灯光闪烁。
解决方案:
改进后去掉指数函数,改用每一根数码管分别使用计算出显示数值的方法。
问题2:
计数值达到时蜂鸣器持续响,直到按下第十一次计数按键方才停止。
解决方案:
在蜂鸣器程序中增加BEEP清零和延时语句,可以让蜂鸣器在计数第十次时只响一声,并可改变响的时间。
第3章实验结果及讨论
3.1实验结果
本此课程设计,使用到KeilC51编程器、烧写工具以及串口助手等软件工具。
先是利用Keil软件编写程序,编译无错后再利用烧写工具将其烧写进52单片机中,按下S_INT0按钮,可得到LED动态显示数据的变化,本次设计中用到4个数码管,也就是说,最高显示零件数目可达9999个。
另外,还可以利用串口助手,将零件数目实时传送给PC机,此结果可在串口助手上观察到。
结果是完全符合所需零件计数器的要求的。
至此,可以说本次设计是成功的。
3.2结论
本次课程设计的主要特点是利用C51编程实现基于单片机的零件计数器,而非使用汇编语言。
在编程中,要学会写出各种子程序,然后合理的调用它们,还要根据实际显示结果不断地去修改和完善,使其最终显示出符合要求的结果,这不仅考察了我对于单片这门课的学习掌握情况,还考察了我对C语言的基础知识是否扎实,是否可以将所学的学科融会贯通。
此外,还有其他的特点,设计中用到烧写工具以及串口助手等软件工具,无需考虑硬件设计,只需完成软件设计部分。
本次课程设计完成了基于单片机的零件计数器的设计,让我对于单片机的学习有了更深一层的领悟。
3.3心得体会
经过这段时间的学习,我对单片机原理与运用也有了更深层次的了解,同时也对过去所学的知识进行了温习,对我组设计的课题《零件计数器》所用到的知识也进行了专门的梳理和消化。
这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
通过这次课程设计,我也知道了自己的不足。
书本上的知识是死的,只有通过实践和具体的实例运用,才能真正掌握知识、取得进步。
这次课程设计的经历使我终身受益,我感受到做任何事情都是要真正用心