找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2154|回复: 0
收起左侧

实用的单片机数码管时钟

[复制链接]
ID:155811 发表于 2016-12-19 10:02 | 显示全部楼层 |阅读模式
  本时钟用stc15w 系列和74hc04 加 3 个按键,实现了调整时间,定时,秒倒计时,速度 4个功能
下面是c 程序

#include <REG51.H>
#define USEC_SYS_CYCLE 2
#include "keybd.h"
#define uchar unsigned char
#define uint  unsigned int
#define DSP_DOT  0xfb
#define DSP_NEG  0xfe
#define DOT  0x04
#define ST_CLOCK 0
#define ST_APPOINT 1
#define ST_CNTDWN   2
#define ST_SPEED 3

#define DSPLAY_P P3
unsigned char code DSPLAY[]={0x05,0x7D,0x46,0x54,0x3C,0x94,0x84,0x5D,
                               0x04,0x14,0x0C,0xA4,0x87,0x64,0x86,0x8E}; //0-f
#define up_hour(h) hour10= h/10;\
                   hour1= h%10
#define up_minute(m) minute10= m/10;\
                   minute1= m%10
#define up_speed hour10= 0xff;\
                 if(speed< 0)  \
       hour1= DSP_NEG;\
     else  \
       hour1= 0xff;\
     minute10= DSPLAY[speed/10];\
     minute1=DSPLAY[speed%10]
  uchar msec50= 0; //50 milisecond
  uchar hour= 1, minute= 20;
  uchar secs=0;
  uchar app_hour=0, app_minute= 0;
  uchar dwn_minute= 0, dwn_sec= 0;
  char hour1,hour10;
  char minute1,minute10;
  char speed= 0;
  char state= 0;  

  
// the led display 0
  sbit com_h10= P1^3;  //the common of led bit
  sbit com_h1= P1^0;
  sbit com_m10= P1^1;
  sbit com_m1= P1^2;
  sbit btn_set= P1^7; //the set button
  sbit btn_hup= P1^5; //the hour up button
  sbit btn_mup= P1^6; //the minute up button
  sbit p_sound= P1^4;
      char abs(char x)
      {
        return (x<0 ? -x: x);
      }
      void tm0_inter() interrupt 1
      {
      TH0= 0x5b;
   TL0= 0x70+ speed;
   
   msec50++;
   
         //every 0.5 sec inteval the second DOT
         if( msec50> 10)
         {
    msec50 = 0;
   secs++;
            if(state== ST_CLOCK)
   {
      minute10^= DOT;
      minute1^= DOT;
   }
   if(secs> 18)
   {
      minute++;
      secs= 0;
      if(minute> 59)
      {
         minute= 0;
         hour++;
      hour%= 24;
      }
      if(state== ST_CLOCK)
      {
         up_hour(hour);
      up_minute(minute);
      }
   }      
   }
   
   else
   {      
     
   }        
      }
      
      void main()
   {
          TMOD= 0x01;     //set timer state,
          TH0= 0x5b;   //set counter init value: 65536- 50000us
          TL0= 0xf4;   //slow old is ed,fast old f8
   
          ET0= 1;    //enable interrupt fot timer 0.
          EA= 1;
          TR0= 1;    //timer 0 run;
     up_hour(hour);
    up_minute(minute);
          while(1)
          {      
           
      DSPLAY_P= DSPLAY[hour10];
            com_h10 = 1;
            msDelay(4);
            com_h10 = 0;
        
            DSPLAY_P= DSPLAY[hour1];
            com_h1 = 1;
            msDelay(4);
            com_h1 = 0;
   
   DSPLAY_P= DSPLAY[minute10];
            com_m10 = 1;
            msDelay(4);
            com_m10 = 0;
        
            DSPLAY_P= DSPLAY[minute1];
            com_m1 = 1;
            msDelay(4);
            com_m1 = 0;
   //the button set pressed
   KeyPress(btn_set,{
   switch (state)
   {
    case ST_CLOCK:
    {
        up_hour(hour);
     up_minute(minute);
        state= ST_APPOINT;
   
     break;
       }
    case ST_APPOINT:
    {
     up_hour(app_hour);
     up_minute(app_minute);
        state= ST_CNTDWN;
     
     break;
    }
    case ST_CNTDWN:
    {         
     up_hour(dwn_minute);
     up_minute(dwn_sec);
        if(dwn_minute && dwn_sec)
     {
       break;
     }
     else
     {
       state= ST_SPEED;
     }
     break;
    }
    case ST_SPEED:
    {
        up_speed;     
        state= ST_CLOCK;
     
     break;
    }
   
    default:
        state= ST_CLOCK;
     up_hour(hour);
     up_minute(minute);
     break;
   }
           });
     
     //the button hour up pressed
     KeyPress(btn_hup,{
   switch (state)
   {
    case ST_CLOCK:
    {
        hour++;
     if(hour> 23)
       hour= 0;
     up_hour(hour);
     break;
       }
    case ST_APPOINT:
    {
        app_hour++;
     if(app_hour> 23)
       app_hour= 0;
     up_hour(app_hour);
     break;
    }
    case ST_SPEED:
    {
        speed++;
     if(speed> 60)
       speed= 0;
     break;
    }
    case ST_CNTDWN:
    {
        dwn_minute++;
     if(dwn_minute> 59)
       dwn_minute= 0;
     break;
    }
    default:
     break;
   }
           });
     //the button minute up pressed
     KeyPress(btn_mup,{
   switch (state)
   {
    case ST_CLOCK:
    {
        minute++;
     if(minute> 59)
       minute= 0;
     up_minute(minute);
     break;
       }
    case ST_APPOINT:
    {
        app_minute++;
     if(app_minute> 59)
       app_minute= 0;
     up_minute(app_minute);
     break;
    }
    case ST_SPEED:
    {
        speed--;
     if(speed< -60)
       speed= 0;
     break;
    }
    case ST_CNTDWN:
    {
        dwn_sec++;
     if(dwn_sec> 59 )
       dwn_sec= 0;
     break;
    }
    default:
     break;
   }
           });
   }  
   }
screenshot.1.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表