课程设计题六:秒表

发布者:快乐舞步最新更新时间:2019-09-29 来源: eefocus关键字:秒表  STC89C51  计时范围 手机看文章 扫描二维码
随时随地手机看文章

要求:


1、计时范围:0~59分59.59秒,整数四位数和小数两位数显示;


2、计时精度10毫秒;


3、复位按钮,计时器清零,并做好下次计时准备;


4、可以对两个对象(A、B)计时,具有启/停控制;


3、设开始、停止A、停止B、显示A、显示B、复位按钮。


一、Protues仿真图:

二、程序源码:

因为注释非常的全,这里就不再进行讲解了。

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

================================================================================

【平    台】STC89C51_sumjess平台

【编    写】sumjess

【E-mail  】1371129880@qq.com

【软件版本】V2.0

【最后更新】2019年06月10日

【相关信息参考下列地址】

【网    站】

           https://blog.csdn.net/qq_38351824

           http://www.51hei.com/bbs/mcu-2-1.html

---------------------------------------------------------------------------------

【dev.env.】MDK4.02及以上版本

【Target  】STC89C51

第一次修订:2019/05/09

第二次修订:2019/05/21

第三次修订:2019/06/10

【problem 】

    (1)库内补充的不全面;

    (2)库内解释部分不全面;

    (3)库内还存在一定的bug;

【direction】

      下一步的目标就是把库继续集成!

【explain 】

      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!

【warning】

      目前程序中暂无错误 !   

---------------------------------------------------------------------------------

没有完美的代码,只有不断的奉献,大家一起努力;

赠人玫瑰手留余香,欢迎大家反馈bug!

================================================================================

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

#include

#define uint unsigned int //宏定义无符号整型数据

#define uchar unsigned char //宏定义无符号字符型数据

 

sbit key1=P3^6; //开始按键

sbit key2=P3^0; //停止按键A

sbit key3=P3^1; //停止按键B

sbit key4=P3^2; //显示按键A

sbit key5=P3^3; //显示按键B

sbit key6=P3^4; //复位按键

 

sbit dula=P2^6; //段

sbit wela=P2^7; //位

 

