数字电子计数器课程设计论文.docx
《数字电子计数器课程设计论文.docx》由会员分享,可在线阅读,更多相关《数字电子计数器课程设计论文.docx(20页珍藏版)》请在冰豆网上搜索。
![数字电子计数器课程设计论文.docx](https://file1.bdocx.com/fileroot1/2023-8/5/0a322676-12a1-47d5-bf3f-524d626a1633/0a322676-12a1-47d5-bf3f-524d626a16331.gif)
数字电子计数器课程设计论文
绪论
随着计数器技术的不断发展与进步,计数器的种类越来越多,应用的围越来越广,随之而来的竞争也越来越激烈。
过硬的技术也成为众多生产厂商竞争的焦点之一。
厂商为了在竞争中处于不败之地,从而不断地改进技术,增加产品的种类。
现计数器的种类以增加到:
电磁计数器、电子计数器、机械计数器(拉动机械计数器、转动机械计数器、按动机械计数器、测长机械计数器)、液晶计数器等。
计数器的应用围也遍布各个行业。
从单片机发展历程可以看出,单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发展为先导,以广泛的应用领域拉动,表现出较微处理器更具个性的发展趋势。
单片机的应用在后PC时代得到了前所未有的发展,但对处理器的综合性能要求也越来越高。
综观单片机的发展,以应用需求为目标,市场越来越细化,充分突出以“单片”解决问题,而不像多年前以MCS51/96等处理器为中心,外扩各种接口构成各种应用系统。
单片机系统作为嵌入式系统的一部分,主要集中在中、低端应用领域(嵌入式高端应用主要由DSP、ARM、MIPS等高性能处理器构成),在这些应用中,目前也出现了一些新的需求,主要体现在以下几个方面:
(1)以电池供电的应用越来越多,而且由于产品体积的限制,很多是用钮扣电池供电,要求系统功耗尽可能低,如手持式仪表、水表、玩具等。
(2)随着应用的复杂,对处理器的功能和性能要求不断提高。
既要外设丰富、功能灵活,又要有一定的运算能力,能做一些实时算法,而不仅仅做一些简单的控制。
(3)产品更新速度快,开发时间短,希望开发工具简单、廉价、功能完善。
特别是仿真工具要有延续性,能适应多种MCU,以免重复投资,增加开发费用。
(4)产品性能稳定,可靠性高,既能加密保护,又能方便升级。
一.《微机原理与接口技术》课程设计任务书
(二)
题目:
电子计数器
1.1.课程设计任务
本课题要求应用以51单片机为核心设计电子计数器,能设置起始数值,通过加、减键实现计数功能,设计复位按钮。
数字通过数码管显示,计数结束发出警报。
1.2.课程设计目的
通过本次课程设计使学生掌握:
1)掌握以单片机为核心的控制系统的分析和设计的基本方法;2)控制程序的设计及实现方法;3)提高学生对单片机实时控制系统的设计和调试能力。
1.3.课程设计要求
开机后,设置计数器的初始值,通过加、减键实现向下,或向上计数,通过数码管显示结果,计数结束发出警(可播放一段音乐),暂停按钮,按下暂停按钮,停止计数,再按下暂停按钮,开始计数。
并设置有复位按钮,回到初始状态
1.4.课程设计容
1、计数程序;显示程序;
2、按键,中断程序;
3、硬件电路原理图、软件清单。
1.5.课程设计报告要求
报告中提供如下容:
1、目录
2、正文
(1)课程设计任务书;
(2)总体设计方案
(3)电子计数器部分,要有操作使用说明,以便用户能够正确使用本产品;
(4)硬件原理图,以便厂家生成产(可手画也可用protel软件);
(5)程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序的名称及其功能);
(6)调试、运行及其结果;
3、收获、体会
4、参考文献
二.设计方案:
本设计为累加计数的专用计数器,应用AT89C51芯片作为核心,8位的LED数管显示。
这种实现方法的优点是电路简单,性能可靠,实时性强,操作简单,编程容易。
图1.原理框图
本设计的电子计数器的重要功能为:
1.通过up和down按键设定计数预置值。
2.通过stop键开始进入计数。
3.按下计数按键开始逐次累加计数。
4.累加至预定值报警播放一段音乐。
5.音乐结束后按两次stop键可以继续计数。
6.按rset键复位,重新开始循环。
三.Protues仿真图及相应部分工作原理:
3.1总的仿真图
图1总体仿真图
本设计主要由最小单片机系统、按键部分、显示部分、和计数报警部分组成。
主要用了六个按键、一个电阻排、两个数码管、一个报警器。
首先对计数器进行设定初值:
数码管显示初值设定为00,但并不是计数的值。
所以要预设定一个计数值。
按下up键,显示器上能够逐次加1,按下down键,显示器上能够逐次减1,以此来给出一个计数预置值。
再按下stop键一次,up键和down键停止工作。
进入计数环节。
通过按下计数键进行计数,计数过程中可以暂停计数,通过按下stop键即可暂停。
同样再按一下stop键则可以继续进行计数。
直到计数到达预设定的初值后报警器工作,播放一段音乐。
然后stop键需要按两次才能再进行计数。
因为播放音乐子函数是一个时间段的函数。
所以不能够在音乐播放的过程中给它任何指令,只有等音乐结束后按下stop键计数器恢复计数。
或者按下复位键,重新开始设定计数值开始下一轮计数;
3.2显示部分
图2数码管显示
显示部分:
显示部分由两个数码管一个电阻排组成。
通过P0口P1口连接数码管。
其中P0口要外接上拉电阻,这里用一个电阻排代替八个电阻。
数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
数码管的驱动方式主要由静态和动态两种。
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
本次用的就是静态显示!
3.3按键部分
图3按键部分
按键部分:
按键部分连接的是地端和P1口,由四个按键组成。
Up键和down键设定计数初值。
Stop键进入中断,rset键复位。
分别接P1.0P1.3P1.6P1.7口。
首先对计数器进行设定初值:
数码管显示初值设定为00,但并不是计数的值。
所以要预设定一个计数值。
按下up键,显示器上能够逐次加1,按下down键,显示器上能够逐次减1,在按下stop键一次,可以按下计数键进行计数。
计数到达预设定的初值后报警器工作,播放一段音乐。
此时计数器不能继续工作,等到音乐结束后按下stop键计数器恢复计数,按下复位键,重新开始设定计数值开始下一轮计数;
3.4计数报警部分
图4计数报警部分
计数报警部分:
计数报警部分由报警器和计数按键组成。
分别接P3.7和P3.2口。
计数次数达到后报警器开始工作播放一段音乐。
当计数到达预设定的初值后报警器工作,播放一段音乐。
此时计数器不能继续工作,等到音乐结束后按下stop键计数器恢复计数,按下复位键,重新开始设定计数值开始下一轮计数;
四.程序清单及流程图
4.1.电子器件清单
设计的电子计数器所需的元器件的代号为
1、单片机代号为:
AT89C51
2、电容C1、C2的代号为:
CERAMIC22P
3、电容C3的代号为:
MINELECT10U16V
4、晶振X1的代号为:
CRYSTAL
5、电阻R1、R2的代号分别为:
CHIPRES10K、CHIPRES100R
6、上拉电阻RP1的代号为:
RESPACK-8
7、显示器的代号为:
7SEG-MP*1-CC
8、开关六个的代号为BUTTON
4.2.程序流程图
Y
N
图4流程图
工作流程:
首先对计数器进行设定初值:
数码管显示初值设定为00,但并不是计数的值。
所以要预设定一个计数值。
按下up键,显示器上能够逐次加1,按下down键,显示器上能够逐次减1,在按下stop键一次,可以按下beep键进行计数。
计数到达预设定的初值后报警器工作,播放一段音乐。
此时计数器不能继续工作,等到音乐结束后按下stop键计数器恢复计数,按下复位键,重新开始设定计数值开始下一轮计数;
五.调试、运行及其结果
刚开始程序设计中基本上是完好的,程序可以实现设定预置值的加减计数。
然后通过数码管显示预置值。
程序在执行的过程中按下stop键开始允许计数。
通过右边的计数键开始重新计数显示,依然用的刚刚的数码管。
一切功能都进行的很顺利,但是等到一遍程序执行完的时候,按下复位键,数码管归零。
本以为一切都正常的时候重新试了下计数。
发现不能动,没有恢复到初始状态。
最后思考了一下,在rset程序里面加了一个子函数init。
调试了一下果然可以了。
刚开始只设计了报警,也就是简单的让报警器恒等于一。
但是看了任务书,觉得给它加上一段音乐,感觉这个想法不错。
虽说满足了老师的基本要求,但是总觉得可以做的更好,所以我在此基础上给它加了一段音乐,但是乐谱自己真的是没有编过,于是就在网上XX了乐谱,然后结合自己的程序整合了一下,最终选了一个简单的生日歌添加进自己的程序。
只要计数数值达到设定的值就开始播放一段音乐,比起刺耳的报警声和谐了不少!
图5.程序调试运行成功图
六.课程设计的心得体会
这次单片机课程设计进行了两周的时间,学校安排在学期末带给了我们很多的怨言。
人家都考完试回家了,我们却还得呆在这进行两周的实训。
没办法咬咬牙坚持就是胜利。
还好带我们实训的老师在开学的时候就给了我们实训的题目,于是我们早就开始提前在做,这也生了我们好多接下来的时间。
虽说每个人都是抱着不情愿的态度留在这里实训,但是事情存在就是合理的。
一切事物有利就有弊,有弊就有利。
时间虽短,但是可以让我们能高效的完成实训。
即此课程设计。
这次我分到的题目是电子计数器,相对其它的几个课题我这算是最简单的在我看来。
当然拿到题目首先要做的就是看看任务书里面的要求,然后去找资料。
其实大家都懂,首先在XX上面找一些类似的设计。
果然很巧找到了一个相似度很高的题目。
果断下载下来进行参考。
然后图书馆借了一些书籍,再结合以前的教科书。
准备资料工作就算完成了。
在平时的上课学习中,我们对于书上所讲的感觉很抽象。
在做课程设计时我们从最简单的实物开始做起,在制作过程中,我们首先是实验设计,设计电路图,然后画出电路流程图,设计电子计数器运行程序,同时我们还花费了一些时间寻找课程设计的方法以及一些有关材料,并小组讨论设计。
最终,我们在各个方面实现了对各个部分的电路设计。
在设计过程中,我们遇到了很多的问题,但最终在我们小组的共同努力以及老师和同学的帮助下,把问题都解决了。
设计过程中遇到了点问题,虽说不是什么难懂的问题,但是有的时候每个人都会被很简单的问题困扰。
所谓当局者迷,旁观者清,就是这样吧。
过程中遇到的问题都自己调试解决了。
满足任务书的要求,还添加了额外的亮点!
这次单片机课程设计让我学到了很多东西,利用了一些本学期学到的东西,比如说按键消抖等。
收益良多,感觉还是有点成就感的。
对于同学请教的问题,我也能一一作答。
七.参考文献
[1]毅刚喜元宇编:
《单片机原理及应用》第二版高等教育2010
[2]路而红主编:
《电子设计自动化应用技术——FPGA应用篇》高等教育2009
[3]元良王建军等著:
《单片机开发技术实例教程》机械工业2010
[4]皮大能南光群编著:
《单片机课程设计指导书》理工大学2010
[5]胡亚琦主编:
《单片机原理及应用系统设计》电子科技大学2010
[6]毅刚主编《单片机原理及接口技术》人民邮电出版2011
附录
1.主程序代码:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitup=P1^0;
sbitdown=P1^3;
sbitstop=P1^6;
sbitreset=P1^7;
sbitbeep=P3^7;
uintgw,sw,gww,sww,temp;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};//生日快乐歌的音符频率表,不同频率由不同的延时来决定
ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,
12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//生日快乐歌节拍表,节拍决定每个音符的演奏长短
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidPlayMusic()
{
uinti=0,j,k;
while(SONG_LONG[i]!
=0||SONG_TONE[i]!
=0)
{
for(j=0;j{
Beep=~beep;
//SONG_TONE延时表决定了每个音符的频率
For(k=0;k}
Delay(10);
i++;
}
}
voidinit()
{
gw=0;
gww=0;
sw=0;
sww=0;
temp=0;
P0=0;
P2=0xff;
P3=0xff;
beep=0;
P0=table[sw];
P2=table[gw];
IT0=1;
EX0=1;
}
voidkeyscan()
{
if(temp==0)
{
if(up==0)
{
delay(5);
if(up==0)
{
while(!
up);
if(gw==9)
{
gw=0;
P2=table[gw];
if(sw==9)
{
sw=0;
P0=table[sw];
}
else
{
sw++;
P0=table[sw];
}
}
else
{
gw++;
P2=table[gw];
}
}
}
if(down==0)
{
delay(5);
if(down==0)
{
while(!
down);
if(gw==0)
{
gw=9;
P2=table[gw];
if(sw==0)
{
sw=9;
P0=table[sw];
}
else
{
sw--;
P0=table[sw];
}
}
else
{
gw--;
P2=table[gw];
}
}
}
}
if(stop==0)
{
delay(5);
if(stop==0)
{
while(!
stop);
if((gw!
=0)||(sw!
=0))
{
temp++;
if(temp==1)
EA=1;
if(temp==2)
EA=0;
if(temp==3)
{
temp=1;
EA=1;
}
}
}
}
if(reset==0)
{
delay(5);
if(reset==0)
{
while(!
reset);
if((gw!
=0)||(sw!
=0))
{
gw=0;
sw=0;
P2=table[gw];
P0=table[sw];
beep=0;
init();
EA=1;
}
}
}
}
voidmain()
{
init();
while
(1)
{
keyscan();
}
}
voidINT()interrupt0
{
if(gww==9)
{
gww=0;
P2=table[gww];
sww++;
P0=table[sww];
}
else
{
gww++;
P2=table[gww];
P0=table[sww];
}
beep=0;
if((gww==gw)&&(sww==sw))
{EA=0;
PlayMusic();
}
}