这里可以加学校LOGAL单片机课程设计报告院系:12级物信系班别:光信息科学与技术7班课程名称:秒表设计姓名:龚俊才欧一景学号:12104070331210407041指导老师:张涛2011.12.23目录1课程设计的目的和任务1.1单片机秒表课程设计的概述1.2课程设计思路及描述1.3课程设计任务和要求2硬件与软件的设计流程2.1系统硬件方案设计2.2软件方案设计3程序编写流程及课程设计效果3.1源程序及注释3.2原理图分析3.3课程设计效果4心得体会5相关查阅资料1.课程设计的目的和任务1.1单片机秒表课程设计的概述一、课程设计题目秒表系统设计——用STC89C52RC设计一个4位LED数码显示“秒表”,显示时间为00.00~99.99秒,每10毫秒自动加一,每1000毫秒自动加一秒。二、增加功能增加一个“复位”按键(即清零),一个“暂停”和“开始”按键。三、课程设计的难点单片机电子秒表需要解决三个主要问题,一是有关单片机定时器的使用;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程。四、课程设计内容提要本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED数码管以及课程箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本课程设计有两个开关按键:其中key1按键按下去时开始计时,即秒表开始键(同时也用作暂停键),key2按键按下去时数码管清零,复位为“00.00”.五、课程设计的意义1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。2)掌握定时器、外部中断的设置和编程原理。3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。4)该课程通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义六、课程设计仪器a)集成电路芯片8051,七段数码管,89C51单片机开发板b)MCS-51系列单片机微机仿真课程系统中的软件(Keiluvision2)。1.2课程设计思路及描述该课程设计要求进行计时并在数码管上显示时间,则可利用MCS-51系列单片机的芯片AT89C52的P3.2,P3.5作为按键的入口;定时器T1作为每0.01秒加一的定时器。其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。方框图如下图1:图1数字秒表设计导向1.3课程设计任务和要求1.3.1设计指标。了解8051芯片的的工作原理和工作方式,使用该芯片对LED数码管进行显示控制,实现用单片机的端口控制数码管,显示分、秒,并能用按钮实现秒表起动、停止、99秒、清零等功能,精确到0.01秒。要求选用定时器的工作方式,画出使用单片机控制LED数码管显示的电路图,并实现其硬件电路,并编程完成软件部分,最后调试秒表起动、停止、清零等功能。1.3.2设计要求①画出电路原理图(或仿真电路图);②软件编程与调试;③电路仿真与调试;2.软件与硬件设计开关MCS-51AT89C52RCLED显示2.1系统硬件方案设计单片机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。图2系统硬件结构框11.0592MHz晶振2个独立式的按键电源指示灯电源开关4个数码管显示STC89C52RC2.2软件方案设计此次选用C51来编程,首先要有初始化程序,通过初始化程序,将对主程序所用到的变量、常量以及各个参数和所调用的子函数定义。其次还有显示程序、按键扫描及处理程序、时钟程序和倒计时程序,系统软件流程图图如图3所示:3程序编写的流程及课程设计效果3.1源程序及注释/*-----------------------------------------------名称:数码管显示,按键控制秒表论坛:编写:shifang日期:2009.5修改:无开始系统初始化While(1)数码管显示选择按键的扫描及处理图3内容:中断按键控制,数码管显示,中断0控制计时和停止,中断1清零------------------------------------------------*/#includereg52.h//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义unsignedintmsecond,second;//定义全局变量bitGoFlag;//定义停止,计时标志#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换sbitLATCH1=P2^2;//定义锁存使能端口段锁存sbitLATCH2=P2^3;//位锁存sbitKEY=P3^2;unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsignedcharTempData[8];//存储显示值的全局变量voidDelayUs2x(unsignedchart);//函数声明voidDelayMs(unsignedchart);voidDisplay(unsignedcharFirstBit,unsignedcharNum);voidInit_Timer0(void);voidCLR(void);/*------------------------------------------------主函数------------------------------------------------*/voidmain(void){unsignedcharnum=0;EX0=1;//外部中断0开IT0=1;//IT1=0表示边沿触发EX1=1;//外部中断1开IT1=1;//IT1=1表示边沿触发Init_Timer0();while(1)//主循环{TempData[0]=dofly_DuanMa[second/10];//分解显示信息,如要显示68,则68/10=668%10=8TempData[1]=dofly_DuanMa[second%10];TempData[2]=0x40;//-TempData[3]=dofly_DuanMa[msecond/10];//分解显示信息,如要显示68,则68/10=668%10=8TempData[4]=dofly_DuanMa[msecond%10];//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;DataPort=0;//清空数据,防止有交替重影LATCH1=1;//段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit];//取位码LATCH2=1;//位锁存LATCH2=0;DataPort=TempData[i];//取显示数据,段码LATCH1=1;//段锁存LATCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响//TH0=0x00;//给定初值//TL0=0x00;EA=1;//总中断打开(总中断控制开关)ET0=1;//定时器中断打开(允许中断0的发生)TR0=1;//定时器开关打开(定时器T0开始工作)}/*------------------------------------------------定时器中断子程序------------------------------------------------*/voidTimer0_isr(void)interrupt1{staticunsignedcharnum;TH0=(65536-2000)/256;//重新赋值2msTL0=(65536-2000)%256;Display(0,8);if(GoFlag){num++;if(num==5){num=0;msecond++;if(msecond==100)//100进1{msecond=0;second++;//秒加1if(second==100)second=0;}}}}/*------------------------------------------------外部中断0程序------------------------------------------------*/voidISR_INT0(void)interrupt0{if(!KEY)//如果检测到低电平,说明按键按下{DelayMs(20);//延时去抖,一般10-20msif(!KEY)//再次确认按键是否按下,没有按下则退出{GoFlag=!GoFlag;//利用外部中断打开和关闭定时标志用于开始和停止计时}}//主循环中添加其他需要一直工作的程序}/*------------------------------------------------外部中断1程序------------------------------------------------*/voidISR_INT1(void)interrupt2{if(GoFlag==0)//停止时才可以清零CLR();}/*------------------------------------------------数值清零------------------------------------------------*/voidCLR(void){second=0;//利用外部中断清零msecond=0;}voidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart){while(t--){//大致延时1mSDelayUs2x(245)