找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2599|回復(fù): 0
收起左側(cè)

實用的單片機(jī)數(shù)碼管時鐘

[復(fù)制鏈接]
ID:155811 發(fā)表于 2016-12-19 10:02 | 顯示全部樓層 |閱讀模式
  本時鐘用stc15w 系列和74hc04 加 3 個按鍵,實現(xiàn)了調(diào)整時間,定時,秒倒計時,速度 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

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

相關(guān)帖子

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表