历史上的今天
返回首页

历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2019年09月29日 | 课程设计题六:秒表

2019-09-29 来源:eefocus

要求:


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;

}

}


推荐阅读

史海拾趣

FIDELIX公司的发展小趣事

2015年,中国半导体企业东芯半导体有限公司看中了FIDELIX在存储芯片领域的优势,决定对其进行收购。经过多轮谈判和协商,东芯半导体成功收购了FIDELIX 25.3%的股权,成为其第一大股东及实际控制人。这次收购不仅加强了东芯半导体在存储芯片领域的技术实力,也为FIDELIX提供了更广阔的市场和发展空间。

GMT(致新科技)公司的发展小趣事
设置完成后,选择“确认”或“保存”选项来保存设置。此时,收音机将在指定时间自动开机。
Crameda Intersys公司的发展小趣事

作为一家有社会责任感的企业,Crameda Intersys公司不仅关注自身的经济效益,还积极履行社会责任。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为社会的可持续发展做出了积极贡献。

这五个故事只是Crameda Intersys公司发展历程中的一部分,但它们足以展现出公司在电子行业中的成长轨迹和不懈追求。在未来的发展中,Crameda Intersys公司将继续以技术创新为引领,积极拓展市场渠道,培养更多优秀人才,加强质量管理和社会责任履行,为电子行业的发展贡献更多的力量。

广东爱晟电子(exsense)公司的发展小趣事

广东爱晟电子自成立以来,一直致力于NTC热敏电阻技术的研发和创新。在2010年代初,公司面临技术瓶颈,市场竞争激烈。然而,爱晟电子团队不畏艰难,通过深入研究,成功研发出具有更高精度和稳定性的NTC热敏电阻。这一技术突破迅速获得了市场的认可,公司销售额逐年攀升,奠定了在电子行业的领先地位。

EDAC公司的发展小趣事

面对数字化浪潮的冲击,ECS-D公司积极拥抱数字化转型,通过引入先进的信息技术和智能化设备,提升企业的运营效率和创新能力。公司建立了数字化管理平台,实现了生产、销售、财务等各个环节的信息化管理。同时,ECS-D公司还加强了对员工的数字化培训和教育,提升员工的数字化素养和创新能力。这些数字化转型的举措使ECS-D公司在激烈的市场竞争中保持了领先地位,也为公司的未来发展奠定了坚实的基础。

以上五个故事均以ECS公司的发展为主题,分别从不同角度描述了这些公司在电子行业中的成长历程和成功经验。这些故事旨在展示ECS公司如何通过技术创新、全球化战略、品质管理、绿色环保理念和数字化转型等方式实现持续发展和壮大。

AMRI Enterprise Co Ltd公司的发展小趣事

AMRI Enterprise Co Ltd在电子行业中崭露头角,源于其一次重大的技术突破。公司研发团队经过数年的努力,成功开发出了一款具有高效能、低功耗特点的芯片,引起了市场的广泛关注。这一技术突破不仅提升了AMRI的产品竞争力,还为公司赢得了众多合作伙伴的青睐。随着产品线的不断扩展和市场份额的逐步增加,AMRI逐渐在电子行业中站稳了脚跟。

问答坊 | AI 解惑

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?…

查看全部问答>

18B20传感器

18B20温度传感器中文资料…

查看全部问答>

电路设计技术与技巧(第二版)国外牛人Tim Williams著

国际电子大侠Tim Williams(蒂姆·威廉斯)著 内容简介 本书较全面和系统地讲述了在实际电子电路设计中常见问题和容易忽视的方方面面, 涵盖了设计产品所需是的全面知识,包括印制电路板布线和接地、有源和无源器件、模拟和数字集成电路、电源、电 ...…

查看全部问答>

【FPGA 代码】

持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel 为0,则out=a ;否则out=bendmodule阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);inpu ...…

查看全部问答>

问一个笨笨的问题

请问如何在EVC build后执行某个PC上的EXE文件. 比如,我要在build aa.exe后自动调用bb.exe. 我在post-build里设置,总是不成功.…

查看全部问答>

串口通信

我现在用RS232进行PC机和单片机的通信,在用串口调试助手的时候,发现单片机发送回来的数据是乱码,请问这是什么原因?…

查看全部问答>

地址卷绕

想问下,地址卷绕是一种什么概念啊!好像发生在运算结果上溢出和下溢出时候的!…

查看全部问答>

WINCE6.0操作系统在三星6410开发板上完美展现!--基于立宇泰ARMSYS6410开发板

精彩测评实例图片说明:1,WINCE6.0系统启动画面(进度条动态显示内核加载进程,LOGO图片可以根据客户需要免费更换);2,WINCE6.0桌面效果;3,800x480液晶屏全屏播放H.264视频流文件(采用硬件解码)4,800x480液晶屏全屏播放MPEG4(avi后缀)音视 ...…

查看全部问答>

STM32用到的TFT屏幕资料及例程.欢迎补充

既然有人需要TFT屏 资料.放假在家也没什么事.整理一下自己手头有的吧.做个抛砖引玉.希望大家能吧自己方便分享的资料都上传上传~…

查看全部问答>

Ecan通信的中断问题

       本人在一个项目中运用Ecan进行通信,在通信过程中会碰到中断故障(具体原因说不上来)。我是将Ecan设置成中断接收的(邮箱0-15设置成接收邮箱,16邮箱设置成发送邮箱),若接收到一个合理的读写命令,则返回 ...…

查看全部问答>