您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 基于89C51单片机的秒表设计
目录1课程设计的目的2课程设计题目描述和要求2.1实验题目2.2设计指标2.3设计要求2.4增加功能2.5课程设计的难点2.6课程设计内容提要3课程设计报告内容3.1设计思路3.2设计过程3.3程序流程3.4源程序及说明3.5实验效果4心得体会基于89C51单片机的秒表设计摘要:单片机控制秒表是集于单片机技术、模拟电子技术、数字技术为一体的机电一体化高科技产品,具有功耗低,安全性高,使用方便等优点。本次设计内容为以89C51单片机为核心的秒表,并添加倒计时功能,采用单片机技术控制。设计内容以硬件电路设计和软件设计二部分来设计。利用单片机的定时器计数器定时和计数的原理,用集成电路芯片、LED数码管以及按键来设计计时器。将软、硬件有机地结合起来,使他拥有正确的计时、暂停、清零、并同时可以用数码管显示,在现实生中应用广泛。1课程设计的目的《单片机原理与应用技术》课程设计是学好本门课程的实践性教学环节,课程设计的目的就是配合本课程的教学和平时实验,以达到巩固消化课程的内容,进一步加强综合应用能力及单片机应用系统开发和设计能力的训练,启发创新思维,使之具有独立单片机产品和科研的基本技能,是以培养学生综合运用所学知识的过程,是知识转化为能力和能力转化为工程素质的重要阶段。2课程设计题目描述和要求2.1实验题目基于89C51设计秒表,可以实现计时功能,精确时间到0.01秒2.2设计指标了解80C51芯片的工作原理和工作方式,使用该芯片对LED数码管进行显示控制,实现用单片机的端口控制数码管,显示分、秒,并能用按钮实现秒表起动、停止、倒计时清零等功能,精确到1秒。要求选用定时器的工作方式,画出使用单片机控制LED数码管显示的电路图,并实现其硬件电路,并编程完成软件部分,最后调试秒表起动、停止、清零等功能。2.3设计要求(1)画出电路原理图(或仿真电路图)(2)软件编程与调试2.4增加功能增加一个复位按键(即清零),一个“暂停”和“开始”按键,增加倒计时功能,可通过按键增加分秒倒计时时间,一个倒计时“逐渐自减”按键。2.5课程设计的难点单片机电子秒表需要解决二个主要问题,一是有关单片机定时器(一个控制顺序计时,一个控制倒计时)的使用;二是如何实现LED的动态扫描显示。2.6课程设计内容提要本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片89C51、LED数码管以按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本课程设计有四个开关按键,分别有不同功能。3课程设计报告内容3.1设计思路单片机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。这里我们选择独立键盘如图3.1所示。系统硬件结构整体如图3.2所示。图3.1图3.23.2设计过程此次选用C51来编程,首先要有初始化程序,通过初始化程序,将对主程序所用到的变量、常量以及各个参数和所调用的子函数定义。其次还有显示程序、按键扫描及处理程序、时钟程序和倒计时程序,系统软件流程图图如图3.3所示。图3.3该课程设计要求进行计时并在数码管上显示时间,则可利用MCS-51系列单片机的芯片AT89C52的P3.4,P3.5,P3.6,P3.7作为按键的入口;定时器T0作为每秒减一的定时器;定时器T1作为每秒加一的定时器。其中“开电源开关及指示模块四个独立功能按键模块系统时钟模块STC89C51、RC、三个数码管显示模块始”按键当按下时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键按下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。方框图图3.4所示。图3.43.3程序流程按键功能表按键秒表功能倒计时功能按键1开始/暂停分值上加一(暂停时清零)按键2无开始/暂停按键3清零秒值上加一按键4改变功能3.4源程序及说明#includereg52.h#defineuintunsignedint#defineucharunsignedcharsbitwela=P2^7;sbitdula=P2^6;sbitkey_mode=P3^7;sbitkey1=P3^4;sbitkey2=P3^5;sbitkey3=P3^6;sbitled3=P1^2;ucharflag=1,ms,ss,mm,miao,fen;ucharaa=0,bb=0,cc=0,tt=0,dd=0,wait=0;uintshu1,shu2;ucharstore_buf[5][3]={0};ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};ucharcodetable1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//延迟函数voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voidinit()//定时器和段码位码初始化{TMOD=0x11;TH0=(65535-10000)/256;TL0=(65535-10000)%256;TH1=(65535-50000)/256;TL1=(65535-50000)%256;EA=1;ET0=1;ET1=1;dula=0;wela=0;}voidmode(void)//模式选择按键{if(key_mode==0){delay(5);if(key_mode==0){flag++;if(flag==3){flag=1;}}while(!key_mode);}}voidmabiao_key()//秒表有关按键{if(key1==0){delay(5);if(key1==0){if(wait==0)//加wait标记位是为了在回显时按开始暂停键无效,必须清零才能开始新一轮计数{TR0=~TR0;}}while(!key1);}if(key2==0){delay(5);if(key2==0){if(TR0==1){if((aa=0)&&aa5){store_buf[aa][0]=ms;store_buf[aa][1]=ss;store_buf[aa][2]=mm;aa++;}}if(TR0==0){if(aa=1){aa--;ms=store_buf[aa][0];ss=store_buf[aa][1];mm=store_buf[aa][2];}wait=1;}}while(!key2);}if(key3==0){delay(5);if(key3==0&&TR0==0)//只有在定时器不工作时才能清零,不这样的话当清零键按下并且前面有存储的数的话,存储的数不会清除{mm=0;ss=0;ms=0;wait=0;//无需清零二维数组,在回显后会自动清除}while(!key3);}}voiddaojishi_key()//倒计时有关按键,无法实现减数{if(cc==0){if(key1==0){delay(5);if(key1==0){led3=1;fen++;if(fen==60)fen=0;}while(!key1);}if(key3==0){delay(5);if(key3==0){led3=1;miao++;if(miao==60)miao=0;}while(!key3);}}if(key2==0){delay(5);if(key2==0){led3=1;if(miao!=0||fen!=0)//这里需写!=,否则的话多次按key2键后会产生错误,fen,miao数值不为0,0{TR1=~TR1;cc++;if(cc==3){cc=1;}}}while(!key2);}if(cc==2){if(key1==0){delay(5);if(key1==0){led3=1;miao=0;fen=0;cc=0;TR1=0;}while(!key1);}}}voiddisplay(uintwei,uintshu)//基本显示程序,显示某一位{wela=1;P0=table1[wei];wela=0;dula=1;P0=table[shu];delay(1);P0=0x00;dula=0;delay(1);}voidmabiao_display()//秒表显示程序{ucharshi,ge;shi=mm/10;ge=mm%10;display(0,shi);display(1,ge);display(2,16);shi=ss/10;ge=ss%10;display(3,shi);display(4,ge);display(5,16);shi=ms/10;ge=ms%10;display(6,shi);display(7,ge);}voiddaojishi_display()//倒计时显示程序{ucharshi,ge;shi=fen/10;ge=fen%10;display(1,shi);display(2,ge);display(3,16);display(4,16);shi=miao/10;ge=miao%10;display(5,shi);display(6,ge);}voidmain(){init();while(1){mode();if(flag==1)//秒表程序,具有存储回显功能{led3=1;mabiao_key();mabiao_display();}if(flag==2)//倒计时程序{led3=1;daojishi_key();daojishi_display();}}}voidtimer(void)interrupt1//秒表中断函数{TH0=(65535-10000)/256;TL0=(65535-10000)%256;ms++;if(ms==99){ms=0;ss++;if(ss==59){ss=0;mm++;if(mm==60)mm=0;}}}voiddown_timer(void)interrupt3{uchari;TH1=(65535-50000)/256;TL1=(65535-50000)%256;tt++;if(tt=20){tt=0;if(miao0)//此情况是秒数大于0的情况,不写的话初始值为1分0秒的时候下一刻秒钟会混乱miao--;if(fen0&&miao==0)//此情况是当分钟大于0而秒数等于0的情况{miao=59;fen--;}if(fen==0&&miao==0)//此情况是当分钟等于0且秒数等于0的情况{TR1=0;for(i=0;i10;i++){led3=0;delay(100);led3=1;delay(100);}cc=0;}}}3.5实验效果通过最后软件对程序的编译,组建,执行,还有最终生成.hex文件,把.hex下载到TX-1C开发板的STC89C51单片机上的最终效果图如下:(1)秒表开始/暂停功能(2)秒表复位清零功能(3)倒计时功能(分值秒值加一,开始/暂停)(4)倒计时复位清零功能4心得体会通过对本次课程的课程设计,使自己深刻的认识到自己的很多不足之处,在实际动手操作能力的不足,在进行程序编程
本文标题:基于89C51单片机的秒表设计
链接地址:https://www.777doc.com/doc-5690686 .html