基于MCS51单片机的多功能秒表设计《微机原理与应用》课程设计报告1.docx_第1页
基于MCS51单片机的多功能秒表设计《微机原理与应用》课程设计报告1.docx_第2页
基于MCS51单片机的多功能秒表设计《微机原理与应用》课程设计报告1.docx_第3页
基于MCS51单片机的多功能秒表设计《微机原理与应用》课程设计报告1.docx_第4页
基于MCS51单片机的多功能秒表设计《微机原理与应用》课程设计报告1.docx_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

微机原理与应用课程设计题目:基于mcs51单片机的多功能秒表设计中国矿业大学信息与电气工程学院微机原理与应用课程设计课程设计内容:1、完成就基于mcs51单片机的多功能秒表设计的软硬件设计和调试。2、完成课程设计报告的撰写。3、课程设计说明书要求:摘要、设计要求、系统结构、原理设计、各个模块的设计与实现、软件设计、调试过程、收获、体会及总结、参考文献、电路图和源程序。说明书使用a4打印纸计算机打印或手写,用protel等绘图软件绘制电子线路图纸基本功能实现:1、设计多功能秒表,以百分之一秒的单位计时,并在数码管上显示计时时间;2、设置【开始键】【停止键】【存储键】【回放键】,上电后数码管显示p,以示准备计时,按开始键启动计时;3、按存储键存储按键时刻的时间,允许一次启动最多按20次存储键;4、按停止键结束计时,显示最终的计时时间;5、按回放键每按一次依次显示存储序号和存储时间,最后一个存储时间回放结束后,再显示最终的计时时间,如此循环显示;扩展功能与创新 1、设置【倒计时键】,按下倒计时键,能够利用矩阵键盘手动设置初值,然后启动倒计时,直到计时为零,蜂鸣器发声,数码管闪烁;指导教师签名: 年 月 日系主任签名: 年 月 日基于mcs51单片机的多功能秒表设计摘要本设计是设计一个单片机控制的多功能秒表系统。近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动着传统控制检测日新月异的更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对具体的应用对象的软件结合,加以完善。秒表的出现,解决了传统的由于人为因素造成的误差和不公平性。本设计的多功能秒表系统采用at89c51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、led数码管以及矩阵按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计数,并且结合相应的显示驱动程序,使数码管能够正确地显示时间、存储时间、暂停和倒计时。我设计的秒表可以同时记录二十个相对独立的时间,通过回放键来查看这二十个不同的计时值,另外还能够设置初值进行倒计时,具有秒表该有的绝大部分功能,可谓功能强大。其中软件系统采用c51语言编写程序,包括显示程序,存储程序,回放程序,定时器中断,延时程序,按键消抖程序等,硬件系统利用proteus强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。 关键字:单片机;多功能秒表;proteus目 录1.绪论 1.1设计目的 1.2 设计要求 1.3 设计意义2.系统方案比较及硬件设计 2.1系统总体方案 2.2硬件设计 2.2.1 89c51单片机 2.2.2晶体振荡电路 2.2.3复位电路2.2.4电源电路 2.2.5矩阵按键电路 2.2.6显示与蜂鸣器电路2.2.7硬件电路图3.软件设计 3.1设计特点 3.2设计思路及程序流程图3.2.1系统主程序3.2.2其他子程序定时器初始化程序4.系统调试4.1硬件调试4.2软件调试5.课程设计体会参考文献附录附件1:元器件清单附件2:完整程序清单附件3:电路原理图附件4:pcb板电路附件5:操作说明书1.绪论1.1设计目的 设计一个单片机控制的多功能秒表系统。利用单片机的定时器/计数器定时和记数的原理,结合显示电路、led数码管以及矩阵按键来设计秒表。将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时具有开始/暂停,存储记录,回放计时,清零,设置初值倒计时等功能。1.2设计要求(1)设计多功能秒表,以百分之一秒的单位计时,并在数码管上显示计时时间;(2)上电后数码管显示p,以示准备计时,按开始键启动计时;(3)key1:启动和停止。停止时按键启动计时,启动时按键停止计时。再按,则在原计时值基础上继续计时;(4)key2:存储和回放。当启动时,按键为存储;当停止时,按键为回放,且能将存储值循环回放;按回放键每按一次依次显示存储序号和存储时间,最后一个存储时间回放结束后,再显示最终的计时时间,如此循环显示;(5)key3:清零。清除存储值和计时值,回到初始状态,显示p;(6)key4:倒计时键。能够利用矩阵键盘手动设置初值,然后启动倒计时,直到计时为零,蜂鸣器发声,数码管闪烁,最后显示00:00:00。1.3设计意义(1)通过本次课程设计可以使我们进一步熟悉和掌握单片机内部结构和工作原理,了解单片机应用系统设计的基本步骤和方法。(2)通过利用at89c51单片机,理解单片机在自动化仪表中的作用以及掌握单片机的编程方法。(3)通过设计一个简单的实际应用输入及显示模拟系统,掌握单片机仿真软件proteus的使用方法。 (4)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、倒计时功能,并能同时记录多个相对独立的时间利用回放按钮查看多个不同的计时值,该种秒表在现实生活中应用广泛,具有现实意义。2系统方案比较及硬件设计2.1系统总体方案方案一:采用数字逻辑芯片本系统有功能设置、数据装入、定时、显示、控制多个功能模块。各个状态保持或转移的条件依赖于键盘控制信号。由于键盘控制信号繁多,系统的逻辑状态以及相互转移更是复杂,用纯粹的数字电路或小规模的可编程逻辑电路实现该系统有一定的困难,需要用中大规模的可编程逻辑电路。这样,系统的成本就会急剧上升(相对于方案二)。因此,本设计并未采用这种方案。方案二:采用mcu内部定时器at89c51内部含有2个定时器,可以利用一个定时器计时与一个定时器倒计时。再结合矩阵键盘控制,方便采集信号,而且结合编程,易于实现。由于方案二具有较好的灵活性、较少的电路器件和较高的性价比,而且通过精确的软件补偿使精度完全可以满足控制需要,所以我们选择该方案完成设计。本系统采用at89c51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些矩阵按键电路等来设计计时器,将软、硬件有机地结合起来。其中软件系统采用汇编语言编写程序,包括显示,计数,中断,延时,按键消抖程序等,并在编程软件中调试运行,硬件系统利用proteus强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。系统电路原理框图如图1所示。 外围电路单片机显示电路电源电路路键盘电路图1 系统电路原理框图2.2硬件设计2.2.1 89c51单片机mcs-51系列单片机是8位单片机产品,89c51是其中的典型代表,基本模块包括以下几个部分:(1)cpu:89c51的cpu是8位的,另外89c51内部有1个位处理器(2)r0m:4kb的片内程序存储器,存放开发调试完成的应用程序(3)ram:256b的片内数据存储器,容量小,但作用大(4)i/o口:p0-p3,共4个口32条双向且可位寻址的i/o口线(5)中断系统:共5个中断源,3个内部中断,2个外部中断(6)定时器/计数器:2个16位的可编程定时器/计数器(7)通用串行口:全双工通用异步接收器/发送器(8)振荡器:89c51的外接晶振与内部时钟振荡器为cpu提供时钟信号(9)总线控制:89c51对外提供若干控制总线,便于系统扩展 89c51的引脚图如下:图2 89c51单片机引脚图 图3 晶体振荡电路图4 复位电路2.2.2晶体振荡电路(如图3所示)89c51芯片内部有一个高增益反相放大器,用于构成振荡器。引线 xtal1和xtal2分别为反向放大器的输入和输出,两端跨接石英晶体及两个电容就可构成稳定的自激振荡器。这里,我们选用51单片机12mhz的内部振荡方式,电容器c1,c2起稳定振荡频率,并对振荡频率有微调作用,c1和c2可在20-100pf之间取值,这里取33pf。2.2.3 复位电路(如图4所示)采用上电加按键复位电路,上电后,由于电容充电,使rst持续一段高电平时间。当单片机已在运行之中时,按下复位键也能使rst持续一段时间的高电平,从而实现上电加按键复位的操作。2.2.4电源电路 用于这里直接利用普中科技开发板进行硬件设计,而且电源在这里也不是我们应该重点考虑的部分,因此我们可以选择用蓄电池供电,或者采用usb线接+5v电源进行供电。在这里我选择后者,方便易用。2.2.5矩阵按键电路(如图5所示) 在矩阵按键电路中,我们可以在i/o口上直接接按键,或者通过i/o口设计一个键盘,然后通过键盘扫描程序判断是否有键按下等。键盘扫描电路节省i/o口,但编程有些复杂,将矩阵键盘按图中所示与89c51的p1口相连。在这里,我采用行扫描法编程读取键值,然后执行相应的操作,我们将按键s0s9用于倒计时时候对秒表赋初值,按下则输入相应的键值,按键s10和是s11暂时留着备用,按键s12用于计时启动和停止,s13用于计时值存储和回放,s14用于秒表清零(相当于单片机手动复位),s15用于选择倒计时功能和启动倒计时。也就是说,s12s15四个按键都具有双重功能,但不会冲突,因为有前提条件,例如,s12启动和停止键,停止时按键启动计时,启动时按键停止计时。再按,则在原计时值基础上继续计时;s12存储和回放键。当启动时,按键为存储;当停止时,按键为回放。这样可以减少所使用的按键,而且操作方便,但是这对程序的编写要求就相应的提高了。对于按键的设计,采用了软件延时消抖的程序,使系统的性能得到进一步的提升。当按键被按下时,相应的引脚被拉低,经扫描后,获得键值,并执行键功能程序,因此按下不同的按键,将执行不同的功能程序。 图5 矩阵按键电路2.2.6显示与蜂鸣器电路(如图6所示)方案一:使用数码管显示该方案控制最简单,根据设计要求显示格式xxxxxxxx。可以准确的显示计时时间,又由于数码管简单便宜且满足设计要求,而且成本较低,所以选着数码管显示比较合理。方案二:使用lcd12864液晶显示点阵液晶可以显示多种字符及图形,拥有友好的人机界面及强大的显示功能。特别适用于智能控制的可编程人性化显示。但是比较复杂。使用不方便。增加了难度。比较方案一和二, 我这里选择采用的是数码管显示电路。用八个共阴极led数码管显示,led数码管内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各管的亮暗组合成字符。在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示稳定,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的i/o口。在设计中,我们采用led动态显示,用p0口驱动显示。由于p0口的输出级是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。秒表为计时和倒计时的时候,显示格式为xx-xx-xx,前两位为分钟,中间两位为秒,后面两位为10ms,加上中间两根横线刚好能在八段数码管中显示;当为回放显示存储数据时,由于需要显示至多二十组数据,因此需要两位数码管显示存储次数,如果还按照刚才的显示方式则数码管不够用。因此为了方便观察,我采用的显示格式为xx.xx.xx.xx,前面两位为存储次数,中间每两位用1个小圆点发光二极管显示,便于区分。由于采用动态显示,我选用74ls138译码器作为共阴数码管的位选译码输入。 图6 数码管显示电路74ls138为3 线8 线译码器,共有 54/74s138和 54/74ls138两种线路结构型式,其工作原理如下:当一个选通端(s1)为高电平,另两个选通端(s2)和s3)为低电平时,可将地址端(a2、a1、a0)的二进制编码在一个对应的输出端以低电平译出。因此,只要将at89c51的p2.4,p2.3,p2.2口与74ls138的a2、a1、a0口相连,即可以进行位选控制。其管脚图如图7,真值表如图8所示。 图7 74ls138管脚图 图8 3线-8线译码器74ls138的功能表蜂鸣器电路(如图9) 倒计时结束后,蜂鸣器发声,片刻后停止,利用at89c51的p2.5口控制蜂鸣器发声。图9 蜂鸣器电路2.2.7硬件电路图(如图10所示)图10 硬件电路图3.软件设计3.1设计特点在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,实现某个具体的功能,如:计数、延时、和显示等,在具体需要时调用相应的模块即可。功能描述:用八位led数码管显示时间。十个初值输入键,一个开始/暂停键, 一个“记录/回放”键,一个复位键,一个“倒计时”键,可同时记录20个相对独立的时间,查看20个不同的计时值。这14个按键分别控制秒表的五个功能。3.2设计思路及程序流程图3.2.1系统主程序 设计思路:在主程序中进行定时器初始化,键扫描程序,显示程序,根据扫描到的键值进入相应的功能模块,执行相应的功能。具体键值及对应功能如下表:按键名(s0s15)键值(keyvalue)对应子程序实现功能s0s909倒计时,设初值s10s11s1212启动和停止s1313存储/回放子程序存储和回放计时s1414清零(复位)清零秒表s1515倒计时子程序倒计时功能注:1、 表格中空白处为未使用; 2、 s12键,启动和停止。停止时按键启动计时,启动时按键停止计时。再按,则在原计时值基础上继续计时;3 、s13键 存储和回放。当启动时,按键为存储;当停止时,按键为回放。 4、设置f0 开始标志位;f1 停止标志位;f2 倒计时标志位;主程序流程图如图11所示:图11 流程图源程序如下:void main() timer0configuration(); /定时器初始化 displaydata0=0x73; /上电后显示p while(1) keydown(); /键扫描 if(keyvalue=12)&(f0=0) /开始 f0=1;tr0=1;keyvalue=0; if(keyvalue=12)&(f0=1)/ 停止 tr0=0;f1=1;f0=0;keyvalue=0; if(keyvalue=13)&(f0=1) /存储 keyvalue=0;cuncu();if(keyvalue=13)&(f0=0) /回放 keyvalue=0; tr0=0;huifang(); if(keyvalue=14)keyvalue=0;f0=0;f2=0;tr0=0;tr1=0;displaydata0=0x73;/清除存储值和计时值,回到初始状态,显示p ms_10=0,sec=0,min=0,t1=0,t11=0,keyvalue=0;for(k=0;k60;k+)aak=0;for(k=1;k8;k+) displaydatak=0x00; if(keyvalue=15)&(f0=0)&(f2=0)daojis(); /倒计时 digdisplay();3.2.2其他子程序定时器初始化程序(1)定时器初始化中断服务程序 运用两个计数定时器,均工作在方式一,通过tr0/tr1控制计时器工作。计算初值:由于晶振频率为12mhz,需要定时10ms 所以初值th0=d8h,tl0=f0h;th1=d8h,tl1=f0h。源程序如下:void timer0configuration() /初始化tmod=0x11;/选择为定时器模式,均工作为方式1,仅用tr0,tr1打开启动。 th0=0x0d8;/给定时器0赋初值,定时100mstl0=0x0f0;th1=0x0d8;/给定时器1赋初值,定时100mstl1=0x0f0;et0=1;/打开定时器0中断允许et1=1;/打开定时器1中断允许ea=1;/打开总中断中断服务程序见附录三(2)键扫描子程序矩阵键盘扫描原理方法一:逐行扫描:我可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。方法二:行列扫描:我可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。这里采用方法二,源程序如下:void keydown(void) /键扫描子程序unsigned int a;gpio_key=0x0f;if(gpio_key!=0x0f)delay10ms(1);if(gpio_key!=0x0f)/测试列gpio_key=0x0f;switch(gpio_key)case(0x07):keyvalue=0;break;case(0x0b):keyvalue=1;break;case(0x0d): keyvalue=2;break;case(0x0e):keyvalue=3;break;/测试行gpio_key=0xf0;switch(gpio_key)case(0x70):keyvalue=keyvalue;break;case(0xb0):keyvalue=keyvalue+4;break;case(0xd0): keyvalue=keyvalue+8;break;case(0xe0):keyvalue=keyvalue+12;break;while(a50)&(gpio_key!=0xf0) /检测按键松手检测delay10ms(1);a+;a=0;(3)显示子程序这里采用动态显示,方便调用,源程序如下:void digdisplay(void)/显示子程序unsigned char i;unsigned int j;for(i=0;i8;i+)switch(i) /位选,选择点亮的数码管,case(0):lsa=0;lsb=0;lsc=0; break;/显示第0位case(1):lsa=1;lsb=0;lsc=0; break;/显示第1位case(2):lsa=0;lsb=1;lsc=0; break;/显示第2位case(3):lsa=1;lsb=1;lsc=0; break;/显示第3位case(4):lsa=0;lsb=0;lsc=1; break;/显示第4位case(5):lsa=1;lsb=0;lsc=1; break;/显示第5位case(6):lsa=0;lsb=1;lsc=1; break;/显示第6位case(7):lsa=1;lsb=1;lsc=1; break;/显示第7位gpio_dig=displaydatai;/发送段码j=50; /扫描间隔时间设定while(j-);gpio_dig=0x00;/消隐(4)存储子程序当存储/回放键按下,即keyvalue=13,且定时器0为启动状态时,对当前时间进行存储,设置t1为计时次数。源程序如下:void cuncu()/存储程序t1+; /t1为计时次数 a=3*(t1-1);/ 修改1 :原来存储指针计算错误,添加 a=3*(t1-1)指针计算if(t10)b=3*(t1-1); displaydata7=zxmat1/10;/数码管7、6显示次数 displaydata6=zxmat1%10+128; displaydata5=zxmaaab/10; displaydata4=zxmaaab%10+128; /数码管5、4显示分钟 b+; displaydata3=zxmaaab/10; /数码管3、2显示秒 displaydata2=zxmaaab%10+128; b+; displaydata1=zxmaaab/10; /数码管1、0显示10ms displaydata0=zxmaaab%10; t1-; digdisplay(); (6) 倒计时子程序 倒计时程序是软件设计的一大难点,也是我新拓展的功能,首先要解决如何用按键赋倒计时初值的问题,其次再实现倒计时也比计时麻烦一些。我编写的程序相对比较繁琐,也许有待进一步精简完善。设置xian()子程序方便调用,源程序如下:void daojis() ms_10=0,sec=0,min=0,m1=0,m0=0,s1=0,s0=0; while(1) keydown(); if(keyvalue6)m1=keyvalue;keyvalue=11; /第一次按键为秒的低位 while(1)keydown(); if(keyvalue10)m0=keyvalue;keyvalue=11; while(1)keydown(); if(keyvalue6)s1=keyvalue;keyvalue=11; while(1)keydown(); if(keyvalue10)s0=keyvalue; while(1) keydown();xian();if(keyvalue=15)ms_10=1;f2=1;tr1=1;keyvalue=0;if(f2=1)break;/ms_10=1; if(f2=1)break; xian(); xian(); if(f2=1)break; xian(); xian(); if(f2=1)break; xian(); xian(); if(f2=1)break; xian(); void xian() min=m1*10+m0;sec=s1*10+s0;displaydata7=zxmamin/10%10;/分displaydata6=zxmamin%10;/分displaydata5=0x40; displaydata4=zxmasec/10%10; /秒 displaydata3=zxmasec%10; /秒displaydata2=0x40;displaydata1=zxmams_10/10%10; /0.01秒displaydata0=zxmams_10%10; /0.01秒digdisplay(); (7)其他还有一些比较简单的程序,如延时子程序,蜂鸣器发声子程序等,详见附录三。 4.系统调试4.1硬件调试通电调试,检查开发板是否正常,矩阵键盘按键,各个数码管是否正常工作。4.2软件调试 软件调试其实是穿插在软件设计的整个过程当中的,也是课程设计中最难同时也最重要的一步。由于是第一次做课程设计,当然软件调试中遇到了各种各样的问题:(1) 编写好程序后,发现定时器不工作,然后查找原因,发现是定时器初始化有问题,因为一开始我是分别对两个定时器初始化,这样在对第二个定时器初始化时就影响到了定时器1。(2) 对存储的时间进行回放时,发现回放显示的时间与预期的不一致,与同学讨论之后没能解决,最后联系老师问题才得以解决,原来是存储程序中存储指针计算错误,即修改1 :原来存储指针计算错误,添加 a=3*(t1-1)指针计算。(3) 秒表倒计时程序编写经过多次调试才得以成功,还有矩阵按键输入初值时,刚开始没有考虑对键值进行约束和清零,消除对后面读取键值的影响。(4) 用proteus仿真得到的部分回放结果如图12所示:当前回放至第八次计时,时间为1:02:21。图12再按一次回放键结果如图13所示:显示第七次计时,时间为1:01:01 图13 再按一次回放键结果如图14所示:显示第六次计时,时间为00:44:47图145.课程设计体会通过本次课程设计,我深刻地认识到自己有很多不足之处,比如在自主学习能力方面的不足,实际动手操作能力的不足等。 这次的微机原理课程设计是理论与实践相结合的范例。该设计从头到尾都要自己参与进来,熟悉了整个设计流程才能更快地设计出方案并完成设计,但是本次课程设计我还是也投入了大量的时间。微机原理课程早已结束,相关的知识有些已经很模糊,导致我在设计硬件电路中遇到了不少麻烦。首先由于是第一次接触课程设计,很多地方都不知从何入手。但是通过分析秒表的多种功能,我试着把每个部分模块化,把任务分解化,如晶体振荡电路,复位电路,按键电路,显示电路。完成设计后需要运用proteus软件进行设计仿真,由于这是第一次接触这个软件,还不知怎样运用它,查阅该软件的相关资料及看过网上的视频后便开始着手画图,接触后觉得还是挺简单的。从搜索资料到硬件、软件的调试,每一步、每一个细节都经过自己的思考,经过各方案的比较选择、硬件、软件的设计和调试,最终完成了多功能秒表。在做的过程中不但加深了我们对单片机理论知识的认识和理解还认识到了这门学科在应用方面的广阔前景。实践是最有高度也是最能体现整体水平的整个设计过程中,设计出了很多不一样的硬件电路图,写过了很多不一样的程序,正如设计中如何能使硬件电路图简单明了,程序简单而准确,如何能准确的运行,都是通过与同学老师的交流,慢慢摸索出来的。以上的不断探索,让我进一步熟悉和掌握单片机内部结构和工作原理,了解单片机应用系统设计的基本步骤和方法。通过利用at89c51单片机,理解单片机在自动化仪表中的作用以及掌握单片机的编程方法。通过设计一个简单的实际应用输入及显示模拟系统,掌握单片机仿真软件proteus的使用方法。 此次设计不足之处:(1)此次设计由于主要集中在秒表功能的拓展,对秒表供电这一部分没有过多的讨论,还有待补充;(2)我所能想到的秒表应该实现的功能已基本实现,其他功能还可以拓展。(3)该秒表在启动倒计时后,无法立即清零,只有在输入初值,启动倒计时后才可以对其清零,当然,这不影响秒表的使用。此次设计的这种具有存储记录,手动设置初值倒计时功能的秒表在现实生活中应用广泛,如体育项目,因此本次课程设计具有现实意义,我很开心能将知识运用到实践中并在自主学习中收获到那么多。最后,我要感谢宗伟林老师给与我的支持与帮助,里面几个问题都是请教老师才得以解决,而且老师给我提供了一些建议,让我在自己的设计上加以改进,例如将启动停止键,存储回放键合二为一,这些改进让多功能秒表更加实用完美。参考文献:1 胡汉才.单片机原理及接口技术.北京:清华大学出版社,2010.2 邓世建.微机原理与应用. 徐州:中国矿业大学出版社,2012.3 付慧生.微机原理及运用课程实验指导书.徐州:中国矿业大学出版社,2006.4 袁小平.电子技术综合设计教程.北京:机械工业出版社,2008.附录附件1:元器件清单器件数量(个)规格备注电阻3100*2、1k8pin排阻110k四位共阴极数码管1stc89c51单片机1晶振crystal112mhz用于精确定时电解电容115uf瓷片电容233pfc1 、c2单片机底座1dip40按键(sw-pb)17轻触开关pcb电路板1大于10cm*10cm万能板74ls138译码器1蜂鸣器15vnpn三极管12n2222附件2:完整程序清单 #include #define uint unsigned int#define uchar unsigned char#define gpio_key p1#define gpio_dig p0sbit lsa=p22;/定义位选sbit lsb=p23;sbit lsc=p24;sbit beep = p15 ;uchar code zxma=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /字形码 uchar displaydata8=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; uchar aa60=0,0; /存放计时 uchar a=0,b=0,t=0,t1=0,t11=0,ms_10=0,sec=0,min=0, m1=0,m0=0,s1=0,s0=0,keyvalue=0, /m1,m0,s1,s0 f1=0,f2=0,k; /t1为存储次数;f0 开始标志位;f1 停止标志位;f2 倒计时标志位; void cuncu();/存储子程序 void huifang();/回放子程序 void daojis();/倒计时子程序 void xian(); /显示 void delay(uchar i) /短延时 while(i-); void timer0configuration()tmod=0x11;/选择为定时器模式,均工作为方式1,仅用tr0,tr1打开启动。 th0=0x0d8;/给定时器0赋初值,定时100mstl0=0x0f0;th1=0x0d8;/给定时器1赋初值,定时100mstl1=0x0f0;et0=1;/打开定时器0中断允许et1=1;/打开定时器1中断允许ea=1;/打开总中断void delay10ms(unsigned int c) /延时子程序,误差 0us unsigned char a,b; for(;c0;c-) for(b=38;b0;b-) for(a=130;a0;a-); void keydown(void) /键扫描子程序unsigned int a;gpio_key=0x0f;if(gpio_key!=0x0f)delay10ms(1);if(gpio_key!=0x0f)/测试列gpio_key=0x0f;switch(gpio_key)case(0x07):keyvalue=0;break;case(0x0b):keyvalue=1;break;case(0x0d): keyvalue=2;break;case(0x0e):keyvalue=3;break;/测试行gpio_key=0xf0;switch(gpio_key)case(0x70):keyvalue=keyvalue;break;case(0xb0):keyvalue=keyvalue+4;break;case(0xd0): keyvalue=keyvalue+8;break;case(0xe0):keyvalue=keyvalue+12;break;while(a50)&(gpio_key!=0xf0) /检测按键松手检测delay10ms(1);a+;a=0;void digdisplay(void)/显示子程序unsigned char i;unsigned int j;for(i=0;i8;i+)switch(i) /位选,选择点亮的数码管,case(0):lsa=0;lsb=0;lsc=0; break;/显示第0位case(1):lsa=1;lsb=0;lsc=0; break;/显示第1位case(2):lsa=0;lsb=1;lsc=0; break;/显示第2位case(3):lsa=1;lsb=1;lsc=0; break;/显示第3位case(4):lsa=0;lsb=0;lsc=1; break;/显示第4位case(5):lsa=1;lsb=0;lsc=1; break;/显示第5位case(6):lsa=0;lsb=1;lsc=1; break;/显示第6位case(7):lsa=1;lsb=1;lsc=1; break;/显示第7位gpio_dig=displaydatai;/发送段码j=50; /扫描间隔时间设定while(j-);gpio_dig=0x00;/消隐void bee() /蜂鸣器 uchar w=10;while(w-)beep= 1;delay10ms(w);beep= 0;delay10ms(w);digdisplay(); void main() timer0configuration(); /定时器初始化 displaydata0=0x73; /上电后显示p while(1) keydown(); /键扫描 if(keyvalue=12)&(f0=0) /开始 f0=1;tr0=1;keyvalue=0; if(keyvalue=12)&(f0=1)/ 停止 tr0=0;f1=1;f0=0;keyvalue=0; if(keyvalue=13)&(f0=1) /存储 keyvalue=0;cuncu();if(keyvalue=13)&(f0=0) /回放 keyvalue=0; tr0=0;huifang(); if(keyvalue=14)keyvalue=0;f0=0;f2=0;tr0=0;tr1=0;displaydata0=0x73;/清除存储值和计时值,回到初始状态,显示pp ms_10=0,sec=0,min=0,t1=0,t11=0,keyvalue=0;for(k=0;k60;k+)aak=0;for(k=1;k99) ms_10=0;sec+; if(sec59) s

温馨提示

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

评论

0/150

提交评论