专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

C51单片机运用定时器T0中断实现电子时钟

作者:周华   来源:本站原创   点击数:  更新时间:2014年03月27日   【字体:



上面是电路原理图

下面是程序源代码:
/*****************************************************************************
功能描述:运用定时器T0实现电子时钟
**************************************************************************/
#include"reg52.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
 
sbit p32=P3^2;
sbit p33=P3^3;
 
uchar num;
uint number,number0,number1;
 
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

void tiaoz();
void delay()
{
   uint b;
      for(b=300;b>0;b--);
}

void time() interrupt 1
{
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  num++;
  //tiaoz();
}

//以下屏蔽内容为  利用两个外部中断来调整“时,分”
/*void tiaof() interrupt 0  //分针调整
{
  if(p32==0)
 {
   delay();
   if(p32==0)
   {
     number=0;
    number0++;
    while(!p32);
  if(number0>=60)
     number0=0;
   }
 }
}

void tiaos() interrupt 2   //时针调整
{
    if(p33==0)
    {
       delay();
    if(p33==0)
      {
        number=0;
      number1++;
      while(!p33);
      if(number1>=24)
      number1=0;
   
   }
    }
}
*/
 
//运用独立按键来调整“时,分”
void tiaoz0()  
{
  if(p32==0)
 {
   delay();
   if(p32==0)
   {
     number=0;
    number0++;
    while(!p32);
  if(number0>=60)
     number0=0;
   }
 }
    if(p33==0)
    {
       delay();
    if(p33==0)
      {
        number=0;
      number1++;
      while(!p33);
      if(number1>=24)
      number1=0;
   
   }
    }
}

void tiaoz()           //调整子程序
{
   if(num==20)          //如果20次到了则说明一秒时间到
     {
    num=0;
    number++;
    if(number==60)        //如果number=60说明满一分钟,则向分钟数加一
     {
       number=0;
    number0++;
       if(number0==60)    //如果number0=60说明60分钟已经满,向时加一
        {
       number0=0;
       number1++;
         if(number1==24)    //如果number1>24,则从0开始
        number1=0;
        }
     }
        }
    P0=table[number1/10];        //时的十位
    P2=0;
    delay();
       P0=table[number1%10];        //时的个位
    P2=1;
    delay();       
    P0=table[10];
    P2=2;
    delay();
    P0=table[number0/10];     //分的十位
      P2=3;       
    delay();
    P0=table[number0%10];        //分的个位
    P2=4;
    delay();
    P0=table[10];
    P2=5;
    delay();
    P0=table[number/10];        //取出秒的十位并且显示该数
    P2=6;
    delay();        //秒的十位
    P0=table[number%10];            //送秒的个位给最后一只数码管
     P2=7;            //打开数码管8  秒的个位
    delay();       
}

void main()
{
   TMOD=0X01;
   TH0=(65536-45872)/256;
   TL0=(65536-45872)%256;
   EA=1;
 //外部中断启动
/*   EX0=1;
   IE1=1;
   EX1=1;
   IE0=1;
*/
   ET0=1;
   TR0=1;
   while(1)
    {
    tiaoz0(); 
       tiaoz();
  }
}

关闭窗口

相关文章