单片机课设零件计数器讲解Word文档格式.docx
《单片机课设零件计数器讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课设零件计数器讲解Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
1电路框图·
4
2流程框图·
5
3分段原理·
4电路功能·
6
1)蜂鸣器及继电器原理·
6
2)数码管显示原理·
7
三.计数器主程序
1分段程序及功能·
8
2问题及解决方案·
14
四.结论
1实验结果·
15
2本次课设的贡献·
2改善建议·
16
3心得体会·
五.附录
1软件介绍·
17
2参考文献·
18
一、设计内容
设计内容:
把接在INT0上的单稳信号当作零件信号,单片机计数一次,当计满十次时,蜂鸣器发出一声警告音,并使继电器闭合一次,产生零件打包动作。
要求和提高要求主要掌握外部中断和动态显示的应用,提高实时通过串口把零件数量发送给PC。
二、设计方案
1.电路框图
电路总图与功能如图所示,每当来一次外部中断时,内部计数一次,并将数值通过4位共阴数码管动态显示出来。
而单片机的P2口可以选择四根不同的数码管来动态显示,通过视觉暂留达到同时显示的效果。
同时内部程序检测每当计数十次时,会形成一个继电器闭合的零件打包动作,并通过程序使得蜂鸣器发出警报。
2.流程框图
否
是
编写零件计数程序时应当注意需要事先的几个功能,可以分段编写,最后通过主程序连接。
这段程序的重点便是一段循环中断计数程序,在数值加1的同时要给串口发出同样的信息,每当计数十次时还需要转到零件打包以及蜂鸣器程序中执行。
3.分段原理
主程序:
主程序为中断初值设定程序,包括中断计数超出时的清零程序,中断以及时钟的设定,计数初值的计算以及波特率的计算,还有子程序的调用。
延时子程序:
包括两种不同的延时程序,分别是计数时需要的短延时以及蜂鸣器等需要的较长时间延迟。
数码管显示子程序:
包括P2口的数码管选择设定以及计数数值对应的数码管显示数值的设定,通过独特的计算方法将计数总值与四根不同的数码管显示一一对应起来。
外部中断0与串口数据发送子程序:
每来一次中断计数值加1,同时向串口发送一次此时的数值。
串口中断子程序:
串口数据发送的开始和停止程序。
4.电路功能
1)蜂鸣器及继电器原理
⏹蜂鸣器采用9012三极管驱动,其基极连接到RD端,当RD端为低电平时,三极管导通,蜂鸣器响,否则关断。
⏹继电器采用9013三极管驱动,其基极连接到WR端,当WRD端为低电平时,三极管关断,继电器不吸合,常闭触点闭合,常开触点打开,D1熄灭;
反之则反。
2)数码管显示原理
⏹4个并联7段共阴数码管,用于动态显示。
动态显示部分电路由4位一体的数码管LED1、单个数码管LED2和8个独立发光二极管L1-L7组成。
这3个部分都是共阴结构,并联在一起,连接在P0口上。
LED1用于完成LED动态显示实验,各个位选线为P24-P27,段码由P0口输出;
LED2的COM端接地,完成LED静态显示实验;
L1-L7,可以方便地读出P0输出的二进制数据,亦可做流水灯实验。
7407在此起驱动作用。
三、计数器主程序
1.分段程序及功能
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitP32=P3^2;
sbitP37=P3^7;
sbitP36=P3^6;
sbitP24=P2^4;
sbitP25=P2^5;
sbitP26=P2^6;
sbitP27=P2^7;
ucharcount;
uchartable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴极数码管表
voidbeep();
voidrelay();
voiddelay(ucharx);
voiddisplay(uchara,ucharb,ucharc,uchard);
voidsendchar(uchardat1);
voidmain()
{
intge,shi,bai,qian;
EA=1;
//开总中断
EX0=1;
//允许外部中断0
IT0=1;
//负跳变沿中断方式
SCON=0x50;
//串口工作在方式1,允许接收
PCON=0x00;
//波特率不加倍
TMOD=0x20;
//定时器1工作在方式2
TH1=0xfd;
//赋初始值
TL1=0xfd;
TR1=1;
while
(1)
{
qian=count/1000;
bai=count%1000/100;
shi=count%100/10;
ge=count%10;
display(ge,shi,bai,qian);
}
voiddelay(ucharx)
uchari,j;
for(i=0;
i<
100;
i++)
for(j=0;
j<
x;
j++);
}
//延时时间的计算:
先将程序转变为汇编语言,通过每一条汇编语言所占据的机器周期时间的总和,便可以算出延时所花费的时间。
//蜂鸣器程序
voidbeep()
P37=0;
delay(300);
P37=1;
//继电器程序
voidrelay()
P36=1;
P36=0;
voiddisplay(uchara,ucharb,ucharc,uchard)//四段数码管显示
P0=table[a];
P27=0;
delay(8);
P27=1;
P0=table[b];
P26=0;
P26=1;
P0=table[c];
P25=0;
P25=1;
P0=table[d];
P24=0;
P24=1;
//将得到的数据对照共阴极数码管表显示
voidzhongduan()interrupt0
if(P32==0)
{
delay(10);
//延时消除抖动
if(P32==0)//确认有按键按下
count++;
sendchar(count);
if(count%10==0&
count!
=0)
beep();
relay();
}
while(!
P32);
//等待KEY1松开
voidsendchar(uchardat1)//串口发送数据程序
SBUF=dat1;
while(!
TI);
//等待串行口发送完毕
TI=0;
//清除串行口发送结束标志
}
//产生计数信号、计数标志、并将计数值实时发给PC
串行口发送时,第一位是0,结束位是1
2.问题及解决方案
1)遇到的问题:
运用指数函数计数以及选择四根数码管显示,导致程序运行速度过慢,灯光闪烁。
改进方法:
改进后去掉指数函数,改用每一根数码管分别使用计算出显示数值的方法。
2)遇到的问题:
计数值达到时蜂鸣器持续响,直到按下第十一次计数按键方才停止。
解决方法:
在蜂鸣器程序中增加清零语句,中断中增加置位语句,可以让蜂鸣器在计数第十次时只响一声。
四、结论
1.实验结果
按键脉冲源0,则四位数码管显示数字+1,当到10的倍数时,蜂鸣器发出声音,继电器产生打包动作。
通过串口调试助手在PC机上可实时显示数码管数据。
2.本次课设的贡献
本次课设中参与了程序的编写、改进,在keil软件中运行无误后,烧写程序到单片机实验箱进行调试,通过串口调试助手显示计数值,以实现实验的要求。
3.改善建议
实验中INT0中断信号计数到10次时,本次实现的功能在PC端不能显示打包指令,只能通过硬件继电器闭合,虚拟计一次打包。
更好是在串口调试助手中能够显示打包次数,以方便计数。
同时,在初始化计数初值时,串口调试程序不能发送一个数目显示到数码管中,以适应实际计数过程中计数中断和电源无法工作的情况。
4.心得体会
通过本次的单片机课程设计,我深刻体会和理解了如何将所学的单片机理论知识和实际生产生活需要结合起来,进行实践运用的方法,极大的锻炼了我的实际动手和根据实际需要设计程序的能力。
通过设计零件计数器,我加深了对于课堂上所学知识的掌握和理解,对于串口通信以及中断程序的掌握更上一个台阶,中间的实践动手过程中通过对遇到的实际问题的思考和解决,极大的提升了我个人的实践水平以及综合素质。
五、附录
1.软件介绍
烧写程序:
⏹打开STC-ISP,如下图界面,在MCUType栏目下选中单片机,如STC89C51。
⏹根据您的9针数据线连接情况选中COM端口,波特率一般保持默认,如果遇到下载问题,可以适当下调一些,按图示选中各项。
⏹先确认硬件连接正确,按如图点击“打开文件”并在对话框内找到您要下载的HEX文件
⏹按下图选中两个条件项,这样可以使您在每次编译KEIL时HEX代码能自动加载到STC-ISP,点击“Download/下载” 。
⏹手动按下电源开关便即可把可执行文件HEX写入到单片机内,如图是正在写入程序截图。
⏹图示等待上电复位,待程序写入完毕后,目标板开始运行程序结果。
串口调试:
1)设置串口参数:
串口号:
COM7
波特率:
9600
2)接收数据:
点击打开/关闭串口区中的打开串口按钮,勾选HEX发送和显示。
2.参考文献
1.《AVR单片机应用设计》
作者:
丁化成耿德根李君凯
出版社:
北京航空航天大学出版社
2.《单片机原理与应用设计》
书籍作者:
张毅刚,彭喜元 编著
图书出版社:
电子工业出版社
3.《C51单片机技术教程》
田希晖,薛亮儒
人民邮电出版社,2007