0059秒倒计时论文Word格式.docx
《0059秒倒计时论文Word格式.docx》由会员分享,可在线阅读,更多相关《0059秒倒计时论文Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
KeilC;
CrystalOscillactor
1设计要求和目的
1.1设计要求
本设计要求采用单片机技术设计倒计时系统,实现
(1)独立按键设置倒计时时间(00~59秒)
(2)按键设置开始、暂停等功能
(3)共阴数码管显示(可以动态显示或静态)
1.2设计目的
本设计的目的是为提高自己的实际动手能力以及对单片机原理和相关知识有更为深刻的理解。
2方案设计和选择
根据本次设计的要求,方案的选择应力求实用性强,性价比高,使用简单,定位为入门级的产品。
一、原理设计
1.AT89C51芯片
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
图1AT89C51单片机的内部结构
1.1管脚说明:
图2AT89C51管脚图
(1)VCC:
供电电压。
(2)GND:
接地。
(3)P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
(4)P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
(5)P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
(6)P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
(7)RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
(8)ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
(9)/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
(10)/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
(11)XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
(12)XTAL2:
来自反向振荡器的输出。
2.系统总体方案的设计
2.1硬件电路的设计
本设计分为硬件设计和软件设计,这两者相互结合,不可分离;
从时间上看,硬件设计的绝大部分工作量是在最初阶段,到后期往往还要做一些修改。
只要技术准备充分,硬件设计的大返工时比较少的,软件设计的任务贯彻始终,到中后期基本上都是软件设计任务,随着集成电路技术的飞速发展,各种功能很强的芯片不断出现,是硬件电路的集成度越来越高,硬件设计的工作量在整个项目中所占的比重逐渐下降。
为使应硬件电路设计尽可能合理,应注意以下几个方面:
(1)尽可能采用功能强的芯片,以简化电路,功能强的芯片可以代替若干普通芯片,随着生产工艺的提高,新型芯片的价格不断下降,并不一定比若干普通芯片的价格总和高。
(2)留有设计余地。
在设计硬件电路时,要考虑到将来修改扩展的方便。
因为很少有一锤定音的电路设计,如果现在不留余地,将来可能要为一点小小修改或扩展而被迫进行全面返工。
(3)程序空间,选用片内程序空间足够大的单片机,本设计采用AT89C51单片机。
(4)RAM空间,AT89C51内部RAM不多,当要增强软件数据处理功能时,往往觉得不足。
如果系统配置了外部RAM,则建议多留一些空间。
随着软件设计水平的提高,往往只要改变或增加软件中的数据处理算法,就可以是系统功能提高很多,而系统的硬件不必做任何更换就使系统升级换代。
只要在硬件电路设计初期考虑到这一点,就应该为系统将来升级足够的RAM空间,哪怕多设计一个RAM得插座,暂不插芯片也好。
(5)I/O端口;
在样机研制出来进行现场使用时,往往会发现一些被忽视的问题,而这些问题不是靠单纯的软件措施来解决的。
如有些新的信号需要采集,就必须增加输入检测端:
有些物理量需要控制,就必须增加输出端。
如果在硬件电路设计就预留出一些I/O端口,虽然当时空着没用,但是需要用的时候就派上用场了。
2.2时钟频率电路的设计
单片机必须在时钟的驱动下才能工作。
在单片机内部有一个时钟振荡电路,只要外界一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
时钟电路如下图:
图3外部震荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1、C2的作用有两个:
一是帮助振荡器起振;
二是对振荡器的频率进行微调。
C1、C2的典型值为30pf。
单片机在工作时,有内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数,f表示。
图中的时钟频率为12MHz,即f=12MHz,则时钟周期为1/12us。
2.3暂停电路和复位电路的设计
单片机的第九脚RES为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如下图:
图4复位电路和暂停电路
图中由按键K1以及电阻R1构成了复位电路。
由于单片机是低电平复位,所以当按下K1时,单片机的9脚RESET管脚处于低电平,此时单片机处于复位状态。
值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到的倒计时时间的记忆功能。
2.4显示电路的设计
显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。
在这里我们使用的是七段数码管显示,通常在显示上我们采用的方法一般包括两种:
一种是静态显示,另一种是动态显示。
其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多;
动态显示的特点是显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。
在本设计中根据实际情况采用的是动态显示方法。
七段数码管显示电路如下图:
图5共阴极数码管
图中数码管采用的是一位七段共阴数码管,其中60秒倒计时的十位接P0口,个位接P2口。
二、Proteus原理图绘制
原理图的绘制如下图所示,在Proteus软件下根据下图绘制出原理图:
图6系统原理图
图中U1为单片机AT89C51,C1、C2为30pf的电容,C3为10pf的电解电容,X1为12MHz的晶体振荡器,K1为按钮开关,AT89C51的P1、P2分别接一个七段数码管。
三、Proteus电路仿真与结果分析
1.KeilC软件
用到了KeilC软件,集成调试环境,集成了编辑器、译码器、调试器,支持软件模拟,支持项目管理功能强大的观察窗口,支持所有的数据类型。
树状结构显示,一目了然,支持ASM(汇编)、C语言多模块源程序混合调试,在直接修改、编译、调试源程序,错误指令定位。
功能很强大,用于对程序的调试和编辑。
其界面如下:
图7KeilC界面
2.Proteus软件
系统仿真还用到了Proteus软件,可通过仿真显示出所设计系统的功能,对于程序的调试等有很大的帮助。
系统仿真时首先在使用KeilC译码器,把所写的程序进行编译,同时在仿真器里设置生成HEX文件,编译无错误进行Proteus仿真。
等所有的原件都连接完成后可以把KeilC编译生成的无错误文件加载到AT89C51中,方法是,右键点中器件然后再用左键点击,出来一个对话框在programfile后选择要添加的文件,文件要求必须是HEX文件。
然后可以点击运行观察现象,看与自己设置的是否符合,如果不相符再查找错误进行修改,一般的错误都是程序中的,所以要认真的读取程序的每一个部分。
系统的仿真图如下图:
图8Proteus电路仿真图
(1)
四、软、硬联调
首先,用烧录器把在KeilC软件下生成的HEX文件烧录到单片机AT89C51芯片中。
烧录的步骤如下:
选项/串口设置、芯片/选择芯片型号是AT89C51、文件/装载/选择HEX文件、擦除、查空、编程、校验。
其次,根据原理图焊接电路。
焊接完后检查电路是否正确、是否有虚焊,确定无误后接到5伏的稳压电源,倒计时开始。
图10实物图正面
图11实物图背面
五、心得体会
通过这次设计,掌握51单片机的原理,了解简单倒计时的组成原理,初步掌握了60秒倒计时的调试及测试方法,提高动手能力和排除故障的能力。
同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解60秒倒计时各单元电路之间的关系及相互影响,从而能正确设计、计算60秒倒计时各个单元电路。
学习单片机不仅仅是学习单片机本身,还有它外部的扩展器件也要熟练,器件的选型要求对单片机外围器件有充分的理解。
只有充分的理解,才能做到用时得心应手。
学习单片机要有一定的基础:
电子技术方面要有数字电路和模拟电路等方面的理论基础,特别是数字电路;
编程语言要求汇编语言或C语言。
要想成为单片机高手,建议初学者首先学习汇编语言,学的差不多的时候,转入C语言学习。
尽管汇编语言属于低级语言,编程效率低,但是较C语言具有目标代码简短,占用内存少,执行速度快等优点,更重要的是能使初学者尽快熟悉单片机的内部结构,并能对其进行精确的控制。
汇编语言在单片机教材里面都会涉及,不需要单独购买教材和学习。
C语言是一门学问,有很多专业书籍来讲解,并且对我们今后的编程生涯有绝对的好处,因此要深入学习,千万不要自以为看了某某的视频教程就以为掌握了C语言,那只是C语言的一部分。
学习单片机最好从51系列开始,第一是书多、资料多,而且掌握51技术的人多,碰到问题能请教的老师也就多了,51系列的实验芯片AT89C51价格低廉而且很容易买到,AT89C51芯片而且可以反复擦写1000次以上,对于初学者来说真是太合适了,就算以后考虑工业运用,也可以先学透51后再学其他类型的单片机,毕竟技术是相通的。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
六、元件清单
单片机AT89C51芯片一块、七段数码管两个、12MHz石英晶体振荡器一个、30pf电容两个、排阻两个、1千欧电阻一个、电路板一块。
参考文献
【1】肖洪兵.跟我学用单片机.北京:
北京航空航天大学出版社,2002.8
【2】何立民.单片机高级教程.第1版.北京:
北京航空航天大学出版社,2001
【3】赵晓安.MCS-51单片机原理及应用.天津:
天津大学出版社,2001.3
【4】李广第.单片机基础.第1版.北京:
北京航空航天大学出版社,1999
【5】徐惠民、安德宁.单片微型计算机原理接口与应用.第1版.北京:
北京邮电大学出版社,1996
【6】何立民.从Cygnal80C51F看8位单片机发展之路.单片机与嵌入式系统应用,2002年,第5期:
P5~8
【7】夏继强.单片机实验与实践教程.北京:
北京航空航天大学出版社,2001
【8】陈志强胡辉.单片机应用系统设计实践指南.自编教材
【9】胡学海.单片机原理及应用系统设计[M].北京:
北京电子工业出版社,2005年.
附件:
PADS电路图和封装
KeilC下编写源代码
#include<
AT89X52.H>
//unsignedcharcodenumtab[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsignedcharcodenumtab[10]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
sbitkey=P1^0;
unsignedcharm,n=1;
voiddelay()
{
unsignedchari,j,k;
for(i=0;
i<
100;
i++)
for(j=0;
j<
j++)
for(k=0;
k<
10;
k++);
}
voiddelay1()
unsignedi,j;
4;
50;
j++);
voidmain()
unsignedchari=0,j=4;
while
(1){
if(key==0)
{delay1();
if(key==0){
m++;
if(m==1)n=0;
if(m==2){n=1,m=0;
}
}while(!
key);
P2=numtab[i];
P0=numtab[j];
if(n)
{
delay();
i++;
if(i==10)
i=0;
j++;
if(j==10)
j=4;