单片机电子时钟程序

发布者:感恩的7号最新更新时间:2015-07-09 来源: 51hei关键字:单片机  电子时钟 手机看文章 扫描二维码
随时随地手机看文章



 

/********************************************************************************
   品名:电子时钟 
   功能:秒表,闹钟,日历,计数器,频率计 时钟
  作者:阿飞 
  版本:v1.4
  修改:二月调整bug  code unsigned char leab_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
             改成               code unsigned char leab_day[12]={31,29,31,30,31,30,31,31,30,31,30,31};                  
  时间:2012,8,11 
 版权所有:http://www.51hei.com 
********************************************************************************/
 #include  
sbit sh=P1^7;
sbit ds=P1^5;
sbit st=P1^6;
sbit led0  =  P1^2;
sbit led1  =  P1^3;
sbit led2  =  P1^4;
sbit led3  =  P1^1;
sbit button1 = P3^2;
sbit button2 = P3^3;
sbit button3 = P3^4;
sbit buzzer = P1^0;
sbit RCLK =   P3^7;
typedef struct 
  {
     unsigned char count;
    unsigned char sec;
  unsigned char min;
  unsigned char hou;
  unsigned char day;
  unsigned char mon;
  unsigned char year[2];
  unsigned char AlarmMin;
    unsigned char AlarmHou;
  unsigned char stopwatch[3];
  unsigned char cymometer[2];
  unsigned char cymometer_count;
  unsigned char flashcount;
  unsigned char mode;
  unsigned char delaycount;
  unsigned char ditheringcount;
  unsigned char February_day;
  }TIME;
  typedef union
  {
   struct 
 {
   unsigned char bit0:1;
   unsigned char bit1:1;
   unsigned char bit2:1;
   unsigned char bit3:1;
   unsigned char bit4:1;
      unsigned char bit5:1; 
   unsigned char bit6:1;
   unsigned char bit7:1;    
 }BIT;
  unsigned char byte; 
  }BETY_BIT;

   extern BETY_BIT BIT_FLAG,BIT_FLAG1;
   extern TIME time;
   extern void isr_button1_proces(void);
   extern void isr_button2_proces(void);
   extern void isr_button3_proces(void);

  #define menu_button1_down_1       BIT_FLAG.BIT.bit0
  #define menu_button1_down         BIT_FLAG.BIT.bit1
  #define flash_flag                BIT_FLAG.BIT.bit2
  #define flash_control             BIT_FLAG.BIT.bit3 
  #define menu_button2_down         BIT_FLAG.BIT.bit4
  #define button2_length_whack_flag BIT_FLAG.BIT.bit5
  #define Alarm_on_off    BIT_FLAG.BIT.bit6
  #define start_stopwatch      BIT_FLAG.BIT.bit7
  #define menu_button3_down         BIT_FLAG1.BIT.bit0
  #define button3_length_whack_flag BIT_FLAG1.BIT.bit1
  #define stopwatch_clear_flag   BIT_FLAG1.BIT.bit2
  //#define Alarm_on_off_display      BIT_FLAG1.BIT.bit3
  #define cymometer_start_flag  BIT_FLAG1.BIT.bit4
  #define cymometer1_start_flag  BIT_FLAG1.BIT.bit5
  #define leap_year_flag    BIT_FLAG1.BIT.bit6
  #define dithering_flag    BIT_FLAG1.BIT.bit7
  /*******************************************************[page]
               参数配置
  *******************************************************/
  #define  length_whack_ms            100//按键按下大于1000ms为长击
  #define  auto_regulator_ms        10//自动调整参数100ms一次
  #define  flash_cymometer_ms     40//调参数闪烁频率400ms一次
  #define  Alarm_switch_on_off_ms    250//按键按下大于2500ms闹钟开关切换一次
  #define  cymometer_1s                100
 
 
 
