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

📄 timer0.c

📁 protues_atmeg8学习之:timer篇源代码
💻 C
字号:
/******************************************/
//文件名:Timer0.c
//功能: T/C0和INT0的应用
//作者:  young
//时间: 2006.10.1
//目标MCU:ATmega8   
//晶振:  8MHZ
/******************************************/
#include <iom8v.h>
#include <macros.h>
#include "Delay.h"

unsigned char KeyDown;   //全局变量,用来记录按键按下次数
unsigned char CountNum;  //记录T/C0中断,每中断一次是1/500S
unsigned char TimeNum[3]={0, 0, 0}; //记录中断时间,分,秒,百分秒

//初始化端口
void Init_Port(void)
{
	DDRB=0xFF;	  //设置B口为输出模式
	PORTB=0xFF;	  //置高电平
	DDRC=0x7F;
	PORTC=0x7F;
	DDRD|=0x03;
	PORTD=0xFF;
}

//初始化外部中断
void Init_Int(void)
{
    MCUCR|=0x02;  //INT0下降沿触发
	GICR|=0x40;   //打开INT0中断
    GIFR|=0x40;   //清除INT0中断标志位
}

//初始化T/C0
void Init_Timer0(void)
{
    TCCR0=0x00;           //T/C0工作于定时方式,先停止T/C0
    TCNT0=0x06;           //计数初始值6 
    TIMSK|=(1<<TOIE0);    //开放TOV0中断	
}

//显示定时时间
void Display(unsigned char *timer)
{
    unsigned char i=0;	
	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
    //依次显示"00:00.00"
	for(i=0; i<6; i++)
    {		    
		 PORTC&=~(1<<i);
	     switch(i)
		 {
		 case 1:
		 case 3:
			  PORTB=num[timer[i]]+0x80;
			  break;			
		 default:	
			  PORTB=num[timer[i]];
			  break;
		 }		
		 delay_ms(1);
		 PORTC|=0xFF;	
    }
}

//INT0中断函数
#pragma interrupt_handler int0_fun:iv_INT0
void int0_fun(void)
{
    KeyDown++;
	switch(KeyDown)
	{
	case 1:
	    TCNT0=0x06;      //计数初始值6 
		TCCR0=0x03;      //打开T/C0,系统时钟64分频 
		break;
	case 2:
		TCCR0=0x00;      //关闭T/C0
		break;
	default:
		TimeNum[0]=TimeNum[1]=TimeNum[2]=0;//计时清零		
		KeyDown=0;
		break;		
	}
}

//T/C0中断函数
#pragma interrupt_handler timer0_fun:iv_TIMER0_OVF 
void timer0_fun(void)
{
    TCNT0=0x06 ;               //重装计数初始值6    
	if(++CountNum==5)           
    {
	    CountNum=0;            //计数到5次,计数值复位
        TimeNum[2]++;          //秒的百分位加1
        if(TimeNum[2]==100)
        {
		    TimeNum[2]=0;
            TimeNum[1]++;      //秒进位
		}
        if(TimeNum[1]==60)
        {
		   TimeNum[1]=0;
           TimeNum[0]++;      //分进位
		}             
        if(TimeNum[0]==60)
        {
			TimeNum[0]=0;
		}
    }	
}

//主函数
void main()
{
    unsigned char timer[6]={0, 0, 0, 0, 0, 0};
	
	CLI();         //先关闭全局中断
	Init_Port();   //初始化端口
    Init_Int();    //初始化外部中断	
    Init_Timer0(); //初始化T/C0
	
	KeyDown=0;     //初始化全局变量
	CountNum=0;
	SEI();         //打开全局中断
	while (1)
	{	           
		timer[0]=TimeNum[0]/10;
		timer[1]=TimeNum[0]%10;
		timer[2]=TimeNum[1]/10;
		timer[3]=TimeNum[1]%10;
		timer[4]=TimeNum[2]/10;
		timer[5]=TimeNum[2]%10;			
		Display(timer);          //显示时间
     }
}

⌨️ 快捷键说明

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