原创 数字钟proteus仿真

2009-5-14 09:12 3022 4 4 分类: MCU/ 嵌入式

https://static.assets-stash.eet-china.com/album/old-resources/2009/5/14/76e7a252-30fc-4b5f-b440-5e6e8f0fc30c.rar//程序功能:时钟显示


//s1按键功能,  秒加一


//s2按键功能, 分加一


//s3按键功能,小时加一


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


//*************************************************


#include<reg51.h>


#define K 2


#define x 50


#define M 240


code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,


                               0x82,0xf8,0x80,0x90,0xff}; //共阳数码管段码


 


unsigned int cnt="0";   //由于底下的cnt用到了4000,所以这时不能定义成char类型(最大才255


unsigned char sec="0";


unsigned char min="0";


unsigned char hour="0";


 


 


void delay(int m)


{


 unsigned char i,j;


  for(i=0;i<m;i++)         


  for(j=0;j<100;j++);


}


 


void LED_display()             //显示


{


 


      P2=0x01;                  //选通第一位


      P0=seg7code[hour/10];     //显示小时十位


      delay(K);


      P0=0xff;                  //消隐


 


      P2=0x02;                  //选通第二位


      P0=seg7code[hour%10];     //显示小时个位


      delay(K);


      P0=0xff;                  //消隐


 


     P2=0x04;                  //选通第三位


      P0=0xbf;


     delay(K);   


      P0=0xff;


 


     P2=0x08;                  //选通第四位


      P0=seg7code[min/10];     //显示分十位


      delay(K);


      P0=0xff;                  //消隐


 


      P2=0x10;                  //选通第五位


      P0=seg7code[min%10];     //显示分个位


      delay(K);


      P0=0xff;                  //消隐


 


     P2=0x20;                  //选通第六位


      P0=0xbf;


     delay(K);   


      P0=0xff;


 


      P2=0x40;                   //选通第七位


      P0=seg7code[sec/10];       //显示秒十位


      delay(K);


      P0=0xff;                   //消隐


 


      P2=0x80;                   //选通第八位


      P0=seg7code[sec%10];       //显示秒个位


      delay(K);


      P0=0xff;                  //消隐


}


 


 


void timer0 (void) interrupt 1 using 0


{


 cnt++;             //每过250uscnt加一


 if(cnt==4000)      //250*4000=1s


 {


  cnt=0;


  sec++;          


  if(sec==60)       //60秒,重新计数,分钟加一


  { sec="0";


    min++;


    if(min==60)         //60分,重新计数,小时加一


     {


      min=0;


      hour++;


      if(hour==13)      //12个小时,重新计数


      {hour=1;}


     }


 


  }


 }


}


 


 


   void intserv0 (void) interrupt 0         // 外部中断0,秒加1


 {


      sec++;       


      if(sec==60)      


      sec=0; 


 


 }


 


 void intserv1 (void) interrupt 2    // 外部中断1.分加1


 {


    min++;       


      if(min==60)     


      min=0; 


 }


 


 void timer1 (void) interrupt 3      // T1改为外部中断,小时加1


{


      hour++;       


      if(hour==13)      


      hour=1; 


}


 


 


main()


{


     TMOD=0x62;          //T0,方式2


    


     EA=1;                 //开总中断


      EX0=1;


      EX1=1;


      IT0=1;


      IT1=1;


      ET0=1;                //开定时器T0中断


      ET1=1;                          //开定时器T1中断         


      TH1=0XFF;


      TL1=0XFF;


      TR1=1;


      TH0=0x06;              //<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />12.0M的定时中断


      TL0=0x06;


      TR0=1;


  while(1)


 {  


  LED_display();


 }


}

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条