基于51单片机的零件计数器设计1文档格式.docx
- 文档编号:13492119
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:17
- 大小:858.73KB
基于51单片机的零件计数器设计1文档格式.docx
《基于51单片机的零件计数器设计1文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的零件计数器设计1文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
4
1.2软件设计方框图及流程图·
5
1.3电路功能·
7
二、实验过程及结果
2.1程序设计·
9
2.2调试过程·
13
2.3问题及解决·
2.4调试结果·
3、结论
3.1课程设计特点及贡献·
14
3.2改善建议·
3.3心得体会·
参考文献·
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、实验过程与结果
2.1程序设计
#include<
reg52.h>
#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>
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;
case2:
P2=0xdf;
case3:
P2=0xef;
}
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];
SBUF=LedOut1[1];
SBUF=LedOut1[0];
SBUF='
\n'
;
/*******外部中断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;
//开外部中断
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改善建议
本课程设计中还有一些需要改善的方面:
1、当零件计满10个时,继电器闭合一次,产生零件打包动作,却不能够显示打包的次数,可以设计一段可以显示打包次数的程序。
2、可以通过一些记忆芯片,实现当前计数结果的保存,一共查询及对数据的相关处理。
3.3心得体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 零件 计数器 设计