单片机4位数字时钟仿真程序(定时器方式2, 按键连加)

发布者:advancement4最新更新时间:2020-09-21 来源: 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单片机交流电检测程序 单相工频电参数测量仪

推荐阅读最新更新时间:2024-11-11 11:58

51单片机学习之陆 —— 1.2 第一个c51程序(点亮流水灯)
由于学校的板子跟我买的板子有些差异,为了大家的阅读,以后的所有程序编写烧录都以老师发的板子为主。 1 事先准备   a 驱动安装,注意群中已经发了,吧板子的驱动装好哦。   b 烧写软件(烧录器) stc - isp (这里说明下,板子上的芯片是stc的,你还能看到它的型号stc89c52RC,用stc的烧写软件就可以了)    提问:什么是烧写软件?     答:就是把你写好代码(C或者是汇编)专程的 机器语言 通过一定的方式下载到单片机中。称为烧写。(就先这样简单理解吧)   c 编写软件 keil uVision 4 (我仅用它编译生成hex 文件)         notpad++ (我用它写c51的代码,然
[单片机]
51<font color='red'>单片机</font>学习之陆 —— 1.2 第一个c51程序(点亮流水灯)
用AT89C51单片机控制步进电机的汇编源程序
  下面程序完成的主要功能:实现步进电机的正反转,加速、减速;显示电机转速(转速级别)和工作状态(正转、反转、不转)。   源程序   SPEED EQU 10H ;SPEED为转速等级标志,共7级,即1~7   FX EQU 11H ;FX 为方向标志   COUNT EQU 12H ;COUNT中断次数标志   ORG 0000H   AJMP MAIN   ORG 0003H ;外部中断0入口地址,加速子程序   AJMP UP   ORG 0013H ;外部中断1入口地址,减速子程序   AJMP DOWN   ORG 000BH ;定时器0中断入口地址,控制中断次数来达到控制转速 AJMP ZDT0
[单片机]
单片机数的本质和物理现象
单片机执行指令 我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令。 那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢? 这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。 为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。 单片机数的本质
[单片机]
51单片机数组的定义方法
数组前不加 code 或 data ,则默认将数组存放在程序存储器中; code 指定数据是存储在代码区,数据是在编程的时候跟代码一起写入代码存储器,运行过程中不能改变; xdata 指定数据是存储在外部数据存储器了; data 指定数据存储在内部低128字节数据存储器里,如果变量不指定存储位置,默认就是data型,这部分存储器寻址速度最快; idata 指定数据存储在内部低256字节数据存储器里,但51只有128字节内部RAM,52才有256字节; pdata 指定数据存储在外部低256字节数据存储器里,这时候寻址用8位寄存器R0和R1,而不用16位的DPTR,寻址速度比xdata快。 单片机C语言unsigned char c
[单片机]
基于51单片机的智能垃圾桶设计
一.硬件方案 本设计主要是利用单片机设计并制作一套智能垃圾箱。要求以单片机为控制核心,通过红外传感器检测是否有人扔垃圾,并自动打开垃圾箱盖,扔完垃圾后再自动关闭。 主要由51单片机+独立按键+电机驱动模块+2个红外传感器+蜂鸣器报警模块等组成;如图: 二.设计功能 (1)两个按键分别为复位按键、手动打开垃圾桶按键。 (2)当智能垃圾桶红外线检测到有人时,将控制步进电机打开垃圾桶。 (3)如果人一直在垃圾桶旁边时,垃圾桶将一直打开,当人离开5S后,盖子将自动盖上。 (4)当桶内红外检测到垃圾满时,单片机将开启声光报警,并且自动取消打开桶盖模式,智能通过手动按键打开桶盖。 (5)当垃圾清理完时,系统将恢复自动模式。 三.设
[单片机]
基于51<font color='red'>单片机</font>的智能垃圾桶设计
单片机软件滤波方法对比
1、限幅滤波法(又称程序判断滤波法) A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效。如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B、优点:能有效克服因偶然因素引起的脉冲干扰。 C、缺点:无法抑制那种周期性的干扰,平滑度差。 2、中位值滤波法 A、方法:连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。 B、优点:能有效克服因偶然因素引起的波动干扰,对温度、液 位的变化缓慢的被测参数有良好的滤波效果。 C、缺点:对流量、速度等快速变化的参数不宜。 3、算术平均滤波法 A、方法:连
[单片机]
stm32单片机时钟理解
Systick是慢速的,一般用32k的外部晶振,用来计时Sysclk是主时钟,就是给内核以及大多数外设的那个最高72M的。HCLK是高速外设时钟,是给外部设备的,比如内存,flash SYSCLK 系统时钟,最大72MHz HCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟经过总线桥AHB--APB,通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟不过PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。PCLK2对应APB2外设。PCLK1对应APB1外设。 AHB (HCLK) 时钟 = SYSCLK = 72MHz APB2(PCLK2)时钟 = AHB时钟 =
[单片机]
AVR单片机的主要特性
AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。 AVR的主要特性 高可靠性、功能强、高速度、低功耗和低价位 , 一直是衡量单片机性能的重要指标,也是单片机占领市场、赖以生存的必要条件。 早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的 CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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