TIME time;
BETY_BIT BIT_FLAG,BIT_FLAG1;
unsigned char scanf_dat[2];
//code P_leab_led_7[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//code N_leab_led_7[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
code P_leab_led_7[10] = {0x0a,0xfa,0x4c,0x68,0xb8,0x29,0x09,0x7a,0x08,0x28};
code unsigned char leab_day[12]={31,29,31,30,31,30,31,31,30,31,30,31};
void Time_Count0_Init(void)
{
  TMOD =0x51;
  TH0=0Xd8; 
  TL0=0Xf0;
  ET0=1;
  TR0=1;
  IT0=1;
  EX0=1;
  //IT1=1;
  //EX1=1;
  //TH1=0X00;  
  TL1=0X05;
  EA=1;
}
void time_add(void)
{
   switch(time.mode)
 {
      case 2: time.min++;if(time.min>59)time.min=0;break;
      case 3: time.hou++;if(time.hou>23)time.hou=0;break;
      case 4: time.day++;if(time.mon==2&&(time.day>time.February_day))time.day=1;
                         else if(time.day>leab_day[time.mon-1])time.day=1;break;
      case 5: time.mon++;if(time.mon>59)time.mon=0;break;
      case 6: time.year[0]++;if(time.year[0]>99)time.year[0]=0;break;
      case 7: time.year[1]++;if(time.year[0]>99)time.year[1]=0;break;
      case 8: time.AlarmMin++;if(time.AlarmMin>59)time.AlarmMin=0;break;
      case 9: time.AlarmHou++;if(time.AlarmHou>59)time.AlarmHou=0;break;
 } 
}
void time_sub(void)
{
    switch(time.mode)
 {
      case 2:if(time.min>0) time.min--;else time.min=59;break;
      case 3: if(time.hou>0)time.hou--;else time.hou=23;break;
      case 4: time.day--;if(time.day<1)
                          {
                          if(time.mon==2)time.day = time.February_day;
                            else         time.day=leab_day[time.mon-1];
                          }  break;
      case 5: time.mon--;if(time.mon<1)time.mon=12;break;
      case 6: if(time.year[0]>0)time.year[0]--;else time.year[0]=99;break;
      case 7: if(time.year[0]>0)time.year[1]--;else time.year[1]=99;break;
      case 8: if(time.AlarmMin>0)time.AlarmMin--;else time.AlarmMin=59;break;
      case 9: if(time.AlarmHou>0)time.AlarmHou--;else time.AlarmHou=23;break;
 } 
}
/***************************************************
              产生十毫秒时基
****************************************************/
void timer0(void) interrupt 1 using 1
{
unsigned int temp;
TH0=0Xd8; 
TL0=0Xf0;
RCLK=~RCLK;
temp = time.year[1];
temp = temp*100;
temp += time.year[0];
if(temp%4)
{
time.February_day = 28;
//leap_year_flag=1;
}
else 
{
time.February_day = 29;
}
 /************************************
 按键一长按处理(可改为函数 在这调用)
 *************************************/
   isr_button1_proces();
  /*************************************
按键2长击判断 (可改为函数 在这调用)
*************************************/
   isr_button2_proces();
/*************************************
按键3长击判断(可改为函数 在这调用)
*************************************/
  isr_button3_proces();
  /***********************************
秒表功能 (可改为函数 在这调用)
  ************************************/
  if((time.mode ==1)&&(start_stopwatch==1))
  {
   stopwatch_clear_flag = 0;
   time.stopwatch[0]++;
   if(time.stopwatch[0]>=100)
   { 
     time.stopwatch[0] = 0;
  time.stopwatch[1]++;
   }
   if(time.stopwatch[1]>=60)
   {
     time.stopwatch[1] = 0;
  time.stopwatch[2]++;
   }
   if(time.stopwatch[2]>=60)
   time.stopwatch[2]=0;
  }
  if(stopwatch_clear_flag==1)
  {
     time.stopwatch[0] = 0;
  time.stopwatch[1] = 0;
    time.stopwatch[2] = 0;
  }
  //*计数器 (可改为函数 在这调用)
  if(cymometer_start_flag)
  {
  TR1 = 1;
   time.cymometer[1]=TH1;
 time.cymometer[0]=TL1;
  }
 //频率计 (可改为函数 在这调用)
  if(cymometer1_start_flag)
  {
   TR1 = 1;
   time.cymometer_count--;
   if(time.cymometer_count==0)
   {
    TR1 = 0;
    time.cymometer[1]=TH1;
 time.cymometer[0]=TL1;
 time.cymometer_count=cymometer_1s;
 TH1=TL1=0;
   }
  } 

/*******************************
调参数闪烁处理 (可改为函数 在这调用)
*******************************/
 if((time.mode>1)&&(time.mode<10))
 {
     time.flashcount++;
  if(time.flashcount>flash_cymometer_ms)
  {
    time.flashcount = 0;
    flash_control = ~flash_control;
  }
  }
  else flash_control = 0;
 /***********************************
  时间产生 (可改为函数 在这调用)
 ************************************/
  time.count++;
  if( time.count>=100)
  {
    time.count = 0;
 time.sec ++;
  }
  if(time.sec>=60)
  {
   time.sec = 0;
 time.min ++;
  }
  if(time.min>=60)
  {
   time.min = 0;
 time.hou ++;
  }
  if(time.hou>23)
  {
   time.hou = 0;
 time.day ++;
  }
  if(time.mon==2)
  {
 if((time.day>time.February_day))
    {
     time.day = 1;
      time.mon ++;
    }
  }
  else
  {
  if((time.day>leab_day[time.mon-1]))
  {
    time.day = 1;
 time.mon ++;
   } 
  }
  if(time.mon>12)
  {
   time.mon = 1;
   time.year[0]++;
  }
  if(time.year[0]>99)
  time.year[1]++;
}
/************************************************
          按键一中断处理函数
*************************************************/
void ext_inter0(void) interrupt 0 using 3
{
  //if(time.mode==0)
  time.ditheringcount = 100;
  menu_button1_down = 1;   
 /* if(time.mode==1){time.mode =0;flash_flag=0;}
  if ((time.mode<10)&&(time.mode>1))
  {
    time.mode++;
 time.flashcount = 0;
  }
  else 
   {
     time.mode = 0;
  flash_flag = 0;
   }
   menu_button2_down = 0;*/
}
 /**
 /************************************
 按键一长按处理
 *************************************/
