⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 8051单片机对八位LED显示芯片以及温度传感器芯片DS1620的驱动程序。
💻 C
字号:
/**********************************************
*   File: Timer.C
*   Description: Timer Function  
*   Created Date:  2007-10-01
*   Last Modified: 2007-10-01
*   Author: Jeffrey - Schicksal@126.com
*   Notes: None
**********************************************/
//#include "Atmel/AT89X51.h"
#include "SST/SST89x5x4.H"
#include "INTRINS.H"
#include "timer.h"
#include "MAX7219.h"
#include "DS1620.h"
#include "keys.h"

#define TH0_VALUE 0x06
#define TL0_VALUE 0x00

unsigned int timer_tick;
unsigned int timer_tick_500ms;

/**********************************************
*   Function: TIMER_Init
*   Input Variables: None
*   Return Variables: None
*   Usage: T0 Initialization
*********************************************/
void TIMER_Init(void)
{
	
	ET0 = 0;					// 关闭T0的中断
	TMOD = 0x00;			// T0工作在模式0
	TCON = 0x00;			// 暂时未启动T0
	TL0 = TL0_VALUE;
	TH0 = TH0_VALUE;	// 产生2ms中断 |24 MHz 晶振
	ET0 = 1;				  // 打开T2的中断

	timer_tick = 0;
	timer_tick_500ms = 0;
}

/**********************************************
*		Function: timer0_interrupt
*	  Input Variables: None
*   Return Variables: None
*   Usage: TIMER_Interrupt Service Routine 
*********************************************/
void timer0_interrupt(void) interrupt 5 using 1 
{		  
	EA = 0;												  // 关全局中断
	TF0 = 0;												// 清中断标志
	
	timer_tick++;										// 2ms

	if ( timer_tick == 250 )  			// 1s = 2ms X 500
	{
			timer_tick_500ms += 1;					// 秒计数增1
			timer_tick = 0;							// 2ms计数清零
	}
	
	TL0 = TL0_VALUE;								// T0初值装载
	TH0 = TH0_VALUE;								// 产生2ms中断 |24 MHz 晶振
  EA = 1;													// 开中断
}

/**********************************************
*		Function: TIMER_Start
*	  Input Variables: None
*   Return Variables: None
*   Usage: Start T0 
*********************************************/
void TIMER_Start()
{
	TR0 = 1;				// 启动T0
}


volatile unsigned char time[4]={12,0,0,0};
volatile unsigned char alarm[2]={7,0};

extern volatile unsigned char flag;
extern volatile unsigned char alarm_flag;
extern volatile unsigned char change_timeflag;
extern volatile unsigned char change_adjustflag;

/**********************************************
*Function: void Display_Time()
* Input Variables: None
*   Return Variables: None
*   Usage: Display Time
*********************************************/
void Display_Time()
{
	unsigned char data_dp[6]	;
	unsigned char i;
	if(timer_tick_500ms>0)
	{

		  time[3]++;
		  
		  if (time[1]==0xff)
		  {
		    time[1]=59;
		  }

		  if (time[0]==0xff)
		  {
		    time[0]=23;
		  }

		  if (time[3]>1)
		  {
		    time[3]=0;
		    time[2]++;
		  }

		  if (time[2]>=60)
		  { 
		    time[2]-=60;
		    time[1]++;
		  }
		  if (time[1]>=60)
		  { 
		    time[1]-=60;
		    time[0]++;
		  }
		  if (time[0]>=24)
		    time[0]-=24;  

	  if (change_adjustflag==0)              // 显示时钟 
	  {
	    for (i=0;i<4;i+=2)
	    {
			data_dp[i]=time[i/2]/10;
			data_dp[i+1]=time[i/2]%10;
	    }
			data_dp[2]=data_dp[2]|(1<<7);
			data_dp[3]=data_dp[3]|(1<<7);
	    if (change_timeflag==0) 
	    {
	      if (time[2]%2==1)
	      {
	        data_dp[2]=data_dp[2]-0x80;
	        data_dp[3]=data_dp[3]-0x80;
	       }
	    }
	    else
	    {
	      if (change_timeflag==1)
	      {
	        // 正在修改小时
	        if (time[3]==0)
	        {
	          data_dp[0]=0x0f;
	          data_dp[1]=0x0f;
	        }
	      }
	      else
	      {
	        // 正在修改分钟
	        if (time[3]==0)
	        {
	          data_dp[2]=0x8f;
	          data_dp[3]=0x8f;
	        }
	      }
	    }  
	  }
	  else                  // 修改闹表
	  {
	    if (alarm_flag==0)  // 没有闹表
	    {
	      for (i=0;i<4;i++)
	        data_dp[i]=0x0a;
	      if (time[2]%2==0)
	      {
	        data_dp[2]=data_dp[2]|(1<<7);
	        data_dp[3]=data_dp[3]|(1<<7);
	      }
	    }
	    else                // 有闹表
	    {
	      for (i=0;i<4;i+=2)
	      {
	        data_dp[i]=alarm[i/2]/10;
	        data_dp[i+1]=alarm[i/2]%10;
	      }
	      data_dp[2]=data_dp[2]|(1<<7);
	      data_dp[3]=data_dp[3]|(1<<7);
	      if (change_timeflag==0)
	      {
	        if (time[2]%2==1)
	        {
	          data_dp[2]=data_dp[2]-0x80;
	          data_dp[3]=data_dp[3]-0x80;
	         }
	      }
	      else
	      {
	        if (change_timeflag==1)
	        {
	          // 正在修改小时
	          if (time[3]==0)
	          {
	            data_dp[0]=0x0f;
	            data_dp[1]=0x0f;
	          }
	        }
	        else
	        {
	          // 正在修改分钟
	          if (time[3]==0)
	          {
	            data_dp[2]=0x8f;
	            data_dp[3]=0x8f;
	          }
	        }
	      }
	    }
	  }
	  for (i=0;i<4;i++)
	    write_7219(i+1,data_dp[i]);
	
		timer_tick_500ms=0;					// 清500ms计数
	}
}


/**********************************************
*Function: void Check_Alarm()
* Input Variables: None
*   Return Variables: None
*   Usage: Display Time
*********************************************/
void Check_Alarm()
{
  if ((time[0]==alarm[0]) && (time[1]==alarm[1]) && (alarm_flag==1) && (change_adjustflag==0))
  { 
    SetBuzzer(0x00);   // 闹铃响
  }
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -