99.9s秒表代码c语言
- 格式:docx
- 大小:17.22 KB
- 文档页数:10
本科毕业论文(设计)论文题目:××××××××××××××××姓名:学号:院(系、部):专业:班级:指导教师:完成时间:年月摘要本次设计内容是以AT89C51单片机为核心器件,利用AT89C51和外围电路组成的计时秒表系统,计时秒表是一种先进电子计时器,较多的应用在教学器材、比赛计时等,而且采用数字显示,具有直观、方便读取、功能方便等诸多优点。
本设计是由硬件电路和软件程序两部分组成,硬件电路由AT89C51单片机、按键控制电路、数码管显示电路、晶振电路以及复位电路组成,它使用元件少,电路结构简单,功能强大;软件部分程序采用C语言程序设计,使用keil编译源程序,产生的可执行性文件能够让单片机高效快速的执行。
该设计能够充分利用单片机内部资源,通过程序利用定时器中断服务程序对计时秒表开始、暂停、清零等操作进行处理,提高单片机的工作效率。
关键字:单片机;秒表;定时器;中断服务程序AbstractThis design content is based on AT89C51 single-chip microcomputer as the core device, using the timing stopwatch system composed of AT89C51 and peripheral circuit, timing stopwatch is a kind of advanced electronic timer, more application in teaching equipment, timing, etc., and adopts digital display, its intuitive, convenient read, function, and many other advantages.This design is consists of two parts, hardware circuit and software program, the hardware circuit is controlled by AT89C51, key circuit, digital tube display circuit, crystals circuit and reset circuit, it USES less component, circuit structure is simple, powerful;Software part program using C language program design, use the keil compiler source code, can let the enforceability file microcontroller efficient and rapid execution.This design can make full use of the single chip microcomputer internal resources, through the program using the timer interrupt service routine for timing stopwatch start, pause, reset operations such as processing, improve the working efficiency of the single chip microcomputer.Key Words:Single chip microcomputer;A stopwatch;The timer;Interrupt service routine目录前言 (4)1、AT89C51单片机概述 (4)1.1、AT89C51单片机简介 (4)1.2、AT89C51主要特性及管脚说明 (5)2、硬件电路的设计 (6)2.1、设计要求 (6)2.2、总体方案的设计 (7)2.3、总体电路设计 (7)2.4、晶振电路、复位电路及按键电路 (8)2.5、数码管显示电路的设计 (9)2.5.1、数码管的结构及工作原理 (9)2.5.2、数码管的编码方式及段码表 (9)2.5.3、数码管的显示方式 (10)3、软件设计 (10)3.1、设计思想 (10)3.2、程序流程图 (10)3.3、源程序代码 (11)4、结论 (13)5、参考文献 (13)6、谢辞 (14)前言单片微计算机又称单片微控制器,是目前市面上最常用的嵌入式处理器,通称单片机,单片机芯片常用英文字母MCU表示单片机,它像一般的逻辑功能的芯片,为了完成逻辑运算,而是把一个最小计算机系统系统整合后,集成烧录到这个芯片上,单片机像计算机一样,由运算器、控制器、输入输出设备等组成,因此相当于一个微型的计算机最小系统,但是和计算机相比,单片机缺少了外围设备等。
源代码如下(作者:中南大学通信工程1602肖涛,qq:2391527690)#include<stdio.h>#include<conio.h>//_kbhit#include<windows.h>#include<stdlib.h>struct t{intho,mi,se;}ti;struct t carry(struct t sj){ sj.se++;if(sj.se==60){sj.se=0;sj.mi++;}if(sj.mi==60){sj.mi=0;sj.ho++;}if(sj.ho==24)sj.ho=0;return(sj);}void showtime(struct t sj){system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t");printf("秒表显示器:");if(sj.se<10&&sj.ho<10&&sj.mi<10)//控制计时时时间显示格式printf("0%d:0%d:0%d\n",sj.ho,sj.mi,sj.se);if(sj.se>=10&&sj.ho<10&&sj.mi<10)printf("0%d:0%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se<10&&sj.mi>=10&&sj.se<10)printf("0%d:%d:0%d\n",sj.ho,sj.mi,sj.se);if(sj.se<10&&sj.mi<10&&sj.ho>=10)printf("0%d:0%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se>=10&&sj.mi>=10&&sj.ho<10)printf("0%d:%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se>=10&&sj.mi<10&&sj.ho>=10)printf("%d:0%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se<10&&sj.mi>=10&&sj.ho>=10)printf("%d:%d:0%d\n",sj.ho,sj.mi,sj.se);if(sj.ho>=10&&sj.mi>=10&&sj.se>=10)printf("%d:%d:%d\n",sj.ho,sj.mi,sj.se);}void main (){char m,n;ti.ho=ti.mi=ti.se=0;printf("\t*************************************************\n");printf("\t\t 欢迎使用秒表功能\n");printf("\t\t操作提示:第一次按回车开始计时!\n");printf("\t\t按z暂停,第二次按回车结束秒表程序\n");while(1){m=getch();if(m!='\r')//读入一个输入,如果是回车,跳出while printf("\t\t输入错误,仅能输入回车!\n");elsebreak;}printf("\t\t已经开始计时,但你可以输入'z'来暂停计时\n");while(1){if(_kbhit())//判断是否键入字符{m=getch();if(m=='\r')break;if(m!='\r'&&m!='z')printf("\n输入错误,仅支持回车或'z'\n");if(m=='z'){system("cls");printf("当前时间:");if(ti.se<10&&ti.mi<10&&ti.ho<10)printf("0%d:0%d:0%d\n",ti.ho,ti.mi,ti.se);if(ti.se>=10&&ti.ho<10&&ti.mi<10)//控制暂停时时间显示格式printf("0%d:0%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se<10&&ti.mi>=10&&ti.se<10)printf("0%d:%d:0%d\n",ti.ho,ti.mi,ti.se);if(ti.se<10&&ti.mi<10&&ti.ho>=10)printf("0%d:0%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se>=10&&ti.mi>=10&&ti.ho<10)printf("0%d:%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se>=10&&ti.mi<10&&ti.ho>=10)printf("%d:0%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se<10&&ti.mi>=10&&ti.ho>=10)printf("%d:%d:0%d\n",ti.ho,ti.mi,ti.se);if(ti.ho>=10&&ti.mi>=10&&ti.se>=10)printf("%d:%d:%d\n",ti.ho,ti.mi,ti.se);printf("\n按任意键继续\n");while(1){Sleep(500);if(_kbhit())//如果有输入会连续判断两个kbhit(),并把输入赋给ch,所以找个替罪羔羊n{n=getch();break;}}}}Sleep(1000);ti=carry(ti);showtime(ti);}system("cls"); }。
设计要求:1.设计一个秒表/计时器系统,显示时间为00.00~99.99秒,个位每秒自动加一。
2.设计一个按键,一上电数码管显示四个0,按一下按键秒表开始计时,按第二下秒表停止计时,保持数码管显示的值,按第三下秒表归零。
一.程序代码#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SB0=P3^0;sbit SB1=P3^1;sbit SB2=P3^2;uchar codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x80};uchar Xian[]={10,10,10,10,10,10,10,10,};uint Time=0;bit ST=0;void delayms(uint x){ uchar i;while(x--)for(i=0;i<125;i++);}void main(){TMOD=0x11;TH0=(65536-2000)>>8;TL0=(65536-2000)&0xff;TH1=(65536-10000)>>8;TL1=(65536-10000)&0xff;TR1=1;ET1=1;TR0=1;ET0=1;EA=1;while(1){if(SB0==0){ST=1;}if(SB1==0){ST=0;}if(SB2==0){ ST=0;Time=0;}}}void ET_1() interrupt 1 {static uchar j=0;static uchar i=7;TH0=(65536-2000)>>8;TL0=(65536-2000)&0xff;P0=0x00;P2=j<<2|0x03;P0=smgduan[Xian[i]];j++;i--;if(j==8){j=0;i=7;}}void ET_3() interrupt 3{TH1=(65536-10000)>>8;TL1=(65536-10000)&0xff;if(ST){Time++;if(Time==9999){ST=0;}}Xian[0]=Time/1000;Xian[1]=Time/100%10;Xian[2]=11;Xian[3]=Time/10%10;Xian[4]=Time%10;}二.仿真调试图1.原理图2.调试图。
课程设计2011年3月 18 日课程单片机原理及应用课程设计题目电子秒表的设计专业班级姓名学号一、设计目的:训练学生综合运用己学课程的基本知识,独立进行单片机应用技术开发工作,掌握单片机程序设计、调试,应用电路设计、分析及调试检测。
二、设计要求:1. 应用MCS-51单片机设计电子秒表电路;2. 选用4位LED数码显示,计数时间0-9999s,定时时间可调;3. 硬件设计根据设计的任务选定合适的单片机,根据控制对象设计接口电路。
设计的单元电路必须有工作原理,器件的作用,分析和计算过程;4. 软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单;5. 原理图设计根据所确定的设计电路,利用Protel等有关工具软件绘制电路原理图、PCB 板图、提供元器件清单。
三、参考资料:[1] 单片微型计算机与接口技术,李群芳、黄建编著,电子工业出版社;[2] 单片机原理及应用,张毅刚编著,高等教育出版社;[3] 51系列单片机及C51程序设计,王建校,杨建国等编著,科学出版社;[4] 单片机原理及接口技术,李朝青编著,北京航空航天大学出版社;完成期限2011.3.14—2011.3.18指导教师专业负责人2011年 3 月13 日目录第1章、概述...................................... 错误!未定义书签。
第2章、单片机电子秒表设计原理 (3)2.1 LED点阵屏(8*8点阵) (3)2.2 单片机以及LED数码管显示 (4)2.3 EEPROM模块时钟模块 (4)2.4串口通信 (5)2.5电源模块 (5)2.6下载线接口、蜂鸣器、按键模块 (5)第3章、项目的设计................................ 错误!未定义书签。
3.1 实验项目及要求 (6)3.1.1 项目原理及完成的功能 (6)3.1.2 模块框图 (6)3.2 电路图的绘制 (7)3.1.2 元件的选取及元件功能简介 (7)3.2.2 proteus电路图及连线原因 (8)第4章、程序的编写................................ 错误!未定义书签。
//实例65:数码秒表设计#include<reg51.h> // 包含51单片机寄存器定义的头文件unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表unsigned char int_time; //记录中断次数unsigned char second; //储存秒/*********************************************************************** 函数功能:快速动态扫描延时,延时约0.6毫秒************************************************************************/ void delay(void){unsigned char i;for(i=0;i<200;i++);}/*********************************************************************** 函数功能:显示秒入口参数:k出口参数:无************************************************************************/ void DisplaySecond(unsigned char k){P2=0xfb; //P2.6引脚输出低电平,DS6点亮P0=Tab[k/10]; //显示十位delay();P2=0xf7; //P2.7引脚输出低电平,DS7点亮P0=Tab[k%10]; //显示个位delay();P2=0xff; //关闭所有数码管}void main(void) //主函数{TMOD=0x01; //使用定时器T0TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微秒//=50000微秒=50毫秒TL0=(65536-46083)%256;EA=1; //开启总中断ET0=1; //定时器T0中断允许TR0=1; //启动定时器T0开始运行int_time=0; //中断次数初始化second=0; //秒初始化while(1){DisplaySecond(second); //调用秒的显示子程序}}//********************************************************//函数功能:定时器T0的中断服务程序//*******************************************************void interserve(void ) interrupt 1 using 1{TR0=0; //关闭定时器T0int_time ++; //每来一次中断,中断次数int_time自加1if(int_time==20) //够20次中断,即1秒钟进行一次检测结果采样{int_time=0; //中断次数清0second++; //秒加1if(second==60)second =0; //秒等于60就返回0}TH0=(65536-46083)/256; //重新给计数器T0赋初值TL0=(65536-46083)%256;TR0=1; //启动定时器T0}。
99秒表程序99秒表程序--使99秒秒表在上电后,具有:开始时显示“00”;利用CPU15脚外接按键作控制;第一次按下按键后启动计时;第二次按下按键后停止计时;第三次按下按键后计时归零;最大计时为99秒。
计时误差小于0.5秒,显示稳定。
/******99 秒表*******/、/**---------------------------------最新文件信息--------------------------------------------------- 功能:99 秒表作者:单位:时间:描述:晶振11.0952MHz;数码管采用共阴;**-------------------------------------------------------------------------------------------------******************************************************************* ***********/#includereg52.h#define uint unsigned int#define uchar unsigned charuchar code table_duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f};//数码管显示0~9;/******单片机接口***********/99秒表程序--使99秒秒表在上电后,具有:开始时显示“00”;利用CPU15脚外接按键作控制;第一次按下按键后启动计时;第二次按下按键后停止计时;第三次按下按键后计时归零;最大计时为99秒。
计时误差小于0.5秒,显示稳定。
sbit key=P3^5;//按键#define duanma P0//段码#define weima P2//位码/******全局变量************/uchar miao=0;//秒uchar flag=0;//秒中间变量uchar keynum=0;//按键次数bit key_flag=0;//按键标志/*****中断初始化**********/void InitTimer0(){TMOD = 0x01;//工作方式TH0 = 0x4C;//高8 位TL0 = 0x00;//低8 位EA = 1;//总中断ET0 = 1;//允许定时器0 中断TR0 = 0;//启动定时器0}/**********延时函数**********功能:延时若干ms入口参数:t出口参数:无99秒表程序--使99秒秒表在上电后,具有:开始时显示“00”;利用CPU15脚外接按键作控制;第一次按下按键后启动计时;第二次按下按键后停止计时;第三次按下按键后计时归零;最大计时为99秒。
秒表c语言课程设计一、课程目标知识目标:1. 学生能够理解并掌握C语言中秒表实现的基本原理,包括时间处理函数的使用。
2. 学生能够运用C语言编程实现一个具有启动、停止、计时的秒表程序。
3. 学生能够掌握如何在C语言中使用循环和条件语句进行时间控制。
技能目标:1. 学生能够运用所学知识独立编写并调试一个简单的秒表程序,提高编程实践能力。
2. 学生通过课程学习,培养解决问题的能力,学会如何查阅资料和文档,掌握C语言编程技巧。
情感态度价值观目标:1. 学生在学习过程中,培养对编程的兴趣和热情,提高对计算机科学的认识和好奇心。
2. 学生能够认识到编程在实际生活中的应用价值,激发其创新意识和实践精神。
3. 学生在团队协作中,学会互相帮助、共同进步,培养良好的沟通能力和团队合作精神。
课程性质:本课程为实践性较强的课程,以C语言编程为基础,结合实际应用场景,锻炼学生的编程能力和解决问题的能力。
学生特点:学生已具备一定的C语言基础知识,具有较强的学习能力和动手实践欲望。
教学要求:结合学生特点,注重理论与实践相结合,以学生为主体,引导学生主动探索、积极实践,提高其编程能力和综合素质。
在教学过程中,关注学生的学习进度和需求,及时调整教学方法和策略,确保课程目标的实现。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容本课程教学内容主要包括以下几部分:1. C语言基础知识回顾:指针、函数、循环和条件语句等。
- 教材章节:第1章 C语言基础2. 秒表原理介绍:计时原理、时间处理函数(如gettimeofday、clock等)。
- 教材章节:第6章 时间处理函数3. 秒表程序设计:- 界面设计:命令行界面设计,包括用户操作提示、结果显示等。
- 功能实现:启动、停止、计时的功能实现,包括循环和条件语句的使用。
- 教材章节:第3章 控制语句、第4章 函数4. 编程实践与调试:- 学生独立编写秒表程序,进行调试和优化。
C语言数字秒表课程设计一、课程目标知识目标:1. 学生理解C语言中基本的时间处理函数,如延迟函数和获取系统时间函数。
2. 学生掌握如何在C语言中实现一个数字秒表的功能,包括开始、停止、暂停和重置。
3. 学生掌握运用循环和条件语句控制程序执行流程,实现秒表的计时功能。
技能目标:1. 学生能够独立编写C语言程序,实现一个简单的数字秒表。
2. 学生通过调试程序,能够解决基本的编程问题,提升问题解决能力。
3. 学生能够运用所学知识,进行程序设计,培养计算思维和编程技能。
情感态度价值观目标:1. 学生培养对编程的兴趣和热情,认识到编程在实际生活中的应用。
2. 学生通过小组合作完成任务,增强团队协作和沟通能力。
3. 学生在编程过程中,培养耐心和细心,理解失败是成功之母,勇于面对和解决问题。
分析课程性质、学生特点和教学要求:本课程设计以C语言教学为基础,结合实际应用,提高学生的编程实践能力。
针对初中年级学生,已具备一定的C语言基础,对编程有初步了解。
课程要求学生在掌握基本知识的同时,培养解决问题的能力和团队协作精神。
课程目标分解:1. 知识目标:通过讲解和示范,使学生掌握时间处理函数和程序流程控制。
2. 技能目标:通过动手实践,让学生独立编写和调试程序,实现数字秒表功能。
3. 情感态度价值观目标:在教学过程中,关注学生兴趣培养,提高合作意识和抗压能力。
二、教学内容1. C语言时间处理函数介绍:- clock()函数的使用和作用- time()函数获取系统时间2. 程序流程控制:- 循环结构(for循环、while循环)- 条件语句(if-else、switch-case)3. 数字秒表功能实现:- 开始、停止、暂停、重置功能的编写- 秒表界面设计及显示- 计时逻辑处理4. 教学大纲安排:- 第一课时:介绍C语言时间处理函数,讲解程序流程控制基础- 第二课时:分析数字秒表的实现思路,讨论秒表功能模块划分- 第三课时:讲解并示范编写数字秒表程序,强调编程规范和调试技巧- 第四课时:学生分组实践,完成数字秒表项目,进行小组内交流和评价5. 教材章节关联:- 《C语言程序设计》第三章:程序控制语句- 《C语言程序设计》第四章:函数6. 教学内容进度:- 前两课时完成基础知识讲解和功能模块划分- 后两课时完成程序编写、调试和项目展示- 期间安排课后作业,巩固所学知识,提高实践能力教学内容旨在保证科学性和系统性的同时,注重培养学生的实际操作能力,通过项目驱动的教学方法,使学生更好地掌握C语言编程技能。
#include <reg51.h>#include <intrins.h>sbit DG1 = P0^0;sbit DG2 = P0^1;sbit DG3 = P0^2;sbit START_KEY = P1^0;sbit SUSPEND_KEY = P1^1;sbit RESET_KEY = P1^2;sbit LED1 = P1^4;sbit LED2 = P1^5;sbit LED3 = P1^6;sbit LED4 = P1^7;unsigned char WorkMode = 0;#define STANDBY_MODE 0#define RECORD_MODE 1#define SUSPEND_MODE 2#define RECORDOUT_MODE 3unsigned int display_num = 0;unsigned char timeoutnum = 0;unsigned char duanxuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay2ms(void);void dev_init(void);void Timer0_init(void);void Timer0_start(void);void Timer0_stop(void);void standby_mode(void);void record_mode(void);void suspend_mode(void);void recordout_mode(void);void display(unsigned int value);void main(){dev_init();Timer0_init();while(1){switch(WorkMode){case STANDBY_MODE:standby_mode();break;case RECORD_MODE:record_mode();break;case SUSPEND_MODE:suspend_mode();break;case RECORDOUT_MODE:recordout_mode();break;default:break;}display(display_num);}}void delay2ms(void) //误差0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_(); //if Keil,require use intrins.h }void dev_init(void){DG1 = 0;DG2 = 0;DG3 = 0;LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;}void Timer0_init(void){TMOD = 0x01;TH0 = 0x3C;TL0 = 0xB0;EA = 1;}void Timer0_start(void){ET0 = 1;TR0 = 1;}void Timer0_stop(void){ET0 = 0;TR0 = 0;}void standby_mode(void){LED1 = 0;LED2 = 1;LED3 = 1;LED4 = 1;if(START_KEY == 0){timeoutnum = 0;display_num = 0;Timer0_init();Timer0_start();WorkMode = RECORD_MODE;}if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void record_mode(void){LED1 = 1;LED2 = 0;LED3 = 1;LED4 = 1;if(SUSPEND_KEY == 0){Timer0_stop();WorkMode = SUSPEND_MODE;}if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void suspend_mode(void){LED1 = 1;LED2 = 1;LED3 = 0;LED4 = 1;if(START_KEY == 0){Timer0_start();WorkMode = RECORD_MODE;}if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void recordout_mode(void){LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 0;if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void display(unsigned int value){P2 = duanxuan[value/100];DG1 = 1;delay2ms();DG1 = 0;P2 = duanxuan[(value%100)/10]+0x80;DG2 = 1;delay2ms();DG2 = 0;P2 = duanxuan[value%10];DG3 = 1;delay2ms();DG3 = 0;}void Timer0Interrupt(void) interrupt 1{TH0 = 0x3C;TL0 = 0xB0;timeoutnum++;if(timeoutnum == 2)//100ms{timeoutnum = 0;display_num++;if(display_num>=999){Timer0_stop();WorkMode = RECORDOUT_MODE;}}}#include <reg51.h>#include <intrins.h>sbit DG1 = P0^0; //位选1,数码管第一位sbit DG2 = P0^1; //位选2,数码管第二位sbit DG3 = P0^2; //位选3,数码管第三位sbit START_KEY = P1^0; //开始按键sbit SUSPEND_KEY = P1^1; //暂停按键sbit RESET_KEY = P1^2; //重置按键sbit LED1 = P1^4; //LED灯第一个sbit LED2 = P1^5; ////LED灯第二个sbit LED3 = P1^6; //LED灯第三个sbit LED4 = P1^7; //LED灯第四个unsigned char WorkMode = 0; //工作模式#define STANDBY_MODE 0 //宏定义,待机模式#define RECORD_MODE 1 //宏定义,计时模式#define SUSPEND_MODE 2 //宏定义,暂停模式#define RECORDOUT_MODE 3 //宏定义,计时超出99.9秒模式unsigned int display_num = 0; //显示的数据,如99.9秒为999unsigned char timeoutnum = 0; //定时器超时次数unsigned char duanxuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段选void delay2ms(void); //延时函数,2msvoid dev_init(void); //设备初始化void Timer0_init(void); //定时器0初始化void Timer0_start(void); //开始定时器0void Timer0_stop(void); //停止定时器0void standby_mode(void); //待机模式void record_mode(void); //计时模式void suspend_mode(void); //暂停模式void recordout_mode(void); //计时超出99.9s模式void display(unsigned int value); //数码管显示函数void main(){dev_init(); //设备初始化Timer0_init(); //定时器0初始化while(1){switch(WorkMode) //工作模式判断{case STANDBY_MODE: //待机模式standby_mode(); //待机模式工作break;case RECORD_MODE: //计时模式record_mode(); //计时模式工作break;case SUSPEND_MODE: //暂停模式suspend_mode(); //暂停模式工作break;case RECORDOUT_MODE: //计时超出99.9s模式recordout_mode(); //计时超出99.9s模式工作break;default:break;}display(display_num); //数码管显示}}void delay2ms(void) //误差0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_(); //if Keil,require use intrins.h}void dev_init(void){DG1 = 0; //第一位数码管位选为0 即第一个数字不亮,下同DG2 = 0; //第二位数码管位选为0 即第一个数字不亮,下同DG3 = 0; //第三位数码管位选为0 即第一个数字不亮LED1 = 1; //第一个LED灯灭LED2 = 1; //第二个LED灯灭LED3 = 1; //第三个LED灯灭LED4 = 1; //第四个LED灯灭}void Timer0_init(void){TMOD = 0x01; //模式1TH0 = 0x3C; //TH0,TL0 定时0 装值TL0 = 0xB0;EA = 1; //使能中断}void Timer0_start(void){ET0 = 1; //开启定时器0中断TR0 = 1; //定时器0开始计时}void Timer0_stop(void){ET0 = 0; //禁止定时器0中断TR0 = 0; //停止计时器0计时}void standby_mode(void)LED1 = 0; //第一个LED灯亮,下面三句都为灭LED2 = 1;LED3 = 1;LED4 = 1;if(START_KEY == 0) //开始计时按键按下{timeoutnum = 0; //定时器溢出次数清0display_num = 0; //显示数据清0Timer0_init(); //定时器0初始化Timer0_start(); //开始计时WorkMode = RECORD_MODE; //模式切换至计时模式}if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器0溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void record_mode(void){LED1 = 1;LED2 = 0; //第2个LED灯亮,其他三句都为灭LED3 = 1;LED4 = 1;if(SUSPEND_KEY == 0) //暂停按键按下{Timer0_stop(); //停止定时器0WorkMode = SUSPEND_MODE; //工作模式切换至暂停模式}if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器0溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void suspend_mode(void)LED1 = 1;LED2 = 1;LED3 = 0; //第3个LED灯亮,其他三句都为灭LED4 = 1;if(START_KEY == 0) //开始计时按键按下{Timer0_start(); //开始定时器0WorkMode = RECORD_MODE; //工作模式切换至计时模式}if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void recordout_mode(void){LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 0; //第4个LED灯亮,其他三句都为灭if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void display(unsigned int value){P2 = duanxuan[value/100]; //第一个数码管段选DG1 = 1; //开位选delay2ms(); //延时2msDG1 = 0; //关位选P2 = duanxuan[(value%100)/10]+0x80; //第二个数码管段选,+0x80是为了显示小数点DG2 = 1; //开位选delay2ms(); //延时2msDG2 = 0; //关位选P2 = duanxuan[value%10]; //第三个数码管段选DG3 = 1; //开位选delay2ms(); //延时2msDG3 = 0; //关位选}//定时器0中断处理函数void Timer0Interrupt(void) interrupt 1{TH0 = 0x3C; //TH0,TL0 定时0 装值TL0 = 0xB0;timeoutnum++; //超时次数加1if(timeoutnum == 2)//100ms{timeoutnum = 0; //定时器溢出次数清0display_num++; //显示数据加1if(display_num>=999) //如果显示数据大于999,即99.9s{Timer0_stop(); //停止定时器0WorkMode = RECORDOUT_MODE; //工作模式切换至计时溢出模式}}}。