uchar code table[]={ //0~f段码

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//中断计时变量

uchar Cntus_A=0,Cnt10ms_A=0,Cnt1s_A=0,Cnt1min_A=0;//存储A的数据

uchar Cntus_B=0,Cnt10ms_B=0,Cnt1s_B=0,Cnt1min_B=0;//存储B的数据

 

bit stop=0; //停止标志

void display(); //显示程序声明

void keyscan(); //按键扫描程序声明

/***********按键扫描程序****************/

void keyscan()

{

if(key1==0) stop=1; //开始计时

if(key6==0)     //复位计时

{

stop=0;

Cntus=0;

Cnt10ms=0;

Cnt1s=0;

Cnt1min=0;

}

if(key2==0){ //A停止,存储数据

    Cntus_A=Cntus;Cnt10ms_A=Cnt10ms;Cnt1s_A=Cnt1s;Cnt1min_A=Cnt1min;}

if(key3==0){ //B停止,存储数据

    Cntus_B=Cntus;Cnt10ms_B=Cnt10ms;Cnt1s_B=Cnt1s;Cnt1min_B=Cnt1min;}

if(stop==0){ //当复位即计时结束后,才可以进行查看

if(key4==0) //A显示

{

   Cntus=Cntus_A;Cnt10ms=Cnt10ms_A;Cnt1s=Cnt1s_A;Cnt1min=Cnt1min_A;

   }

if(key5==0)     //B显示

{

   Cntus=Cntus_B;Cnt10ms=Cnt10ms_B;Cnt1s=Cnt1s_B;Cnt1min=Cnt1min_B;

   }

  }

}

/***********定时器初始化程序****************/

void Timer0Init(void) //2.5毫秒@11.0592MHz

{

TMOD = 0x01; //设置定时器模式

TL0 = 0x00; //设置定时初值

TH0 = 0xF7; //设置定时初值

TR0 = 1; //定时器0开始计时

EA=1; //开总中断

ET0=1; //开定时器0中断

}

/***************主程序****************/

void main()

{

Timer0Init(); //定时器初始化

while(1)

{

keyscan(); //按键扫描

display(); //显示程序

}

}

/**************中断服务程序*****************/

void timer0() interrupt 1 //2.5毫秒@11.0592MHz

{

TL0 = 0x00; //设置定时初值

TH0 = 0xF7; //设置定时初值

Cntus++; //中断变量Cntus自+1

if(Cntus>=4) //10ms

{

Cntus=0; //清0

if(stop==1) //启动的前提是计时按键按下

Cnt10ms++; //10毫秒计数

if(Cnt10ms>=100)

{

Cnt10ms=0;

Cnt1s++; //秒计数

if(Cnt1s>=60)

{

Cnt1s=0;

Cnt1min++; //分计数

if(Cnt1min>=100)

Cnt1min=0;

}

}

}

}

void display()//显示程序

{

static uchar count=0; //计数变量 作用是是函数一直在循环

P0=0x00; //消隐

dula=1;

dula=0;

switch(count)

{

case 0: 

   P0=table[Cnt1min/10]; //显示十分位

   dula=1;

   dula=0;

   P0=0x7e;

   wela=1;

   wela=0;

   count++;

break;

case 1:

   P0=table[Cnt1min%10]|0x80;//显示分位加点

   dula=1;

   dula=0;

 

   P0=0x7d;

   wela=1;

   wela=0;

   count++;

break;

case 2:

   P0=table[Cnt1s/10]; //显示十秒位

   dula=1;

   dula=0;

   P0=0x7b;

   wela=1;

   wela=0;

   count++;

break;

case 3:

   P0=table[Cnt1s%10]|0x80;//显示秒个位加点

   dula=1;

   dula=0;

   P0=0x77;

   wela=1;

   wela=0;

   count++;

break;

case 4:

   P0=table[Cnt10ms/10]; //显示十分秒位

   dula=1;

   dula=0;

   P0=0xef;

   wela=1;

   wela=0;

   count++;

break;

case 5:

   P0=table[Cnt10ms%10]; //显示百分秒位

   dula=1;

   dula=0;

   P0=0xdf;

   wela=1;

   wela=0;

   count=0;

break;

}

}


关键字:秒表  STC89C51  计时范围 引用地址:课程设计题六:秒表

上一篇:课程设计题五:汽车尾灯控制器设计
下一篇:课程设计题四:LED彩灯控制器设计

推荐阅读最新更新时间:2024-11-12 19:10

MSP430实现800Hz蜂鸣器和秒表
只是一个简单的课设题目,觉得自己写的代码还将就! #include msp430.h #include stdint.h #include dr_lcdseg.h //调用段式液晶驱动头文件 int second = 0, secSum = 0, minSum = 0; int count = 0; void GPIO_init(); //按键S7为reset void P40_Onclick() { second = 0; secSum = 0; minSum = 0; } //按键S5为开始 void P42_Onclick() { TA0CTL |= MC_1; } //按键S3
[单片机]
动态扫描方法和定时器1在数码管的前三位显示出秒表
/* 用动态扫描方法和定时器1在数码管的前三位显示出秒表 */ #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uint closedu,closewe; uchar code wetable ={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar code dutable ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}
[单片机]
数码管动态扫描三种实现方法
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c51;找到数码管部分的原理图即可.这是一整个单片机开发板的电路图其他的忽略. 以下是3个程序的源码: /**********利用定时器定时50毫秒动态扫描数码管***********/ /** *功能:定时器T1实现数码管动态扫瞄123456(if) *作者:徐冉 *日期:2013-06-12-22:10 *备注:不同的方法实现显示设备的动态扫描,节约能耗 **/ /****************AT89C52-RC MCU*************/ /****************51hei开发板*************/ #include reg52.h
[单片机]
用 LCD1602 显示的秒表
给 STC89C51 安一个 LCD1602 液晶显示器。写一段程序,使得 STC89C51 有计时、显示功能。 当给 STC89C51 一个连续的高电平时,单片机开始计时,同时在显示器上显示计时的秒数; 当结束高电平时,计时停止,但是显示器上保留计时数值。 当下一个高电平来到,显示器接着上次的时间继续计时。 简单的讲就是说显示器显示几个间断的高电平持续的时间之和。 再设一个脚实现清零。 这个题目,实际上就是设计一个采用液晶显示的秒表。 LCD1602 和 51单片机的之间,如果采用常规接法,共需要 11 条线; http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/a
[单片机]
基于STC89C51单片机的出租车计费器设计
出租车计费器是出租车上必不可少的一种仪表,随着电子技术,特别是嵌入式应用技术的飞速发展,智能芯片越来越广的应用到了出租车计费器上。这使得出租车计费器能够精准的计算出行车里程及对应的价格,使乘客能够更直观明了的知道自己的乘车价格,而司机师傅也不用再靠人工计算来得出乘客的费用,避免了很多麻烦。本文以单片机STC89C51 为核心设计一款出租车计费器, 使能够实现里程及对应价格的显示,由于采用芯片的自动定时计数,所以能够准确的计算出总的行车里程并能转换成对应的价格来,这样能够避免出租车司机作弊的可能性,做到公平公正。 1 出租车计费器的设计要求与设计方案 1.1 出租车计费器设计要求 设计一个出租车自动计费器,计费包括起步价、行车里程、总
[单片机]
基于<font color='red'>STC89C51</font>单片机的出租车计费器设计
基于51单片机的数字秒表实现
//基于51单片机的八位数字秒表 //开发语言:C51 //所选芯片:AT89S51 #include reg51.h #include intrins.h #define DIG_NONE 0xff; #define DIG_1 0x7f #define DIG_2 0xbf #define DIG_3 0xdf #define DIG_4 0xef #define DIG_5 0xf7 #define DIG_6 0xfb #define DIG_7 0xfd #define DIG_8 0xfe #define LINE 0xf7//根据共阴共阳以及接法要调整 typedef unsigned char Byt
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved