基于51单片机的零件计数器设计.docx

上传人:b****7 文档编号:23379293 上传时间:2023-05-16 格式:DOCX 页数:15 大小:819.46KB
下载 相关 举报
基于51单片机的零件计数器设计.docx_第1页
第1页 / 共15页
基于51单片机的零件计数器设计.docx_第2页
第2页 / 共15页
基于51单片机的零件计数器设计.docx_第3页
第3页 / 共15页
基于51单片机的零件计数器设计.docx_第4页
第4页 / 共15页
基于51单片机的零件计数器设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于51单片机的零件计数器设计.docx

《基于51单片机的零件计数器设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的零件计数器设计.docx(15页珍藏版)》请在冰豆网上搜索。

基于51单片机的零件计数器设计.docx

基于51单片机的零件计数器设计

单片机课程设计报告

 

题目零件计数器

专业通信工程

学号

姓名

指导教师玉宏

学校河海大学校区

 

摘要:

零件计数器生产实践中具有很实际的用途,我们所设计的零件计数器的功能是把接在INT0上的单稳信号当作零件信号,每来一个零件,单片机计数一次,当计满10次时,蜂鸣器发出一声警告音,并使继电器闭合一次,产生零件打包动作,要求LED上显示当前一共生产了多少零件,并能通过串口将零件数目发送给PC机。

选择这个项目可以帮助我们更加了解中断、定时器及串口是如何工作的,提高对实际问题的动手操作能力以及解决问题的能力。

本课程采用C51编写程序,通过Keil C编写为机器代码,烧写入单片机中,在实验箱上进行操作,完成单片机这种实用工具的整体的学习。

 

 

关键字:

单片机零件计数器LED显示串口通信

 

一、系统设计

1.1主要组件及电路框图···································4

1.2软件设计方框图及流程图·······························5

1.3电路功能··············································7

二、实验过程及结果

2.1程序设计·············································9

2.2调试过程·············································13

2.3问题及解决···········································13

2.4调试结果············································13

三、结论

3.1课程设计特点及贡献·································14

3.2改善建议···········································14

3.3心得体会···········································14

 

参考文献·················································15

附录·····················································16

 

一、系统设计

1.1主要组件及电路框图

本课程设计使用的实验箱主要由单片机最小系统,LED数码管显示部分,外部中断控制部分,独立式与行列式键盘按键输入部分,串行口通信部分,蜂鸣器与继电器等部分组成。

 

电路总图与功能如图所示,每当来一次外部中断时,部计数一次,并将数值通过4位共阴数码管动态显示出来。

而单片机的P2口可以选择四根不同的数码管来动态显示,通过视觉暂留达到同时显示的效果。

同时部程序检测每当计数十次时,会形成一个继电器闭合的零件打包动作,并通过程序使得蜂鸣器发出警报。

 

1.2软件设计框图及流程图

零件计数器系统由多个函数构成,其中包括主函数,初始化函数,延时函数,串口发送函数,蜂鸣器函数,继电器函数等。

 

单片机零件计数器软件系统各个函数框图

 

流程图:

 

 

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在此起驱动作用。

I部分电路为蜂鸣器和继电器电路。

蜂鸣器采用9012三极管驱动,其基极接到RD端,当RD端为低电平时,三极管导通,蜂鸣器响。

否则关断。

继电器采用9013三极管驱动,其基极接到WR端,当WRD端为低电平时,三极管关断,继电器不吸合,常闭触点闭合,常开触点打开,D1熄灭;反之则反。

 

二、实验过程与结果

2.1程序设计

#include

#defineuintunsignedint

#defineucharunsignedchar

/*******LED的字模,共阴数码管0-9*************/

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

uintcount1=0;//定义计数变量

uintcount2=0;

uintLeout[4];

sbitBeep=P3^7;//定义蜂鸣器对应单片机引脚

sbitRELAY=P3^6;//定义继电器对应单片机引脚

/*******延时函数*************/

voiddelay(uintz)

{

uinti、j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

/*******数码管动态显示函数*************/

voiddisplay()

{

uchari;

LedOut[3]=table[count2%10000/1000];

LedOut[2]=table[count2%1000/100];

LedOut[1]=tablecount2%100/10];

LedOut[0]=table[count2%10];

for(i=0;i<4;i++)

{

P0=LedOut[i];

switch(i)

{

case0:

P2=0x7f;break;

case1:

P2=0xbf;break;

case2:

P2=0xdf;break;

case3:

P2=0xef;break;

}

delay(5);

}

}

/*******蜂鸣器函数*************/

voidbeep()

{

Beep=0;

delay(100);

Beep=1;

}

/*******继电器函数*************/

voidrelay()

{

RELAY=~RELAY;

}

/*******串口发送函数*************/

voidsend()

{

ucharLedOut1[4];

LedOut1[3]=count2%10000/1000+0x30;

LedOut1[2]=count2%1000/100+0x30;

LedOut1[1]=count2%100/10+0x30;

LedOut1[0]=count2%10+0x30;

SBUF=LedOut1[3];

while(!

TI);

TI=0;

SBUF=LedOut1[2];

while(!

TI);

TI=0;

SBUF=LedOut1[1];

while(!

TI);

TI=0;

SBUF=LedOut1[0];

while(!

TI);

TI=0;

SBUF='\n';

while(!

TI);

TI=0;

}

/*******外部中断0函数*************/

voidcounter()interrupt0

