/**************************************************************************************************

模块名称:51单片机简易秒表

模块功能:实现精确到毫秒的简易秒表

编写人员:mengkun  (http://mkblog.cn)

编写日期:2016/12/18

**************************************************************************************************/

#include

#define false 0

#define true 1

#define uchar unsigned char  //0——255

#define uint unsigned int           //0——65535

#define ulong unsigned long //0——4294967295

sbit start_key = P3^0;  //启动按钮

sbit pause_key = P3^1;  //暂停按钮

sbit reset_key = P3^2;  //重置按钮

sbit beep_key = P3^3;   //声音按钮

sbit start_led = P3^4;      //启动指示灯

sbit pause_led = P3^5;      //暂停指示灯

sbit beep_led = P3^6;       //喇叭指示灯

sbit beep = P3^7;               //喇叭

uchar disCode[10] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //数码管段码 0~9

uchar locCode[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                   //位码

void displayTime(void);  //刷新时间显示

void disPlay(uchar num, uchar loc);  //数码管、led显示函数

void Delay1ms(unsigned int n);  //延时1ms

uchar state;    //状态:0-停止,1-启动,2-暂停

ulong ms = 0;   //存储毫秒值

uchar fen = 0;  //分钟数

uchar miao; //秒数

uchar ms2;  //毫秒数的10位

bit isBeep = false; //是否开启蜂鸣器

/*******************************************************************************

* 函 数 名          : T0_INT

* 函数功能         : T0定时器中断函数10ms

* 输      入         : 无

* 输      出         : 无

*******************************************************************************/

void T0_INT(void)  interrupt 1

{

//这里不是减去10000是因为在C51单片机中,每执行一条语句需要花费 1ms 时间。减去的是误差值。

//经过测试,大概每一分钟还是会有 0.8 s的误差……

//实际的秒表还是得专业的时钟芯片

TL0= (65536-9000)/256;

TH0= (65536-9000)%256;

ms ++;

}

/*******************************************************************************

* 函 数 名          : main

* 函数功能         : 主函数

* 输      入         : 无

* 输      出         : 无

*******************************************************************************/

void main(void)

{

TMOD=0x61; //0110 0001  //方式一

TL0= (65536-10000)/256;     // 10ms

TH0= (65536-10000)%256;

TR0=1;      //开启T0

//ET0=1;        //T0中断允许(要在点击了启动按钮在开启,所以这里不需要开启)

EA=1;   //总中断开启

//以下指示灯一开始都应该是灭的

start_led = 0;      //启动指示灯

pause_led = 0;      //暂停指示灯

beep_led = 0;       //喇叭指示灯

while(1)

{

displayTime();   //刷新时间显示

//检测启动、停止按钮

if(start_key == 0)   //按下了启动、停止按钮

{

Delay1ms(10);   //延时消抖

if(start_key == 0)

{

if(state == 0)//之前是未启动,按了按钮要变成已启动

{

state = 1;  //更新状态为已启动

ms = 0;     //毫秒数归零

fen = 0;    //分钟数归零

ET0 = 1;        //T0中断允许打开,开始计时

start_led = 1;  //启动led指示灯亮

}else{

state = 0;      //更新状态为未启动

ET0 = 0;        //关闭T0中断,停止计时

start_led = 0;  //启动led指示灯灭

pause_led = 0;  //暂停指示灯灭

}

while(start_key == 0) displayTime();    //防止按键重复检测

}

}

//检测暂停按钮

if(state != 0 && pause_key == 0)    //已启动计时,并且暂停按钮按下

{

Delay1ms(10);   //延时消抖

if(pause_key == 0)

{

if(state == 2)  //之前是暂停,现在要启动

{

state = 1;      //更新状态为已启动

pause_led = 0;  //暂停指示灯灭

ET0 = 1;        //打开T0中断允许,恢复计时

}else{

state = 2;

pause_led = 1;  //暂停指示灯亮起

ET0 = 0;        //关闭T0定时器,暂停计时

}

while(pause_key == 0) displayTime();    //防止按键重复检测

}

}

//检测归零按钮

if(state == 0 && reset_key == 0)    //已停止计时,并且归零按钮按下

{

Delay1ms(10);   //延时消抖

if(reset_key == 0)

{

ms = 0;     //毫秒数归零

fen = 0;    //分钟数归零

while(reset_key == 0) displayTime();    //防止按键重复检测

}

}

//检测声音按钮

if(beep_key == 0)   //归零按钮按下

{

Delay1ms(10);   //延时消抖

if(beep_key == 0)

{

isBeep = ~isBeep;   //取反,原来是开启的,变为关闭。原来是关闭的则变为开启

beep_led = isBeep;  //更新声音指示灯

while(beep_key == 0) displayTime(); //防止按键重复检测

}

}

}

}

void displayTime(void)   //刷新时间显示

{

miao = ms/100 - fen*60; //秒数

ms2 = ms/10%10; //毫秒数的10位

//已启动计时,并且开启了声音     并且处于一秒刚开始的0.1秒内(即新的一秒刚刚开始)

if(state == 1 && isBeep == true && ms2

{

beep = 0;       //蜂鸣器发出响声

}else{

beep = 1;       //关闭蜂鸣器

}

if(miao >= 60)  //秒数大于60

{

miao = 0;

fen++;      //分钟数加一

}

disPlay(fen/10, 0);     //显示分钟数的十位

disPlay(fen%10, 1);  //显示分钟数的个位

disPlay(miao/10, 2);     //显示秒数的十位

disPlay(miao%10, 3);     //显示秒数的个位

disPlay(ms2, 4);            //0.1s

disPlay(ms%10, 5);   //0.01s

}

void disPlay(uchar num, uchar loc)   //数码管、led显示函数

{

P0 = 0xff;  //消除重影

P2 = locCode[loc];  //位码输出

P0 = disCode[num];  //段码输出

Delay1ms(1);    //增加显示时间,防止显示过暗

}

/*******************************************************************************

* 函 数 名          : Delay1ms (多个)

* 函数功能         : 延时函数,延时n*1ms

* 输      入         : n-延时次数

* 输      出         : 无

*******************************************************************************/

void Delay1ms(unsigned int n)

{

unsigned char i, j;

for (; n>0; n--)

for(i=0;i<10;i++)

for(j=0;j<33;j++);

}

51单片机秒表设计c语言版,51单片机秒表系统的设计相关推荐

  1. 独立键盘控制风火轮c语言,单片机项目教程--C语言版(十二五)(高职高专)...

    单片机项目教程--C语言版(十二五)(高职高专) 作 者:周坚 编著 出版时间:2013年03月 定 价:26.00 I S B N :9787811247817 所属分类: 大中专教材 &n ...

  2. 重言式判别c语言中文网,重言式判别 重言式判别源码及课程设计 c语言版.doc

    重言式判别 重言式判别源码及课程设计 c语言版 重言式的判别 题目: 一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式:反之,如果对于其变元的任一种取值都为假,则称为矛盾式:然而,更多的情 ...

  3. 基于单片机的智能台灯 灯光控制系统人体感应楼梯灯系统的设计与实现

    功能介绍 以STM32单片机作为主控系统: 主通过光敏采集当前光线强度: 通过PMW灯光调节电路,我们可以根据不同的光线亮度,进行3挡调节: 通过人体红外检测当前是否有人: 通过不同光线情况下使用PW ...

  4. 数据结构与算法课程设计——C语言《职员薪资查询系统》

    数据结构与算法课程设计--C语言<职员薪资查询系统> 温馨提示:课设要自己去操作,自己写代码,可以借鉴他人代码,学习思路和一些操作,切不可完全抄袭!!! 总体说明:设计一个职员薪资查询系统 ...

  5. c语言点餐系统毕业设计任务书,毕业设计(论文)-基于c语言的智能点餐系统的设计与实现.doc...

    综合实践(论文) 题 目 基于C语言的智能点餐系统的设计与实现 学 院 通信与电子工程学院 专业班级 学生姓名 指导教师 成 绩 2013年 月 日 continually developing an ...

  6. c语言成绩查询系统源代码,C语言版简单成绩查询系统源代码概要.doc

    C语言版简单成绩查询系统源代码概要 // // main.c // xueshengchengji // // Created by lxb on 13-9-16. // Copyright (c) ...

  7. 基于android的视频采集系统的设计与实现,基于Android的视频通话系统的设计与实现.docx...

    基于Android的视频通话系统的设计与实现 基于Android的视频通话系统的设计与实现摘 要近年来,智能手机操作系统发展迅速,尤其是Android系统的迅猛发展已经将全球智能手机市场引领到了非常火 ...

  8. 秒表系统的设计c语言程序,51单片机秒表计时器课程设计报告(含C语言程序).doc...

    51单片机秒表计时器课程设计报告(含C语言程序) XXXXXX学院 51单片机系统设计 课程设计报告 题 目: 秒表系统设计 专业.班级: 学生姓名: 学 号: 指导教师: 分 数 : [摘要]本设计 ...

  9. 秒表系统的设计c语言程序,51单片机秒表计时器课程设计报告(含C语言程序)详细分解.doc...

    XXXXXX学院 51单片机系统设计 课程设计报告 题 目: 秒表系统设计 专业.班级: 学生姓名: 学 号: 指导教师: 分 数 : [摘要]本设计是一个秒表计时器,采用51单片机实现.电路包括以下 ...

  10. 基于51单片机的数字电压表c语言程序,基于单片机的数字电压表(全文完整版)...

    <基于单片机的数字电压表.doc>由会员分享,可免费在线阅读全文,更多与<基于单片机的数字电压表>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1 ...

最新文章

  1. 32岁健身教练转行程序员,拿到年薪76万offer
  2. L型四驱越野模型车初期磨合指南
  3. Arduino的光敏传感器和超声波测距传感器测试代码
  4. LOJ:相框(欧拉回路、分类讨论)
  5. 您应该考虑将应用程序升级到Spring 4的5个理由
  6. 定时器--STM32f4--HAL
  7. [Android]Eclipse连不上模拟器的问题[emulator-5554 disconnected]
  8. windows系统文件和dll文件
  9. 如何学习32位单片机
  10. HTML中的表单标签
  11. WordPress社交问答社区主题
  12. 弹性公网ip到底是什么意思?弹性公网ip与公网ip的区别
  13. 使用pytorch自己从头搭建一个Lenet分类器网络及其训练、检测脚本
  14. linux - 异常:安装包冲突 conflicts with
  15. ROS基础系列(七):机器人的建模与仿真(中)
  16. 物联网趣谈-我接触的第一个设备
  17. 五年后计算机专业还会吃香吗,未来5年的紧缺职业 五年后最吃香的专业有哪些?...
  18. 影响因子(Impact Factor,IF)
  19. Python 数字图片盲水印
  20. html未知错误,未知错误

热门文章

  1. arduino通过串口监视器读取一行字符
  2. grads 读取shp
  3. 简单理解匈牙利KM算法
  4. 【雷达信号处理基础】第1讲 -- 雷达系统概述
  5. 雷达信号处理基础 ch1 note1
  6. React小书没提到但是很有用的基础知识
  7. 18道kafka高频面试题哪些你还不会?(含答案和思维导图)
  8. Computational Social Science计算社会学-《Science》文章翻译
  9. 创建一个 scrapy 爬虫项目
  10. 人人商城删除后台菜单“小程序”