历史上的今天

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

2020年09月21日 | 单片机4位数字时钟仿真程序(定时器方式2, 按键连加)

发布者:advancement4 来源: 51hei关键字:单片机  4位数字时钟  定时器方式2  按键连加 手机看文章 扫描二维码
随时随地手机看文章

学习单片机动态数码管显示,数字时钟是最好的案例,本仿真案例有以下特点。        
1.使用定时器0,方式2,可以减小定时器的误差;
2.调时、调分按键具有连加功能,与常见的按键松手检测有区别;
3.具有秒点显示功能,若制作实物案例,可购买带秒点的数码管。


参考程序:
#include
#define uint unsigned int
#define uchar unsigned char

sbit w1=P2^2;
sbit w2=P2^3;
sbit w3=P2^4;
sbit w4=P2^5;
sbit s1=P1^3;
sbit s2=P1^4;
sbit s3=P1^5;

uint shi,fen,sec;
uint num,s1num,keynum;
uchar m;
void delay(uint);
void keyscan();
void time_adj();
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共阴代码

void display()                //数码管显示
{
           w1=1;w2=1;w3=1;w4=1;
      P0=~tab[shi/10%10];
          if((s1num==2)|(shi/10%10==0)){w1=1;}
          else{w1=0;}
          delay(5);
          w1=1;
         
          if(num<2000)
           {P0=~(tab[shi%10]|0x80);        }  //秒点显示
          else
           {P0=~tab[shi%10];}
           if(s1num==2){w2=1;}
          else{w2=0;}
          delay(5);
          w2=1;
         
          P0=~tab[fen/10%10];
          if(s1num==1){w3=1;}
          else{w3=0;}
          delay(5);
          w3=1;
           
          P0=~tab[fen%10];
          if(s1num==1){w4=1;}
          else{w4=0;}
          delay(5);
          w4=1;         
}

void keyscan()               //功能键函数
{
   if(s1==0)
           {
             delay(5);                 //消抖
                 if(s1==0)
                   {
                     while(!s1)display();
                         s1num++;
                         if(s1num==3)
                           {
                             s1num=0;
                           }
                   }
           }
}

void time_adj()        //加、减键时间调整函数
{
   if(s1num!=0)
     {
           if(s2==0)
             {
                   keynum++;
                   if(keynum>18)        //连加延时
                   {
                   switch(s1num)
                             {
                                   case 1:
                                          shi++;
                                              if(shi>23)
                                                    {shi=0;}
                                                  keynum=0;
                                                  break;
                                          
                                   case 2:
                                          fen++;
                                                  if(fen>59)
                                                    {fen=0;}
                                                  keynum=0;
                                                  break;
                                 }
                         }
                 }
           if(s3==0)
             {
                   keynum++;
                   if(keynum>18)
                   {
                   switch(s1num)
                             {
                                   case 1:
                                          shi--;
                                              if(shi<0)
                                                    {shi=23;}
                                                  keynum=0;
                                                  break;
                                          
                                   case 2:
                                          fen--;
                                                  if(fen<0)
                                                    {fen=59;}
                                                  keynum=0;
                                                  break;
                                 }
                          }
                   }
        }
}

void main()
{
    shi=12;fen=0;sec=0;num=0;
    TMOD=0x02;
    TH0=0x06;
         TL0=0x06;
    EA=1;
    ET0=1;
    TR0=1;

   while(1)
   {
    keyscan();
        time_adj();
        display();

                        if(sec>59)
                        {
                                sec=0;
                                fen++;
                                if(fen>59)
                                {
                                        fen=0;
                                        shi++;
                                        if(shi>23)
                                        {
                                           shi=0;
                                        }
                                }
                                
                        }
                }
   }


void delay(uint xms)
{
   uint i,j;
   for(i=xms;i>0;i--)
      for(j=110;j>0;j--);
}

void Timer0() interrupt 1    //定时器服务
{
        num++;
        if(num==4000){num=0;sec++;}
        
}

[1] [1]
关键字:单片机  4位数字时钟  定时器方式2  按键连加 引用地址:单片机4位数字时钟仿真程序(定时器方式2, 按键连加)

上一篇:基于51单片机计算器源程序 可发送给上位机 可红外
下一篇:51单片机交流电检测程序 单相工频电参数测量仪

