99.9s秒表代码c语言
基于单片机的0~99计时秒表的设计(1)
本科毕业论文(设计)论文题目:××××××××××××××××姓名:学号:院(系、部):专业:班级:指导教师:完成时间:年月摘要本次设计内容是以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表示单片机,它像一般的逻辑功能的芯片,为了完成逻辑运算,而是把一个最小计算机系统系统整合后,集成烧录到这个芯片上,单片机像计算机一样,由运算器、控制器、输入输出设备等组成,因此相当于一个微型的计算机最小系统,但是和计算机相比,单片机缺少了外围设备等。
C语言实现秒表
源代码如下(作者:中南大学通信工程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"); }。
0-99S的秒表计时器程序与调试
设计要求: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.调试图。
单片机秒表程序代码
P2=c;P3=Ledc;
Ledc++;
if (Ledc>=8) Ledc=0;}
void readkey()
{ char c;
c=P1;
c&=0x0f;
if (c==0x0f)
{KeyDelay=10;}
else
{if (KeyDelay)
while(1)
{
KeyHandle();
CountToLeds();
CountsToLed();
}}
批注本地保存成功开通会员云端永久保存去开通
#include <string.h>
#include <stdio.h>
#include <reg51.h>
#define MAXC 5
bit isStart;
bit isLock;
bit isQuery;
unsigned int Count; //0.1s
{ KeyDelay--;}
else
{ KeyValue=c;
isKey=1;
KeyDelay=300;
} }}
void t0int() interrupt 1 //1ms
{
TH0=(-1000)>>8;
TL0=-1000;
display();
readkey();
T1msc++;
if (isStart)iLock=1;Countp2=(MAXC+Countp-1)%MAXC;
}
void KeyHandle()
秒表C语言
课程设计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章、程序的编写................................ 错误!未定义书签。
单片机数码秒表设计C语言程序
//实例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.9秒码表设计
图5.3 秒表显示模块与单片机的接口电路原理图
【项目实践】
【活动三】软件设计
1.算法设计
秒表设计需要采用比较精确的计时,可以利用MCS-51单片机内部的可 编程定时器/计数器来实现精确的计时。
① 程序实现方式 单片机的定时/计数可以采用查询方式或者中断方式来实现,本项目 采用中断方式。 ② 确定定时器工作方式 由于秒表的最小计数单位为0.1秒,而单片机的16位的定时器的最大 定时时间分别为(单片机系统的晶振为12MHz): 方式0:tmax=213*12/fosc=8192*12/(12*106)=8.192ms, 方式1:tmax=216*12/fosc=65536*12/(12*106)=65.536ms; 方式2:tmax=28*12/fosc=256*12/(12*106)=0.256ms; 可见,三种方式下的最大定时时间都不能达到秒表的最小计数单位 0.1秒,在这种状况下,为了减少中断或定时到的次数,避免响应误差或 中间重置误差,使定时更精确,选用定时时间最长的方式,即方式1。
器的33H单元; 数码管号数LEDSM定义为片内数据存储器的34H单元; DPTR为数码管字型码的基址寄存器。
《单片机应用技术》
99.9秒码表设计
《单片机应用技术》精品课程组 泸州职业技术学院机电工程系
本讲主要内容
1 教学目标 2 工作任务 3 项目实践 4 相关知识 5 能力拓展 6 项目考核
【教学目标】
1 制作一个利用单片机作为主控制器的电子秒表 2 理解定时/计数器的工作原理 3 掌握定时/计数器的工作方式及定时/计数初值的计算 4 熟悉定时/计数器的编程结构 5 掌握定时/计数器程序设计方法 6 了解定时/计数器的应用领域
【项目实践】
99秒表程序
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语言课程设计
秒表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语言数字秒表课程设计
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语言编程技能。
单片机秒表程序代码
TR0=1;ET0=1;EA=1;
while(1)
{
KeyHandle();
CountToLeds();
CountsToLed();
}}
if (isLock) c=0x40;
if (isQuery) c=0x00;
v=Counts[Countp2];
Leds[4]=v/1000+c;
Leds[5]=v/100%10+c;
Leds[6]=v/10%10+0x10+c;
Leds[7]=v%10+c;
}
void Lock()
{
Counts[Countp]=Count;
{
if (isStart) Lock();
isStart=1;
isQuery=0;
}
if (key==0x0d) isStart=0;
if (key==0x0b)
{ isStart=0;
isLock=0;
isQuery=0;
Count=0;}
if (key==0x07)
{
Countp2=(MAXC+Countp2-1)%MAXC;
if (v&0x10) c|=0x80;
if (v&0x80) c=0x00;
if ((v&0x40) && (bGlink)) c=0x00;
P2=c;P3=Ledc;
Ledc++;
if (Ledc>=8) Ledc=0;}
void readkey()
{ char c;
c=P1;
c&=0x0f;
单片机计时秒表程序方案设计书[1]
pic单片机计时秒表程序设计(时钟显示范围00.00~99.99秒,分辨度为0.01秒)作者:来源:本站原创点击数:1676 更新时间:2008年07月12日//此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒#include "p18f458.h"unsigned char s[4]。
//定义0.01 秒、0.1 秒、1秒、10秒计时器unsigned char k,data,sreg。
unsigned int i。
const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90}。
//不带小数点的显示段码表const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X1 0}。
//带小数点的显示段码表void clkint(void)。
//TMR0初始化子程序void tmint(){T0CON=0XCF。
//设定TMR0L工作于8位定时器方式//内部时钟,TMR0不用分频INTCON=0X20。
//总中断禁止,TMR0中断允许,清除TMR0的中断标志INTCON2bits.TMR0IP=1。
//TMR0中断高优先级RCONbits.IPEN=1。
//使能中断优先级}//系统其它部分初始化子程序void initial(){TRISA=0x00。
//A口设置为输出TRISB=0XF0。
//RB1输出,RB4输入TRISC=0x00。
//SDO引脚为输出,SCK引脚为输出TRISE=0x00。
//E口设置为输出SSPCON1=0x30。
//SSPEN=1。
CKP=1,FOSC/4 SSPSTA T=0xC0。
//时钟下降沿发送数据PIR1=0。
//清除SSPIF标志data=0X00。
C#实现秒表程序
C#实现秒表程序在部分效率测试的项⽬中,很多时候需要使⽤到秒表,虽然⽹上有可⽤的运⾏版本,但是加⼊不了⾃⼰的需求,于是就使⽤C#来写⼀个。
程序的逻辑很简单,就是使⽤⼀个时钟,把时间间隔设置为1。
但是当时间间隔⼩于100毫秒时,再加上程序执⾏上的耗时,如果使⽤计数器来统计时间,哪时间就变得很不精确了,为了得到较为精确的计时,我们不使⽤计数器,⽽是时钟每次触发时,就使⽤当前的时间和最初的时间差,即刻度。
可以使⽤Stopwatch类,本程序使⽤的是取系统的当前时间。
实现⽚断:System.Windows.Forms.Timer m_Timer = new Timer();m_Timer.Interval = 1;在Timer的Tick事件⾥的实现,使⽤TimeSpan作为时间刻度:TimeSpan span = DateTime.Now - m_StartTime;DateTime n = new DateTime(span.Ticks);lblTime.Text = n.ToString("HH:mm:ss:fff");这样就算Tick的触发不是很准确,但也不影响计算的时间间隔。
在程序实现屏幕截图:Image img = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);Graphics g = Graphics.FromImage(img);g.CopyFromScreen(new Point(0, 0), new Point(0, 0), img.Size);g.Dispose();Clipboard.SetDataObject(img, false);其他的细节就不再细述了,使⽤都⾃⼰完成,所以也不上传原码了。
单片机计时秒表程序设计
pic单片机计时秒表程序设计(时钟显示X围00.00~99.99秒,分辨度为0.01秒)来源:本站原创点击数:1676 更新时间:2008年07月12日//此程序实现计时秒表功能,时钟显示X围00.00~99.99秒,分辨度:0.01秒#include "p18f458.h"unsigned char s[4]; //定义0.01 秒、0.1 秒、1秒、10秒计时器unsigned char k,data,sreg;unsigned int i;const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//不带小数点的显示段码表const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};//带小数点的显示段码表void clkint(void);//TMR0初始化子程序void tmint(){T0CON=0XCF; //设定TMR0L工作于8位定时器方式//内部时钟,TMR0不用分频INTCON=0X20; //总中断制止,TMR0中断允许,去除TMR0的中断标志INTCON2bits.TMR0IP=1; //TMR0中断高优先级RCONbits.IPEN=1; //使能中断优先级}//系统其它局部初始化子程序void initial(){TRISA=0x00; //A口设置为输出TRISB=0XF0; //RB1输出,RB4输入TRISC=0x00; //SDO引脚为输出,SCK引脚为输出TRISE=0x00; //E口设置为输出SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4 SSPSTAT=0xC0; //时钟下降沿发送数据PIR1=0; //去除SSPIF标志data=0X00; //待显示的存放器赋初值PORTBbits.RB1=0;PORTAbits.RA3=0;PORTE=0; //将K1,K2,K3,K4四条列线置0 }//SPI传输数据子程序void SPILED(char data){SSPBUF=data; //启动发送do{;}while(PIR1bits.SSPIF==0);PIR1bits.SSPIF=0;}//显示子程序,显示4位数void dispaly(){PORTAbits.RA5=0; //准备锁存for(k=0;k<4;k++){data=s[k];if(k==2) data=table0[data]; //个位需要显示小数点else data=table[data];SPILED(data); //发送显示段码}for(k=0;k<4;k++){data=0xFF;SPILED(data); //连续发送4个DARK,使显示好看一些}PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成}//软件延时子程序void DELAY(){for(i = 3553; --i ;)continue;}//键扫描子程序void KEYSCAN(){while(1){dispaly(); //调用一次显示子程序while(PORTBbits.RB4==0){DELAY(); //假设有键按下,那么软件延时break;}if (PORTBbits.RB4==0) break; //假设还有键按下,那么终止循环扫描,返回}}//等键松开子程序void keyrelax(){while(1){dispaly(); //调用一次显示子程序if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回}}/*高优先级中断向量*/#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void){_asmgoto clkint //跳到中断程序_endasm}//中断效劳程序#pragma code#pragma interrupt clkintvoid clkint(){TMR0=0X13; //对TMR0写入一个调整值。
C语言数码管秒表(详细)
}
}
void clr_time()
{
sec_bcd[0] = 0x0;
sec_bcd[1] = 0x0;
sec_bcd[2] = 0x0;
sec_bcd[3] = 0x0;
sec_bcd[4] = 0x0;
sec_bcd[5] = 0x0;
sec_bcd[6] = 0x0;
sec_bcd[7] = 0x0;
{
TR1 = 1;
}
else if(key_times == 2)
{
TR1 = 0;
}
else
{
clr_time();
key_times = 0;
}
}
}
void timer0() interrupt 1
//定时器0中断服务程序,用于数码管的动态扫描
// dis_index ---显示索引,用于标识当前显示的数码管和缓冲区的偏移量
C语言数码管显示秒表(51单片机)*
*数码管显示秒表,分辨率0.01s *
* K1=P1.4---控制按钮*
*第一次按下时,启动开始计时*
*第二次按下时,停止*
*第三次按下时,归零*
* *
*秒单位,寄存器与数码管对应关系: *
* *
* ---秒单位----------数码管端口----缓冲区---------计时BCD码值寄存器*
*/
#include <reg51.h>
#include <intrins.h>
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,// 0, 1, 2, 3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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; //工作模式切换至计时溢出模式}}}。