单片机课程设计(论文)-电子秒表.doc_第1页
单片机课程设计(论文)-电子秒表.doc_第2页
单片机课程设计(论文)-电子秒表.doc_第3页
单片机课程设计(论文)-电子秒表.doc_第4页
单片机课程设计(论文)-电子秒表.doc_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子秒表摘 要:本设计的成品是在单片机最小系统的基础上增加显示电路和控制电路来完成电子秒表的硬件电路的。电子秒表电路主要由at89s52单片机最小系统电路、七段数码管动态显示电路和控制电路组成,它能实现八位数码显示和多次计时,能通过控制电路能控制时间的暂停、开始和清零,能够多次存储时间,并查询显示计时时间的顺序。关键字:at89s52 数码管 最小系统1 方案设计1.1系统分析设计的电路主要是能多次记时和查询时间,记时的多少通过显示电路显示出来,每一次计时可以通过控制电路查询出来。设计框图如图一所示; 1.2系统方案方案一:利用at89s52单片机设计数显定时器和定时器。单片机软件编程灵活、自由度大,可用软件编程实现各种控制算法和逻辑控制。利用74hc573锁存器和按键作为控制电路,通过位选和段选来实现数码管的显示。 2 硬件设计2.1 控制芯片的介绍at89s52(与at89s51相同)单片机的外型如图四所示。单片机可分为通用型和专用型,种类繁多。这里我们主要介绍at89s52单片机是属于典型代表的mcs-51系列单片机,它是一种能处理8位数据的通用型单片机。以atmel公司生产的具有cmos工艺、低功耗、高性能的at89s52为例,介绍单片机的工作原理、控制程序的编写及开发应用。at89s52是一个高性能cmos 8位单片机,芯片内集成了通用8位中央处理器,片内含8k bytes的可反复擦写1000次的flash只读程序存储器(rom), 支持isp(in-system programmable)功能。 at89s52内部有128 bytes的随机存取数据存储器(ram), 5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(wdt)电路,片内时钟振荡器。兼容标准mcs-51指令系统及80c51引脚结构。图五 at89s52引脚图 图四at89s52有40个引脚,32个外部双向输入/输出(i/o)口。该芯片还具有pdip40、tqfp44和plcc44三种封装形式,以适应不同产品的需求。外型和封装形式如图四所示。从外观上看单片机就是一块集成电路,它与在模拟电路和数字电路中学习过的集成电路电路最主要的区别是:普通集成电路电路的引脚功能基本上固定的,而单片机的一些引脚的功能是可以通过编程进行控制,一些引脚既可作输入又可作输出。单片机广泛用于工业控制、智能仪器仪表、计算机设备及网络、通信领域、家用电器、医用设备、军用设备等各个方面。对于单片机这样的集成电路,要设计让它完成一个特定的工作任务,除完成设计相关的硬件电路外,还要设计相应的控制软件,才能使整个电路按照设计要求自动地进行工作。所以,电子电路学习到单片机这个知识层次时,除要学习相关硬件知识,还学习相关软件设计知识,才能对单片机进行控制和应用。单片机的开发和应用,是利用硬件和软件的结合来实现的。由于单片机的功能强大,充分理解各引脚功能,灵活编写控制程序去控制引脚功能,完成各种需要的设计。2.2 单片机最小系统2.2.1 振荡电路让单片机活起来的心脏at89s52是内部具有振荡电路的单片机,只需在18脚和19脚之间接上石英晶体(如图六中所示),给单片机加上工作所需直流电源,振荡器就开始振荡起来。振荡电路就为单片机工作提供了所需要的时钟脉冲信号,使单片机的内部电路,单片机的内部程序(若有)开始工作起来。振荡电路不工作,整个单片机电路都不能正常工作。at89s52常外接6mhz、12 mhz的石英晶体,图中接入的是12mhz的石英晶体,最高可接24mhz石英晶体。 18脚和19 脚分别对地接了一个20p的电容,目的是防止单片机自激。如果从18脚输入外部时钟脉冲,则19脚接地。2.2.2 复位电路恢复初始状态值复位电路就是在rst端(9脚)外接的一个电路,目的是当单片机上电开始工作时,内部电路从初始状态开始工作,或者在工作中要想人为的让单片机重新从初始状态开始工作。在时钟工作的情况下,只要at89s52的复位引脚高电平保持两个机器周期以上的时间,at89s52便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且从地址0000h处开始读入程序代码而执行程序。具体电路如图六所示,由c1和r2构成上电自动复位电路,s17实现手动开关复位。2.2.3 程序下载接入电路图六中有一个下载线接口j13,j13的1脚接5伏电源,2、3、4脚接单片机的p1口的p1.5、p1.6、p1.7三个引脚,5脚接复位引脚,6脚接地。在计算机中编写好的程序通过数据下载线连接到单片机实验电路插接口(j13),实现从计算机将程序下载到单片机的程序存储器中,完成单片机的程序写入工作。图六 单片机最小系统由于at89s51不仅象89c51支持程序的并行写入,而且支持isp在线可编程的串行写入,利用下载线将计算机将原程序编译后进行串行写入到at89s51,速度快、稳定性好,同不时需要vpp烧写高压,只要45v供电即可完成写入。2.3 电源电路设计电源电路如图1-10所示。通过j15电源插座接入大于69伏的直流电压,经7805稳压后给整个电路提供5伏直流电压。r11和d10为电源指示电路,通电后d10亮。为了有效消除干扰,接入了几只0.01f的电容器(电路图中没有)。图七2.4 显示电路设计实验电路设计了一组数码管显示电路,八只数码管可以单只驱动,也可动态驱动显示八位数码管。通过锁存器74hc573控制数码管的显示,电路如图八所示。2.5 控制电路设计控制电路主要由三个独立的按键组成,我们可以用按键来控制计时的开始、暂停、清零、倒计时、锁存和查询。所有按键的一端接地,另一端与单片机的p1口的几个引脚相连。3 软件设计3.1程序设计思路在硬件的基础上,可以通过软件完成电子秒表的设计。我先用了矩阵键盘上的四个独立按键作为控制键。用一个键去控制计数的开始、暂停和清零;用一个键作计时的保存按键;用一个按键作查询按键,最后一个键用作60秒倒计时,用按键扫描的方法判断按键是否按下。用动态显示的方法扫描秒表的计数,显示所计下的数。用定时中断作为计数的基础。保存所计数的方法是:将所计数先放入数组内,再经过查询的方法将数组中的数一个一个显示出来。3.2 源程序#include#define uint unsigned int#define uchar unsigned charuchar dot,sec,min,num,key_t,i,j,t,b;sbit dula=p22;sbit wela=p23;sbit key3=p11;sbit key4=p12;sbit key5=p14;sbit k=p13;uchar table13;uchar table23;uchar table33;uchar k3;bit flag;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;void display(uchar,uchar,uchar);void delay(uint z);void init();void key_to(); void keycan3();void keycan4(); void keycan5();void main()init();/初始化子程序while(1) if(k != 1) / 有键按下 delay(10); / 延时10ms去抖 if(k != 1) / 确定是有键按下 while(k != 1); / 等待键松开 key_to(); / 按键处理 keycan3(); keycan4(); keycan5();void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void display(uchar dot,uchar sec,uchar min) /显示函数 p0=tabledot%10;dula=1;dula=0;p0=0xff;p0=0x7f;wela=1;wela=0;delay(1);p0=tabledot/10;dula=1;dula=0;p0=0xff;p0=0xbf;wela=1;wela=0;delay(1);p0=table10;dula=1;dula=0;p0=0xff;p0=0xdf;wela=1;wela=0;delay(1);p0=tablesec%10;dula=1;dula=0;p0=0xff;p0=0xef;wela=1;wela=0;delay(1); p0=tablesec/10;dula=1;dula=0;p0=0xff;p0=0xf7;wela=1;wela=0;delay(1);p0=table10;dula=1;dula=0;p0=0xff;p0=0xfb;wela=1;wela=0;delay(1);p0=tablet;dula=1;dula=0;p0=0xff;p0=0xfd;wela=1;wela=0;delay(1); p0=table0;dula=1;dula=0;p0=0xff;p0=0xfe;wela=1;wela=0;delay(1);void init() /初始化wela=0;dula=0;tmod=0x11;th0=(65536-300)/256;tl0=(65536-300)%256; th1 =(65536-1000)/256; tl1 =(65536-1000)%256;ea=1;et0=1;et1=1;tr1=1;tr0=0;void timer0() interrupt 1if(flag=0)th0=(65536-300)/256;tl0=(65536-300)%256;num+;if(num=5) num=0;dot+;if(dot=100)dot=0;sec+;if(sec=60) sec=0;min+;if(min=60)min=0; if(flag=1)th0=(65536-300)/256;tl0=(65536-300)%256;num+;if(num=5) num=0;dot+;if(dot=100)dot=0;sec-;if(sec=0)tr0=0; void time1(void) interrupt 3 display(dot,sec,min); th1 =(65536-1000)/256; tl1 =(65536-1000)%256; void key_to() / 按键处理子程序 key_t+; / 按键次数加1 if(key_t = 1) / 第一次按下 tr0 = 1; / 启动定时器0 else if(key_t = 2) / 第二次按下 tr0 = 0; / 关闭定时器0 else if(key_t = 3) / 第三次按下 dot = 0; / 三个计数器清零 sec = 0; min = 0; key_t = 0; / 按键次数清零 void keycan3()/保持三组数据 if(key3=0)delay(10);if(key3=0)while(key3!=1); if(tr0=0) table1i=dot; table2i=sec; table3i=min;kb=i+1;b+; if(b=3) b=0; i+; if(i=3) i=0; void keycan4() /提取保存的三组数据if(key4=0)delay(10);if(key4=0)while(key4!=1); if(tr0=0) dot=table1j; sec=table2j; min=table3j; t=kb;b+; if(b=3) b=0; j+; if(j=3) j=0; void keycan5()if(key5=0)delay(10);if(key5=0)while(key5!=1); key_t+; / 按键次数加1 if(key_t = 1) / 第一次按下 sec=59; if(key_t = 2) / 第二次按下 flag=1; tr0 = 1; if(key_t = 3) key_t=0; tr0=0; flag=0; #include#define uint unsigned int#define uchar unsigned charuchar dot,sec,min,num,key_t,i,j,t,b;sbit dula=p22;sbit wela=p23;sbit key3=p11;sbit key4=p12;sbit key5=p14;sbit k=p13;uchar table13;uchar table23;uchar table33;uchar k3;bit flag;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;void display(uchar,uchar,uchar);void delay(uint z);void init();void key_to(); void keycan3();void keycan4(); void keycan5();void main()init();/初始化子程序while(1) if(k != 1) / 有键按下 delay(10); / 延时10ms去抖 if(k != 1) / 确定是有键按下 while(k != 1); / 等待键松开 key_to(); / 按键处理 keycan3(); keycan4(); keycan5();void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void display(uchar dot,uchar sec,uchar min) /显示函数 p0=tabledot%10;dula=1;dula=0;p0=0xff;p0=0x7f;wela=1;wela=0;delay(1);p0=tabledot/10;dula=1;dula=0;p0=0xff;p0=0xbf;wela=1;wela=0;delay(1);p0=table10;dula=1;dula=0;p0=0xff;p0=0xdf;wela=1;wela=0;delay(1);p0=tablesec%10;dula=1;dula=0;p0=0xff;p0=0xef;wela=1;wela=0;delay(1); p0=tablesec/10;dula=1;dula=0;p0=0xff;p0=0xf7;wela=1;wela=0;delay(1);p0=table10;dula=1;dula=0;p0=0xff;p0=0xfb;wela=1;wela=0;delay(1);p0=tablet;dula=1;dula=0;p0=0xff;p0=0xfd;wela=1;wela=0;delay(1); p0=table0;dula=1;dula=0;p0=0xff;p0=0xfe;wela=1;wela=0;delay(1);void init() /初始化wela=0;dula=0;tmod=0x11;th0=(65536-300)/256;tl0=(65536-300)%256; th1 =(65536-1000)/256; tl1 =(65536-1000)%256;ea=1;et0=1;et1=1;tr1=1;tr0=0;void timer0() interrupt 1if(flag=0)th0=(65536-300)/256;tl0=(65536-300)%256;num+;if(num=5) num=0;dot+;if(dot=100)dot=0;sec+;if(sec=60) sec=0;min+;if(min=60)min=0; if(flag=1)th0=(65536-300)/256;tl0=(65536-300)%256;num+;if(num=5) num=0;dot+;if(dot=100)dot=0;sec-;if(sec=0)tr0=0; void time1(void) interrupt 3 display(dot,sec,min); th1 =(65536-1000)/256; tl1 =(65536-1000)%256; void key_to() / 按键处理子程序 key_t+; / 按键次数加1 if(key_t = 1) / 第一次按下 tr0 = 1; / 启动定时器0 else if(key_t = 2) / 第二次按下 tr0 = 0; / 关闭定时器0 else if(key_t = 3) / 第三次按下 dot = 0; / 三个计数器清零 sec = 0; min = 0; key_t = 0; / 按键次数清零 void keycan3()/保持三组数据 if(key3=0)delay(10);if(key3=0)while(key3!=1); if(tr0=0) table1i=dot; table2i=sec; table3i=min;kb=i+1;b+; if(b=3) b=0; i+; if(i=3) i=0; void keycan4() /提取保存的三组数据if(key4=0)delay(10);if(key4=0)while(key4!=1); if(tr0=0) dot=table1j; sec=table2j; min=table3j; t=kb;b+; if(b=3) b=0; j+; if(j=3) j=0; void keycan5()if(key5=0)delay(10);if(key5=0)while(key5!=1); key_t+; / 按键次数加1 if(key_t = 1) / 第一次按下 sec=59; if(key_t = 2) / 第二次按下 flag=1; tr0 = 1; if(key_t = 3) key_t=0; tr0=0; flag=0; #include#define uint unsigned int#define uchar unsigned charuchar dot,sec,min,num,key_t,i,j,t,b;sbit dula=p22;sbit wela=p23;sbit key3=p11;sbit key4=p12;sbit k=p13;uchar table13;uchar table23;uchar table33;uchar k3;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;void display(uchar,uchar,uchar);void delay(uint z);void init();void key_to(); void keycan3();void keycan4();void main()init();/初始化子程序while(1) if(k != 1) / 有键按下 delay(10); / 延时10ms去抖 if(k != 1) / 确定是有键按下 while(k != 1); / 等待键松开 key_to(); / 按键处理 keycan3(); keycan4();void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void display(uchar dot,uchar sec,uchar min) /显示函数 p0=tabledot%10;dula=1;dula=0;p0=0xff; p0=0x7f;wela=1;wela=0;delay(1);p0=tabledot/10;dula=1;dula=0;p0=0xff;p0=0xbf;wela=1;wela=0;delay(1);p0=table10;dula=1;dula=0;p0=0xff;p0=0xdf;wela=1;wela=0;delay(1);p0=tablesec%10;dula=1;dula=0;p0=0xff;p0=0xef;wela=1;wela=0;delay(1);p0=tablesec/10;dula=1;dula=0;p0=0xff;p0=0xf7;wela=1;wela=0;delay(1);p0=table10;dula=1;dula=0;p0=0xff;p0=0xfb;wela=1;wela=0;delay(1);p0=tablet; dula=1;dula=0;p0=0xff;p0=0xfd;wela=1;wela=0;delay(1);p0=table0;dula=1;dula=0;p0=0xff;p0=0xfe;wela=1;wela=0;delay(1);void init() /初始化wela=0;dula=0;tmod=0x11;th0=(65536-300)/256;tl0=(65536-300)%256; th1 =(65536-1000)/256; tl1 =(65536-1000)%256;ea=1;et0=1;et1=1;tr1=1;tr0=0;void timer0() interrupt 1th0=(65536-300)/256;tl0=(65536-300)%256;num+;if(num=5) num=0;dot+;if(dot=100)dot=0;sec+;if(sec=60) sec=0;min+;if(min=60)min=0; void time1(void) interrupt 3 /保持三组数据display(dot,sec,min); th1 =(65536-1000)/256; tl1 =(65536-1000)%256; void ke

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论