标题: 用中断T0定时器实现简单的时钟 [打印本页]

作者: wudawei    时间: 2014-12-31 01:35
标题: 用中断T0定时器实现简单的时钟
/*用573锁存器控制和单片机脚直接位选控制数码管
用中断T0作为秒计数器实现实时时钟功能,由于未学键盘,调时日后再加*/
#include <reg52.h>
#include <intrins.h>
#define unint unsigned int
#define unchar unsigned char
void delay(unint i);      //函数声名
char num;
//此表为 LED 的字模, 共阴数码管 0-9  -
unsigned char code   Disp_Tab[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6,0x02};
unsigned char code   dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};    //位码   查表的方法控制
/************主函数**********************/
main()
{  
   unint i;
long int LedNumVal=0 ;
   unint LedOut[10];
    num=0;

TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
  while(1)
  {  
     if(num>=20)   //控制数字变化速度
  {
   num=0;
     ++LedNumVal;
  if(LedNumVal==86400)
  LedNumVal=0;
  }
  LedOut[7]=Disp_Tab[LedNumVal/3600%100/10];//时的十位
     LedOut[6]=Disp_Tab[LedNumVal/3600%10];//时的个位
     LedOut[5]=Disp_Tab[10];//分隔杆
     LedOut[4]=Disp_Tab[LedNumVal%3600/60%100/10];//分的十位
  LedOut[3]=Disp_Tab[LedNumVal%3600/60%10];//分的个位
     LedOut[2]=Disp_Tab[10];//分隔杆
     LedOut[1]=Disp_Tab[LedNumVal%60%100/10];//秒的十位
     LedOut[0]=Disp_Tab[LedNumVal%60%10];//秒的个位
  for( i=0; i<8; i++)
  {  
   P0 = LedOut[i];
   P2 = dispbit[i];   //使用查表法进行位选   
   delay(1);   //扫描间隔时间   太长会数码管会有闪烁感
  }
  }   
}

void delay(unint z)//延时
{
unint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void time0() interrupt 1//中断服务
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
}






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1