void isr_button1_proces(void)
{
if(menu_button1_down_1 ==1)
 {
  if(button1==0)
    {
        time.delaycount--;
     if(time.delaycount==0)
         {
          time.delaycount = 0;
       time.mode = 2;
       menu_button1_down_1 = 0;
         }
      }
   else
     {
        time.delaycount = 0;
     time.mode = 1;
     menu_button1_down_1 = 0;
    
  }
  }
  /************************************************
             消抖部分 (10~20ms)
  ************************************************/
 if(menu_button1_down==1)
 {
  time.ditheringcount--;
 if(time.ditheringcount==98)
  {    if(button1==0)
      {
       if(time.mode==0){menu_button1_down_1=1;time.delaycount = length_whack_ms;}
      else if(time.mode==1){time.mode =0;}
   else if ((time.mode<10))
           {
             time.mode++;
          time.flashcount = 0;
   menu_button1_down_1=0;
          }
        else 
         {
           time.mode = 0;
        flash_flag = 0;
           }
         menu_button2_down = 0; 
   menu_button1_down=0;
     }  
   }
  }
}
/************************************************
         按键二中断处理函数
************************************************/
/*void ext_inter1(void) interrupt 2 using 2  
{
   menu_button2_down = 1;
   time.delaycount =length_whack_ms;  */
   /*if(time.mode==1) start_stopwatch = ~start_stopwatch ;
   if(time.mode==10)cymometer_start_flag =~cymometer_start_flag;
   time_add();*/
//}
/************************************************
         处理函数
************************************************/
void button2_proces(void)
 {
  if((menu_button2_down==0)&&(button2==0))
  {
  menu_button2_down = 1; 
    time.delaycount =length_whack_ms;
  }
 }
 /************************************
 按键二长按处理
 *************************************/
