專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

C51單片機(jī)運(yùn)用定時器T0中斷實(shí)現(xiàn)電子時鐘

作者:周華   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2014年03月27日   【字體:



上面是電路原理圖

下面是程序源代碼:
/*****************************************************************************
功能描述:運(yùn)用定時器T0實(shí)現(xiàn)電子時鐘
**************************************************************************/
#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();
}

//以下屏蔽內(nèi)容為  利用兩個外部中斷來調(diào)整“時,分”
/*void tiaof() interrupt 0  //分針調(diào)整
{
  if(p32==0)
 {
   delay();
   if(p32==0)
   {
     number=0;
    number0++;
    while(!p32);
  if(number0>=60)
     number0=0;
   }
 }
}

void tiaos() interrupt 2   //時針調(diào)整
{
    if(p33==0)
    {
       delay();
    if(p33==0)
      {
        number=0;
      number1++;
      while(!p33);
      if(number1>=24)
      number1=0;
   
   }
    }
}
*/
 
//運(yùn)用獨(dú)立按鍵來調(diào)整“時,分”
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()           //調(diào)整子程序
{
   if(num==20)          //如果20次到了則說明一秒時間到
     {
    num=0;
    number++;
    if(number==60)        //如果number=60說明滿一分鐘,則向分鐘數(shù)加一
     {
       number=0;
    number0++;
       if(number0==60)    //如果number0=60說明60分鐘已經(jīng)滿,向時加一
        {
       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];        //取出秒的十位并且顯示該數(shù)
    P2=6;
    delay();        //秒的十位
    P0=table[number%10];            //送秒的個位給最后一只數(shù)碼管
     P2=7;            //打開數(shù)碼管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();
  }
}

關(guān)閉窗口

相關(guān)文章