• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

用89c51单片机编写时钟程序

妖孽泪别 2016-12-22 浏览量:812
#include <reg51.h>
sfr P1M0 =0x92;
sfr P1M1 =0x91;
char buf[4] ={0x01,0x02,3,4};
char hour=0,min=0,sec=0;
char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
 
int time;
void delay(void){
   unsigned int j;
   j=1000;
   for(;j--;);
  }
unsigned int count=0;
void dir(void){
 P0= TAB[buf[0]]  ;
 P1=0x08;
  delay();
  P0=0xff;  //£¿£¿£¿
   P1=0x02;
 P0= TAB[buf[1]]  ;
   if(count>10)P0&=0x7f;
 P1=0x02;
  delay();
  P0=0xff;
 
  P1=0x04;
 P0= TAB[buf[2]]  ;
  //if(count>10)P0&=0x7f;
  delay();
  P0=0xff;
 P1=0x01; 
 P0= TAB[buf[3]]  ;
  delay();
  P0=0xff;
    P1=0x00;

void t1(void) interrupt  3 {
 TL1= (char)(15536&0x00ff);
   TH1= (char)(15536>>8);
     count++;
   if(count>19){
    count=0;
    //buf[3]++;
    time++;
    if(time>3599)   time=0;
    hour++
    if(hour>23)
   } 
}    

 
void main(void){
 char min,sec;
 hour
   P1M0 =0x0f;
 P1M1 =0x00;
  TMOD=0x10; 
 TH1= (char)(15536>>8);
 TL1= (char)(15536&0x00ff); 
 IE=0x88;
  TR1=1;
 while(1) {
  
  min=(char)(time/60) ;
  buf[0]=min/10;   buf[1]=min%10;
  
  sec=(char)(time%60) ;
  buf[2]=sec/10;   buf[3]=sec%10;
  
  dir();
  
 }
}


这个程序每步的解释

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 同樣的問題//www.icxbk.com/ask/detail?tid=2266
    蜂鳴器叫可以做,但數碼管閃爍,本來就是逐位掃描方式,要一起閃不太可能,但可以ˊ有逐位數碼管ˊˊ掃描不夠快產生的閃爍現象

    宣告改成

    #include <reg51.h>
    sfr P1M0 =0x92;
    sfr P1M1 =0x91;
    char buf[4] ={0x01,0x02,3,4};
    volatile char min=0;
    volatile char sec=0;
    char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
    volatile unsigned int count=0;
    char beeper=0;

    然後改主函數,和中斷函數,減速版的數碼管顯示就您自己測了,改delay時間長度即可

    void t1(void) interrupt  3 {
       TL1= (char)(15536&0x00ff);
       TH1= (char)(15536>>8);
       sec++;
       if(sec>59)
       {
         sec=0;
         min++;
       }
       if(min>59)
         min=0;
    }  

    void main(void){
     P1M0 =0x0f;
     P1M1 =0x00;
     TMOD=0x10;
     TH1= (char)(15536>>8);
     TL1= (char)(15536&0x00ff);
     IE=0x88;
     TR1=1;
     while(1) {
     
      buf[0]=sec%10;   
      buf[1]=sec/10;
      buf[2]=min%10;   
      buf[3]=min/10;

      if(min==0 && sec==0)
         beeper==1;

      if(beeper==1)
      {
        if(sec<5)
          beep_on(); //打開Beeper所接的GPIO
        else
        {
          beep_off();
          beeper=0;
        }
      }

      if(min==10 || min==20 || min==30)
      {
        if(sec<10)
           dir_slow(); //將數碼管函數重做一個 delay加長,達到閃爍
        else
           dir(); //正常顯示
      }
      else
        dir();
     }
    }

    以上希望有幫助到您
    • 发布于 2016-12-22
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:0

相关问题

问题达人换一批

用89c51单片机编写时钟程序