void isr_button2_proces(void)
{
 
if(menu_button2_down==1)
   {
   if(button2==0)
    {
        time.delaycount--;  
 if(time.delaycount==length_whack_ms-2)//消抖部分 (10~20ms)
  {
  if(time.mode==1) start_stopwatch = ~start_stopwatch ;
        if(time.mode==10)
        {
         cymometer_start_flag =~cymometer_start_flag; 
         TL1 = 0;
         TH1 = 0;
         cymometer1_start_flag=0;
        }
        time_add();
  }
     if(time.delaycount==0)
         {
          time.delaycount = auto_regulator_ms;
       button2_length_whack_flag = 1;
     //  menu_button2_down = 0;
         }
      }
   else
     {
     menu_button2_down = 0;
        time.delaycount = auto_regulator_ms;
     button2_length_whack_flag = 0;
    }
   
   }
  if(button2_length_whack_flag)
  {
   if(time.mode>1)
   {
     button2_length_whack_flag = 0;
  time_add();
 TR1 =0;
 time.cymometer[0]=0;
 TH1=0;
 time.cymometer[1]=0;
 TL1=0;
 cymometer_start_flag =0;
 }
  }

}
/************************************************
         按键三处理函数
************************************************/
void button3_proces(void)
 {
  if((menu_button3_down==0)&&(button3==0))
  {
  menu_button3_down = 1; 
    time.delaycount =length_whack_ms;
  }
 }
  /************************************
 按键三长按处理
 *************************************/
 void isr_button3_proces(void)
 {
  if(menu_button3_down==1)
   {
   if(button3==0)
    {
        time.delaycount--;
 if(time.delaycount==length_whack_ms-2) //消抖部分 (10~20ms)
  {
         if(time.mode==1) stopwatch_clear_flag = 1;
     if(time.mode==10){cymometer1_start_flag=1;time.cymometer_count =cymometer_1s;        
         TL1 = 0;
         TH1 = 0;
          start_stopwatch = 0;
          }
         time_sub();
  }
     if(time.delaycount==0)
         {
          time.delaycount = auto_regulator_ms;
       button3_length_whack_flag = 1;
     //  menu_button2_down = 0;
         }
      }
   else
     {
     menu_button3_down = 0;
        time.delaycount = auto_regulator_ms;
     button3_length_whack_flag = 0;
    }
   
   }
  if(button3_length_whack_flag)
  {
   if(time.mode>1)
   {
     button3_length_whack_flag = 0;
  time_sub();
 TR1 =0;
 time.cymometer[0]=0;
 TH1=0;
 time.cymometer[1]=0;
 TL1=0;
 cymometer1_start_flag =0;
 }
  }
 
 }[page]
