51单片机C编程(六、定时器时钟显示时分秒)

发布者:静逸心境最新更新时间:2015-09-25 来源: eefocus关键字:51单片机  C编程  定时器  时钟显示 手机看文章 扫描二维码
随时随地手机看文章
六位数码管显示时分秒,通过四个按键进行时间的控制。按下"调时"按键,时间显示停止;按下"选择时分秒"按键,数码管上方的发光二极管会点亮,对应着选中的要修改的时间是小时、分钟还是秒;按下"按下增加"按键,选中的时间将会增加;按下"完成"按键,时间继续显示。

已通过proteus仿真,电路图如下所示,希望大家多多指点,积极留言:

[转载]51单片机C编程(六、定时器时钟显示时分秒)

 

//编程:jumpmysoul

#include
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点)

#define LED P0     //P0为数码管的段选
#define LIGHT P1   //P1为时分秒位的指示灯
#define WS P2   //P2为数码管的位选

sbit time_change=P3^0;  //P3^0为“调时”按键
sbit time_choose=P3^1;  //P3^1为“选择时分秒”按键
sbit time_inc=P3^2;   //P3^2为“增加”按键
sbit time_ok=P3^3;   //P3^3为“完成”按键

ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位 
int choose_n;  //按下“选择时分秒”按键的次数
int flag;    //定义“调时”按键的标志位
//---------------------------------------------------------------------
void init();
void display();
void delay(int);
void time_modify();
//---------------------------------------------------------------------
void main()
{
 init(); 
 while(1)
 {
  TR0=1;
  display();
  time_modify();
 }
}
//---------------------------------------------------------------------
void init()
{
 WS=t=LIGHT=choose_n=0;
 sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
 TMOD=0x01;        //定义定时器0工作与方式1
 TH0=(65536-5536)/256;     //定时器赋初值
 TL0=(65536-5536)%256;
 EA=1;    //开总中断和T0中断
 ET0=1;
}
//--------------------------------延时子函数------------------------------------
void delay(int x)
{
    int i,j;
    for(i=x;i>0l;i--)
     for(j=255;j>0;j--);
}
//-------------------------------显示子函数---------------------------------------
void display()
{
 int i=0;

 if(TF0==1)    //如果定时器溢出
 {
  TF0=0;    //清中断标志位
  t++;
  if(t==10)
  {
   t=0;
   sec++;    //秒加1
   if(sec==60)   //如果秒为60,则清零,分加1
   {
    sec=0;
    min++;
   }
   if(min==60)    //如果分为60,则清零,时加1
   {
    min=0;
    hour++;
   }
   if(hour==24)    //如果时为24,则清零
   {
    hour=0;
   }
   }
 }
 sec_ge=sec%10;    //秒的个位和十位
 sec_shi=sec/10;
 min_ge=min%10;    //分的个位和十位
 min_shi=min/10;
 hour_ge=hour%10;   //时的个位和十位
 hour_shi=hour/10;

 WS=0x20;    //循环扫描
 LED=tab[sec_ge];
 delay(1);

 WS=0x10;
 LED=tab[sec_shi];
 delay(1);

 WS=0x08;
 LED=tab_dp[min_ge];
 delay(1);

 WS=0x04;
 LED=tab[min_shi];
 delay(1);

 WS=0x02;
 LED=tab_dp[hour_ge];
 delay(1);

 WS=0x01;
 LED=tab[hour_shi];
 delay(1); 
}
//----------------------------调时子程序-------------------------------
void time_modify()
{
     if(time_change==0)    //如果“调时”按键按下
  {
   delay(5);      //延时去抖
   if(time_change==0)
   {
    flag=1;     //标志位置1
    while(flag)    //当标志位为1时才能进行时间调整
    {
     TR0=0;   //定时器停止
     display();   //显示停止时的时间
     if(time_ok==0)   //如果“完成”按键按下
     {
         delay(15);    //延时去抖
      if(time_ok==0)
      {
       flag=0;   //标志位清零
      }
     }
     if(time_choose==0)   //如果“时分秒选择”按键按下
     {
      delay(30);   //延时去抖
      if(time_choose==0)
      {
       ++choose_n;   //按下的次数增加
       if(choose_n==4)  //如果次数达到4次
       {
        choose_n=1;  //次数清零
       }
       if(choose_n==1)  //如果次数为1,秒指示灯亮
       {
            LIGHT=0x03;
       }
       else if(choose_n==2) //如果次数为2,分指示灯亮
       {
        LIGHT=0x0c;
       }
       else if(choose_n==3)  //如果次数为3,时指示灯亮
       {
        LIGHT=0x30;
       }
       }
     }
     if(time_inc==0)      //如果“增加”按键按下
     {
      delay(30);     //延时去抖
      if(time_inc==0)
      {
       switch(choose_n)  //分支结构,根据choose_n的值来判断哪一位加1
       {
        case 1:    //如果choose_n为1,秒加1,到60清零
        {
         sec++;
         if(sec==60)
         sec=0;
         break;
        }
        case 2:      //如果choose_n为2,分加1,到60清零
        {
         min++;
         if(min==60)
         min=0;
         break;
        }
        case 3:     //如果choose_n为3,时加1,到24清零
        {
         hour++;
         if(hour==24)
         hour=0;
         break;
        }
        default:break;
       }
      }
     }
    
   }
    }
}

关键字:51单片机  C编程  定时器  时钟显示 引用地址:51单片机C编程(六、定时器时钟显示时分秒)

上一篇:51单片机C编程(五、矩阵键盘扫描加显示)
下一篇:51单片机C编程(七、5个IO口扫描10个按键)

推荐阅读最新更新时间:2024-03-16 14:33

基于C51单片机的报警产生器电路原理图
  用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器,作报警信号,要求 1KH z信号响 100ms , 500Hz 信号响 200ms, 交替进行, P1.7 接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。   ( 1 . 把 “ 单片机系统 ” 区域中的 P1.0 端口用导线连接到 “ 音频放大模块 ”区域中的 SPK IN 端口上;   ( 2 . 在 “ 音频放大模块 ” 区域中的 SPK OUT 端口上接上一个 8欧的或者是16 欧的喇叭;   ( 3 . 把 “ 单片机系统 ” 区域中的 P1.7/RD 端口用导线连接到 “四路拨动开关 ” 区域中的 K1 端口上.
[单片机]
基于C<font color='red'>51单片机</font>的报警产生器电路原理图
LPTIM低功耗定时器有哪些独特功能?
1写在前面 在早些年,可能较少听见LPTIM这个名词。随着低功耗产品需求越来越严格,MCU厂商就推出了针对低功耗应用的LPTIM定时器。 定时器是我们常见的一种外设,之所以这么常见,原因在于定时器的用途非常广泛。 在STM32所有MCU中都配有定时器,那么你有关注、对比过各系列,各型号MCU中定时器的差异吗? 2哪些STM32配有LPTIM定时器 在STM32中,相对较新推出的MCU部分型号配有LPTIM定时器。 比如:STM32F7、H7高性能MCU,STM32L0、 L4低功耗MCU,以及最新推出的G0系列中配有这种LPTIM定时器。 具体哪些MCU配有LPTIM,大家可以下载对应的数据手册查看。
[单片机]
LPTIM低功耗<font color='red'>定时器</font>有哪些独特功能?
51单片机游戏(推箱子)
一、电路设计 此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。 LCD12864显示模块 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个1616 点汉字,和128 个168 点ASCII 字符 集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4 行16×16 点 阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶 显示模块相比,不论硬
[单片机]
<font color='red'>51单片机</font>游戏(推箱子)
51单片机的串行口扩展方法设计
1 引言 在研究采场瓦斯积聚模拟试验台的过程中,笔者设计了主从式多机采控系统结构。主从式多机控制系统是实时控制系统中较为普遍的结构形式,它具有可靠性高,结构灵活等优点。当选用单串口51单片机构成这种主从式多机系统时,51单片机一方面可能要和主机Computer通信,一方面又要和下位机通信,这时就需要扩展串行通道。本文具体介绍了两种串行通道的扩展方法。 2 串行口的扩展方法 常用的标准51单片机内部仅含有一个可编程的全双工串行通信接口,具有UART的全部功能。该接口电路不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。当以此类型单片机构成分布式多级应用系统时,器件本身的串口资源就不够用了。笔者在实际开
[单片机]
AT89C51单片机的红外线遥控信号发送器电路设计
TC9012F是一种通用型红外遥控信号发送用CMOS大规模集成电路,适用于电视(TV),磁带录像机(VTR),激光唱机等设备的遥控操作。市场上,以TC9012F为核心的9012型红外遥控器被广泛使用且价格便宜。将设计的基于单片机AT89C51的9012型红外遥控解码器应用于生产即时显示系统中,作为参数设置和系统控制用红外遥控器,在实际应用中收到了良好效果。 1 红外线遥控信号发送器电路 TC9012F的遥控信号 TC9012F为4位专用微控制器,其内部振荡电路的振荡频率fosc典型值为455 kHz。当不按下操作键时,其内部455 kHz的时钟振荡器停止工作,以减少电池消耗。内部分频电路将振荡频率,fosc进行12分频后,变成
[单片机]
AT89C<font color='red'>51单片机</font>的红外线遥控信号发送器电路设计
基于51单片机的自行车测速测距程序
实物图如下: 电路原理图如下: 单片机源程序如下: #include reg52.h #include Star1602.h #define CIRCLE 2.0 //宏定义 车轮的周长(这个要根据实际的车轮进行设置) sbit Signal = P1^0; //这里的Signal表示的是霍尔传感器的信号引脚 int m_second=0; //定义变量m_second,用来记录时间(以毫秒为单位) float speed=0.0 ; //定义速度变量 float length=0.0 ;//定义路程变量 void main() { lcd_init(); //初始化液晶函数 TMOD = 0x01; //
[单片机]
基于<font color='red'>51单片机</font>的自行车测速测距程序
51单片机 4*4矩阵键盘 扫描方式
实际工程应用中,遇到按键比较多的情况,大多是使用矩阵键盘或者编码键盘。处于成本考虑,一般使用矩阵键盘。 以下是矩阵键盘部分原理图: 代码如下: #include #define uint unsigned int #define uchar unsigned char sbit duanxuan=P2^6; sbit pianxuan=P2^7; uchar code table ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //编码定义 void dela
[单片机]
C8051单片机实现多目标超声波测距的设计
超声波测距传感器以其测量精度高、响应快和价格低廉而广泛应用在工业现场测距、移动机器人导航和定位等场合。超声波测距传感器常用的方式是1 个发射头对应1 个接收头,也有多个发射头对应1 个接收头。 它们共同之处是:每个接收头只测量一个位置,这个位置就是除盲区内因发射的超声波旁瓣引起的接收信号超声波包络峰值外,第1个接收信号超声波包络峰值对应的距离。 在机器人自主导航避障时,机器人只关心最近障碍物的距离,是能够完成自主避障的。 但是在机器人定位时,尤其在动态环境下,1 个接收头同时测量多个距离,能够更多地描述环境信息,这对机器人用超声波定位具有重要意义。 1 超声波 1. 1 超声波测距原理 超声波测距原理比较简单,一般是采用时差法
[单片机]
C80<font color='red'>51单片机</font>实现多目标超声波测距的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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