推荐阅读

电竞游戏市场前景看好,让周边硬件也快速发展,显示器即为最好例子。根据TrendForce旗下WitsView的报告指出,2017年电竞显示器的出货量约为250万台,年增长80%;2018年预计将再增加100万台,达到约370万台。市场如此快速成长,显示器的质量也成为购买关键,电竞人群对产品高规格的要求,让生产厂家不可忽视潜在问题风险。 USB Type-C接口应用广泛,随着搭...
用keil uvision5软件仿真时,MDK Logic Analyzer添加current logic analyzer signals时总是显示Unknown Signal?解决方法如下:Debug选项设置如下:其中Parameter的设置根据自己建立项目时选的开发板型号填写。在添加就不会出现Unknown Signal。
问题:数码管显示程序放在定时TIM2中断函数里面扫描,想要实现在关闭某一功能的时候数码管不显示。刚开始的想法是开关关闭,关闭定时器时钟;开关打开,打开定时器时钟;(但实验证明再次打开开关时定时器2却不工作:表现为数码管不显示) 解决办法:开关关闭,关闭定时器更新中断(即TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);)开关再次打开,开启定时...
由特斯拉首创的“软件定义汽车”的概念已经逐渐成为主流,并深刻地改变着汽车行业的认知。通过软件定义汽车,可以轻松提供用户改进体验,硬件标准化,广泛的服务部署,并可以持续进行更新及追踪等多项便利优势。软件定义汽车的变革,使软件与硬件解耦,允许更多公司进入汽车市场,加速汽车技术的变革。而传统的OEM及Tier1厂商,也在软件领域进行着从未有过...

史海拾趣

问答坊 | AI 解惑

行业精英策论PCB设计关键技术

基于Ansoft电磁技术的新一代PCB仿真设计     针对PCB设计人员关注的问题予以讨论,剖析PCB电磁问题的实质及处理方法,介绍Ansoft仿真解决方案的技术特点,与同类型产品的定位关系及比较,并为您展示Ansoft电磁技术及工具在国内 ...…

查看全部问答∨

兄弟们,2010年6月23日,中国足球机器人首获世界杯冠军了!

博创足球机器人助中国首获RoboCup2010中型组世界冠军                                ...…

查看全部问答∨

WINCE图像

我想将一个HBITMAP另存为一个GIF或者JPG格式的文件,在WINCE上能实现吗?好像WINCE的系统是16位的,XP系统是32位的,这有什么驱别吗?有哪位朋友有实现的方法呀?…

查看全部问答∨

关于如何学习嵌入式 高手 们进

大家好,我是一名大三的学生,学的是嵌入式方向的,但我们现在才学嵌入式操作系统,都TMD还是理论,学了等于没学,就上学期还学了个汇编,现在一学期都快过完了,感觉什么关于嵌入式方面的都没学到,如果靠下学期再来学点东西,以后出去就别想混了 ...…

查看全部问答∨

***IPCamera嵌入式开发合作,有意向者请进***

本公司(知名国企)正在寻求IPCamera(网络摄像机)的技术合作,包括嵌入式开发+硬件设计、中心 管理平台开发。有特色的产品,可提供整机、主板,或者能提供优秀的硬件方案的亦可。     合作方式多种,可技术转让、兼职或者全职。 &nb ...…

查看全部问答∨

买STN32开发板的遭遇

                                 打电话到北京英蓓特办事处问有无STN32开发板,有,兴冲冲找了一个多小时,才在边远地区找到,拿出开发板,但无ulin ...…

查看全部问答∨

EXTI的中断问题

                                 stm32例子中的EXTI中断程序的开始都有一个功能是查哪个管脚发生的,以EXTI15_10_IRQHandler为例,在程序开始的时候 ...…

查看全部问答∨

谁有STM单片机的中文汇编资料,请分享一下

                                 在官方网上找到了一个英文的,看的真累,那位大虾翻译一下,分享出来.…

查看全部问答∨

USB口防真器程序编译的问题

程序先前一直没问题,后来改程序又加了几条语句,在编译过程中就有一个错误:Code size limit exceeded(4096 code bytes)for this version of the compiler 4212bytes of CODE memory 10bytes of CONST memory(+4bytes shared) 544bytes of DATA me ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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