/*****************************************************
             数码驱动部分
*****************************************************/
 void delay(unsigned char z)
  {
   unsigned char x,y;
   for(x=0;x     {y = 100;
   while(--y);}
  }
/****************************************************
            595  驱动
****************************************************/
void _74hc595(unsigned char dat)
{
 unsigned char n;
  sh=0;
  st=0;
  for(n=0;n<8;n++)
  {
    if(dat&0x80)ds=1;
    else ds=0;
 sh=1;
 dat<<=1;
 sh=0;
  }
  st=1;
}
/******************************************************
          扫描部分 
******************************************************/
void sanf_display(void)
{
 static unsigned  char n;
 unsigned char scanf_dat_temp[4];
  if((menu_button2_down ==1)&&(time.mode==0))
 {
      if(button2_length_whack_flag)
    {
      Alarm_on_off = ~Alarm_on_off;
     button2_length_whack_flag = 0;
   time.delaycount = Alarm_switch_on_off_ms;
    }
     scanf_dat[0] = time.AlarmHou;
     scanf_dat[1] = time.AlarmMin;
//  Alarm_on_off_display = 1; 
 }
// else  Alarm_on_off_display = 0; 
if((menu_button3_down ==1)&&(time.mode==0))
    {
        scanf_dat[0] = time.mon;
         scanf_dat[1] = time.day;
    }
 scanf_dat_temp[0] =  P_leab_led_7[scanf_dat[0]/10];
 scanf_dat_temp[1] =  P_leab_led_7[scanf_dat[0]%10];
 scanf_dat_temp[2] =  P_leab_led_7[scanf_dat[1]/10];
 scanf_dat_temp[3] =  P_leab_led_7[scanf_dat[1]%10];
// if(Alarm_on_off_display)
// {
   if(Alarm_on_off)
   {
     //scanf_dat_temp[0] &= 0x7f;
     //scanf_dat_temp[1] &= 0x7f;
     //scanf_dat_temp[2] &= 0x7f;
      scanf_dat_temp[3] &= 0xf7;
  // }
 }
 if(time.count>=50&&time.mode==0&&menu_button3_down ==0&&menu_button2_down ==0)scanf_dat_temp[1] &= 0xf7;
  if(menu_button2_down||menu_button3_down)  flash_control = 0;  
  if(flash_control)
    {
      if(time.mode&0x01){scanf_dat_temp[0] = 0xff;  scanf_dat_temp[1] = 0xff;}
   else            {scanf_dat_temp[2] = 0xff;  scanf_dat_temp[3] = 0xff;}
    }
  for(n=0 ;n<4;n++)
  { 
    _74hc595( scanf_dat_temp[n]);
    switch(n)
 {
   case   0:led0=1;led1=0; led2=0; led3=0;break;
   case   1:led0=0;led1=1; led2=0; led3=0;break;
   case   2:led0=0;led1=0; led2=1; led3=0;break;
   case   3:led0=0;led1=0; led2=0; led3=1;break;
   default :led0=0;led1=0; led2=0; led3=0;break; 
 }
    delay(5);
    _74hc595(0xff);
    led0  =  0;  led1  =  0; led2  =  0; led3  =  0;
  delay(1);
    }
}
/**********************************************************
                           加载显存
**********************************************************/
void proces_start(void)
{
unsigned char temp[6];
unsigned int dattemp;
if(time.mode==0) //时间显示 
        {
         scanf_dat[0] = time.hou;
         scanf_dat[1] = time.min;
   } 
else if(time.mode==1)//秒表显示 
       {
      if(time.stopwatch[2]>0)
   {
   scanf_dat[0] = time.stopwatch[2];
         scanf_dat[1] = time.stopwatch[1];
   }
   else
   {
   scanf_dat[0] = time.stopwatch[1];
         scanf_dat[1] = time.stopwatch[0];
   }
    } 
else if(time.mode<4)//
      {
     scanf_dat[0] = time.hou;
         scanf_dat[1] = time.min;
  }
else if(time.mode<6)
      {
     scanf_dat[0] = time.mon;
         scanf_dat[1] = time.day;
  }
else if(time.mode<8)
      {
      scanf_dat[0] = time.year[1];
         scanf_dat[1] = time.year[0];
  }
else if(time.mode<10)
      {
   scanf_dat[0] = time.AlarmHou;
         scanf_dat[1] = time.AlarmMin;
  }
else  
      {
      dattemp = time.cymometer[1];
      dattemp =  dattemp<<8;
   dattemp+= time.cymometer[0];
   temp[1] = dattemp%10000/100;
   temp[0] = dattemp%100;
      scanf_dat[0] = temp[1];
         scanf_dat[1] = temp[0];
   } 
 if((time.AlarmHou==time.hou)&&(time.AlarmMin==time.min)&&(Alarm_on_off==1))
 {
  buzzer = 1;
 }
 else buzzer=0;
 }
 /*****************************************************************************
                             系统初始化
 *****************************************************************************/
void syster_init(void)
{
 time.sec = 0;
 time.min = 59;
 time.hou = 23;
 time.day = 28;
 time.mon = 2;
 time.year[0] = 13;
 time.year[1] = 20;
 time.AlarmHou = 6;
 time.AlarmMin = 30;
 time.mode = 0;
 time.stopwatch[0]=0;
 time.stopwatch[1]=0;
 time.stopwatch[2]=0;
 Time_Count0_Init();
}
main()
{
 syster_init();
 while(1)
 {
  button3_proces();
  button2_proces();
  proces_start();
  sanf_display();
 }
}
 下面为hex文件内容:1007CB0012070E1207B712078A1202E812000E80E8
:0107DB00F22B
:10073400000A00FA004C006800B800290009007A99
:10074400000800281F1D1F1E1F1E1F1F1E1F1E1F07
:10077300758951758CD8758AF0D2A9D28CD288D25A
:07078300A8758B05D2AF221F
:10039A00E53524FEB4080040030204479003B4750F
:1003AA00F003A4C58325F0C583730203CC0203D9E5
:1003BA000203E602040702041402042102042E02C4
:1003CA00043B0526E526D3943B4072E4F526220534
:1003DA0027E527D394174065E4F527220528E52960
:1003EA00B40209E528D395384002800DE529900723
:1003FA004793FFE528D39F4044752801220529E544
:10040A0029D3943B4037E4F52922052AE52AD394D7
:10041A0063402AE4F52A22052BE52AD39463401D7A
:10042A00E4F52B22052CE52CD3943B4010E4F52C63
:0E043A0022052DE52DD3943B4003E4F52D2241
:10044800E53524FEB4080040030204F59004627503
:10045800F003A4C58325F0C5837302047A020488D7
:100468000204960204B10204BE0204CC0204DA02B9
:1004780004E8E526D39400400315262275263B227E
:10048800E527D3940040031527227527172215283E
:10049800E528C394015056E529B40204853828227A
:1004A800E52990074793F528221529E529C39401E2
:1004B800503B75290C22E52AD394004003152A22C3
:1004C800752A6322E52AD394004003152B22752B45
:1004D8006322E52CD394004003152C22752C3B2273
:0E04E800E52DD394004003152D22752D17220B
:03000B0002017F70
:0D017F00C0E0C0F0C083C082C0D075D008C1
:10018C00758CD8758AF0B2B7AF2B7E007C007D647D
:10019C001206A7E52A2FFFEC3EEF540360057538D5
:1001AC001C800375381D12062B1204F61205A3E5EC
:1001BC003564017037AF39EFC4131313540130E0B9
:1001CC002BAF21EF54FBF521052EE52EC394644093
:1001DC0005752E00052FE52FC3943C4005752F00A7
:1001EC000530E530C3943C4003753000AF21EF136C
:1001FC0013543F30E009752E00752F00753000AF99
:10020C0021EFC4540F30E008D28E858D32858B31AE
:10021C00AF21EFC413540730E016D28ED53311C280
:10022C008E858D32858B31753364758B00758D00A1
:10023C00E535D39401402CE535940A50260534E578
:10024C003494284025753400AF39EF13131354013F
:10025C00F4540133333354F8FFAE39EE54F74FF501
:10026C00398007AF39EF54F7F5390524E524C394E9
:10027C006440057524000525E525C3943C400575AF
:10028C0025000526E526C3943C4005752600052768
:10029C00E527D3941740057527000528E529B402F6
:1002AC0009E528D395384014800DE529900747932C
:1002BC00FFE528D39F40057528010529E529D3942E
:1002CC000C4005752901052AE52AD39463400205E3
:0102DC002BF6
:0B02DD00D0D0D082D083D0F0D0E0322F
:030003000207A150
:1007A100C0E0C0D075D018753764AF39EF4402F599
:0607B10039D0D0D0E03287
:10062B00AF39EF30E01B20B20BD53615E4F536753C
:10063B0035028006E4F536753501AF39EF54FEF51A
:10064B0039AF39EFC31330E0521537E537646270B9
:10065B004A20B247E535700CAF39EF4401F53975D7
:10066B0036648029E535B40105E4F535801FE535A1
:10067B00C3940A500E0535E4F534AF39EF54FEF54B
:10068B0039800AE4F535AF39EF54FBF539AF39EF63
:0C069B0054EFF539AF39EF54FDF539226A
:10078A00AF39EFC4540F20E00D20B30AAF39EF445C
:07079A0010F53975366422E9
:1004F600AF39EFC4540F30E07620B3621536E536D7
:100506006462704AE535B4011BAF39EFC4131313A7
:100516005401F45401C43333335480FFAE39EE54DE
:100526007F4FF539E535640A7021AF21EFC45401D8
:10053600F45401C454F0FFAE21EE54EF4FF521E41C
:10054600F58BF58DAF21EF54DFF52112039AE536D1
:10055600701D75360AAF39EF4420F5398011AF3971
:10056600EF54EFF53975360AAF39EF54DFF539AF89
:1005760039EFC413540730E023E535D39401401C0A
:10058600AF39EF54DFF53912039AC28EE4F531F52F
:0D0596008DF532F58BAF21EF54EFF52122EA
:1007B700AF21EF20E00D20B40AAF21EF4401F5216E
:0407C70075366422FD
:1005A300AF21EF30E05620B4421536E53664627071
:1005B3002AE535B40107AF21EF4404F521E535B44D
:1005C3000A16AF21EF4420F521753364E4F58BF56A
:1005D3008DAF39EF547FF539120448E536701D7538
:1005E300360AAF21EF4402F5218011AF21EF54FE0B
:1005F300F52175360AAF21EF54FDF521AF21EFC385
:100603001330E023E535D39401401CAF21EF54FDB3
:10061300F521120448C28EE4F531F58DF532F58BE0
:08062300AF21EF54DFF52122A5
:0E07DC00E4FEEEC39F50077D64DDFE0E80F448
:0107EA0022EC
:10075400C297C296E4FEEF30E704D2958002C295B8
:0E076400D297EF25E0FFC2970EBE08EAD296AC
:010772002264
:10000E00AF39EFC4540F30E037E5357033AF39EF09
:10001E00C413540730E023AF39EFC413135401F463
:10002E005401C4333354C0FFAE39EE54BF4FF539CB
:10003E00AF39EF54DFF5397536FA852D22852C232D
:10004E00AF21EF30E00AE535700685292285282399
:10005E00E52275F00A8425E02434F582E43407F5B0
:10006E0083E4740193F510E52275F00A84E5F0251A
:10007E00E02434F582E43407F583E4740193F5113A
:10008E00E52375F00A8425E02434F582E43407F57F
:10009E0083E4740193F512E52375F00A84E5F025E7
:1000AE00E02434F582E43407F583740193F513AF3D
:1000BE0039EFC41313540330E0035313F7E524C38D
:1000CE0094324016E5357012AF21EF20E00CAF39B7
:1000DE00EFC4540F20E0035311F7AF39EFC4540FA0
:1000EE0020E006AF21EF30E007AF39EF54F7F539D6
:1000FE00AF39EF131313541F30E013E53530E0081A
:10010E007510FF7511FF80067512FF7513FFE4F56C
:10011E002074102520F8E6FF120754E52014600E17
:10012E001460111460182403701ED292801CC292A7
:10013E00D2938018C292C293D294C2918012C2926C
:10014E00C293C294D2918008C292C293C294C291B9
:10015E007F051207DC7FFF120754C292C293C2942E
:10016E00C2917F011207DC0520E520C3940440A153
:01017E00225E
:1002E800E53570028023E535B40117E530D3940075
:1002F8004008853022852F23807D852F22852E2357
:100308008075E535C3940450088527228526238007
:1003180066E535C394065008852922852823805729
:10032800E535C394085008852B22852A238048E5A3
:1003380035C3940A5008852D22852C238039AB3289
:10034800EB7B00FAEB2531FBE43AFA7C277D10AF12
:1003580003FE1206B97E007F64CFCDCFCECCCE127D
:1003680006B98F11AE02AF037C007D641206B98D09
:1003780010851122851023E52DB52713E52CB52608
:100388000EAF39EFC41313540330E003D29022C2E6
:0103980090D4
:010399002241
:10070E00E4F52575262675271275280B75290875AB
:10071E002A0C752B14752D06752C1EF535F52EF538
:06072E002FF530020773F5
:030000000207EB09
:0C07EB00787FE4F6D8FD7581390207CB59
:1006A700EF8DF0A4A8F0CF8CF0A428CE8DF0A42E67
:0206B700FE2221
:1006B900BC000BBE0029EF8DF084FFADF022E4CC25
:1006C900F875F008EF2FFFEE33FEEC33FCEE9DECEE
:1006D900984005FCEE9DFE0FD5F0E9E4CEFD22ED34
:1006E900F8F5F0EE8420D21CFEADF075F008EF2F7E
:1006F900FFED33FD4007985006D5F0F222C398FD6F
:050709000FD5F0EA220B
:00000001FF
关键字:单片机  电子时钟 引用地址:单片机电子时钟程序

上一篇:一个单片机比例因子控制的例子
下一篇:按键控制流水灯程序

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

一种单片机控制的指令转换器的设计
1 引言 在某大型指挥控制系统中,由于指令发送装置与接收装置的指令格式有很大的区别,两者不能直接通信。而更换其中之一都会造成巨大的资金浪费,指令转换器的目的就是在不改变发送和接收装置的情况下对发送装置所产生的指令进行格式转换,使产生的指令格式与接收装置所能接收的指令格式一致,实现整个系统的顺利通信。 2 硬件设计 2.1 总体结构 指令转换器的硬件总体结构如图2-1所示。所有电路模块集中在一块印刷电路板上,主要有89C51单片机、串口扩展电路、中断扩展电路、监测电路、静态存贮器扩展电路、输出电路及分频电路等几个部分,下面将对各部分进行详细介绍。 2.2 中央控制单元 2.2.1时钟电路 89C51的内部有一个用
[单片机]
一种<font color='red'>单片机</font>控制的指令转换器的设计
这样学习STM32单片机,从菜鸟到牛人很简单!
我想说,为了学习单片机而去学习单片机的思路不对。 你问,如何系统地入门学习stm32呢?应该如何零基础学习电子产品设计呢? 这本身就是一个错误的问题。假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习。 你要考虑的是, 我可以用STM32实现什么?创客学院带你走进stm32世界 为什么使用STM32而不是8051?是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO?是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA?是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候, 那STM3
[单片机]
DDS芯片AD9850的工作原理及其与单片机的接口
1 AD9850简介 随着数字技术的飞速发展,用数字控制方法从一个参考频率源产生多种频率的技术,即直接数字频率合成(DDS)技术异军突起。美国AD公司推出的高集成度频率合成器AD9850便是采用DDS技术的典型产品之一。 AD9850 采用先地蝗CMOS工艺,其功耗在3.3V供电时仅为155mW,扩展工业级温度范围为-40~80℃,采用28脚SSOP表面封装形式。AD9850的引脚排列如图1所示,图2为其组成框图。图2中层虚线内是一个完整的可编程DDS系统,外层虚线内包含了AD9850的主要组成部分。 AD9850 内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。可编程DDS系统的核心是相位累加器
[单片机]
DDS芯片AD9850的工作原理及其与<font color='red'>单片机</font>的接口
基于51单片机的计算器 C语言程序
前些日子再博客上转载了一篇计算器的C程序,由于这些日子一直忙于考试,也抽不出时间来重写一下基于C51的计算器,昨晚考完信号处理,回来就着手写,一直弄到凌晨3点多,现面把代码帖出来和大家一起共免,由于时间仓促,代码部分可能还有不足,并且程序只是再我的实验板上调试,如有不足请多多执教,程序时C和汇编混合编程,汇编部分值用到延时的处理,其他代码都用C写的,希望哪为高人能够写出功能更为强大的计算器程序一起分享,对于我的程序,哪位博友增添了更多功能的话,希望发到回复里,以共同进步! 程序代码如下: #include reg51.h #define uchar unsigned char #define uint unsigne
[单片机]
基于Infineon单片机的CAN网关研究
 控制器局域网CAN(Controller Area Network)是德国Robert Bosch公司在20世纪80年代初为汽车业开发的一种车载专用串行数据通信总线,经过多年的发展,现在越来越多地被众多汽车厂商所认可。CAN不仅在汽车领域,而且在工业控制领域也得到了广泛的应用,如工业现场控制、小区安防、环境监控等。由于在具体工程应用中往往需要连接2路或者多路CAN子网,因此,CAN网关是必不可少的,是组网的关键设备之一。  在欧洲乃至世界上的很多汽车厂家,大部分的车内电子控制单元大量使用原德国西门子半导体部门英飞凌科技(Infineon Technologies)的微控制器,特别是C166系列MCU,其优良特性得到各大汽车厂家的公
[单片机]
基于Infineon<font color='red'>单片机</font>的CAN网关研究
MCU--几种常见通讯总线
在单片机的应用中,通信协议是其中必不可少的一部分,上位机与下位机,单片机与单片机,单片机与外设模块之间的通信都需要通信协议实现信息交换和资源共享。由于设备之间不同的传输速率、电气特性、可靠性要求的不同,也产生了许多类型的适用于不同情况的通信协议,并被广泛的接受和使用。 1、UART和USART 分别名为通用异步收发器和通用同步异步收发器,速率不快,可全双工,结构上一般由波特率产生器、UART/USART发送器、UART/USART接收器组成,硬件上两线,一收一发。 在UART和USART 有可以扩展为R232和RS485等总线类型。 (1)RS232 RS232(异步传输标准接口),是个人计算机上的通讯接口之一,也
[单片机]
<font color='red'>MCU</font>--几种常见通讯总线
ICC AVR单片机新手入门
AVR ICC 使用快速入门 菜单解释 下一页: 新手的第一个程序,实现红绿灯不断闪烁 。 ICC AVR是一款非常好用的AVR编译软件,官方网站: www.imagecraft.com 目前最新版为7.0,本站的所有例程都以ICC AVR为开发平台。如果你还没有配置好开发环境,请参看: AVR 开发环境ICC+AVRstudio配置 。 如果你有时间看很多理论的没有实际操作价值的说明,请下载 ICCavr中文使用说明 。如果你想快速进入使用,请参看本文档。 1、关于窗口设置: 如上图:这是ICC avr 6.31 版本的窗口,分为5大区。 菜单项 文件 新建,打开,打印文件等常规选项。很别扭的一件事关闭文件在菜单
[单片机]
ICC AVR<font color='red'>单片机</font>新手入门
D1005P单片机立体声放音机电路的应用
D1005P是一块性能较好的立体声 放音机 专用集成电路.电路内包含有两个通道的前置放大器,音量控制电路和耳机放大器,另外还有一个作为控制音量的电压/电流转换电路和能输出
[单片机]
D1005P<font color='red'>单片机</font>立体声放音机电路的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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