{

EX0=0;

count1++;//中断计数

count2++;

send();

EX0=1;

}

/*******串口初始化函数*************/

voidinitUart(void)

{

TMOD|=0x20;

SCON=0x50;

PCON&=0x7f;

TH1=0xfd;

TL1=0xfd;

TR1=1;

}

/*******主函数*************/

voidmain()

{

initUart();

IT0=1;//下降沿触发

EA=1;//开外部中断

EX0=1;

while

(1)

{

display();

if(count1==10)

{

count1=0;

beep();

relay();

}

}

}

 

2.2调试过程

由于单片机实验箱的存在,因此硬件部分无需做过多准备,主要是进行软件程序方面的调试。

程序的调试我们是分一个一个模块进行的,具体的顺序是先进行数码管动态显示模块的调试,然后是蜂鸣器和继电器的调试,最后是串口通信的调试。

这样调试的好处是,当某一个功能没有实现时,我们可以知道是哪一段程序出了问题,可以迅速地对其修改,直到每个模块都能正确而准确地完成各自的功能为止。

等到所有的模块调试完毕,就能实现零件计数器的功能。

这样与整体调试相比,等到出现问题,再一个个地去找是哪一段程序发生了错误,大大地提高了工作效率,节省了时间。

2.3问题与解决

问题一:

蜂鸣器的声音太小,几乎无法听到。

解决方案:

改变蜂鸣器的延时时间,直到合适为止。

问题二:

数码管动态显示的调试时,显示的数字闪的比较厉害。

经过多次调试,最终取得了比较好的显示效果。

解决方案:

是因为数码管显示延迟的时间太短,改变延时的时间,直到调试成功。

问题三:

进行的串口调试时,PC机但发现收到的数据是乱码,不是发送的数据。

解决方案:

把发送的数据由十六进制显示改为字符显示,在程序中也有所调整后,发现PC机收到的数据即是当前的计数数据。

2.4调试结果

经过反复调试,最终解决了遇到的问题,较好地实现了零件计数器的功能:

1、每来一个零件,单片机计数一次,LED上显示当前一共生产了多少零件;2、当计满10次时,蜂鸣器发出一声警告音,并使继电器闭合一次,产生零件打包动作;3、可以通过串口在PC上显示零件个数。

 

三、结论

3.1本课程设计的主要特点及贡献

本次课程设计的主要特点是利用C51编程实现基于单片机的零件计数器,而非使用汇编语言。

在编程中,要学会写出各种子程序,然后合理的调用它们,还要根据实际显示结果不断地去修改和完善,使其最终显示出符合要求的结果。

设计中用到烧写工具以及串口助手等软件工具,无需考虑硬件设计,只需完成软件设计部分。

本次课程设计完成了基于单片机的零件计数器的设计,不仅考察了我对于单片这门课的学习掌握情况,还考察了我对C语言的基础知识是否扎实,让我们学会将各学科的知识融会贯通。

3.2改善建议

本课程设计中还有一些需要改善的方面:

一、当零件计满10个时,继电器闭合一次,产生零件打包动作,却不能够显示打包的次数,可以设计一段可以显示打包次数的程序。

二、可以通过一些记忆芯片,实现当前计数结果的保存,一共查询及对数据的相关处理。

3.3心得体会

通过这学期对单片机这门课程的学习,我对单片机的原理和运用有了一定的了解。

但是当自己动手去设计零件计数器时,还是遇到了很多的问题。

程序出现了许多错误,使得调试时无法成功。

我们选择的零件计数器考功能是当来一次外部中断时,部计数一次,并将数值通过4位共阴数码管动态显示出来。

而单片机的P2口可以选择四根不同的数码管来动态显示,通过视觉暂留达到同时显示的效果。

同时部程序检测每当计数十次时,会形成一个继电器闭合的零件打包动作,并通过程序使得蜂鸣器发出警报。

考查的主要是中断、定时器、串口通信部分的容。

考试后对单片机的许多容都有了一点生疏,经过这段时间的学习,我对过去所学的知识进行了温习,对我的课题零件计数器所用到的知识也进行了专门的梳理和消化。

这次课程设计使我对单片机的C语言编程有了更深刻的认识和更扎实的掌握,通过不断修改,不断尝试,我对源代码各个模块的函数都有了一个非常深入的掌握。

我懂得了从书本上学到的知识是什么有限的,只有自己真正地动手去做,才能知道自己还有许许多多的不足,对这门课程的掌握还是远远不够。

书本上的知识是死的,只有通过实践和具体的实例运用,才能真正掌握知识、取得进步。

在自己实际操作时,发现错误并且解决错误的这样一个过程时十分重要的,这也是能够最快提高我们对专业知识的掌握的方法。

我们都知道理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

通过这次课程设计,我了解到各学科之间的知识是融会贯通的,所以打好基础十分重要,我也知道了自己的不足。

这次动手操作的机会对我来说十分重要,我感觉我又了解了许多我以前不知道的东西。

今后我也会更加注意动手能力的培养,再实践中巩固自己的理专业知识。

 

参考文献

[1]友德,志英.单片微型机原理、应用与实验第五版.复旦大学出版社

[2]玉宏.单片机实验和课程设计任务书

[3]丁海军、何坤金、王林等编著,程序设计基础(C语言).北京航空航天大学出版社

 

附录

一、烧写程序

二、串口调试

 

三、零件计数器效果图

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1