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

📄 mega48--定时器--学生会.txt

📁 机器人自动寻轨道行走,可以计数、计时,实现多功能的测量
💻 TXT
字号:
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char

unsigned led[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};    //显示符0~9
uchar led_buff[3]={0x3f,0x3f,0x3f};                    //显示缓冲区

uchar sec;
uchar dsec;
uchar ddsec;
uchar Key1_flag;
uchar Key2_flag;
uchar Key3_flag;
uchar Key4_flag;

/*************************延时***************************/
void delay_1ms(unsigned int n)            //1ms延时
    {
	unsigned int i;
	for(i=1;i<1142;i++)
	;
    }

/********************按键处理***************************/
void key_process(void)
{
 while(PIND==0b01111100) //d7亮
  {
  Key1_flag=1;
  }
  while(PIND==0b10111100)//d6亮
  {
  Key2_flag=1;
  }
  while(PIND==0b11011100)//d5亮
  {
  Key3_flag=1;
  }
}

/*******初始化系统,启动TIMER1溢出中断使能,用100ms定时****/
void sys_init(void)
    {
     DDRB=0xff;
     DDRC=0xff;
     PORTB=0x3f;
     PORTC=0Xff; 
     DDRD=0xff;
     PORTD=0xfc;
     TIMSK1=0X01;                        //溢出中断使能
     TCCR1B=0X00;                        //禁止TIMER1              
     TCNT1H=0X7c;
     TCNT1L=0Xf3;
     TCCR1A=0X00;
     TCCR1B=0X04;
     TCCR1C=0X00;
     EICRA=0X02;     //定义外部中断INT0为下降沿产生中断请求
     EIMSK=0X01;     //中断屏蔽寄存器开INT0
     SEI();
    }

/*********************timer1溢出中断程序******************/
#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
     {
      TCNT1H=0x7c;                   //重装载定时器
      TCNT1L=0Xf3;

	  if(Key1_flag==1)
	    {   
	     dsec++;
		if(dsec>9)
		   {
		   dsec=0;
		   sec++;
		   if(sec>5)
		      {
			  sec=0;
			  ddsec++; 
		    if(ddsec==2)
	          TIMSK1=0X00;
			   }  
	    	}   
		led_buff[0]=led[dsec];
		led_buff[1]=led[sec];
		led_buff[2]=led[ddsec];
		}

	if(Key2_flag==1)
	    {
	      dsec++;
		if(dsec>9)
		   {
		   dsec=0;
		   sec++;
		   if(sec>5)
		      {
			  sec=0;
			  ddsec++; 
		    if(ddsec==3)
	           TIMSK1=0X00;
			   }  
	    	}
		led_buff[0]=led[dsec];
		led_buff[1]=led[sec];
		led_buff[2]=led[ddsec];
		}

	if(Key3_flag==1)
	    {
	      dsec++;
		if(dsec>9)
		   {
		   dsec=0;
		   sec++;
		   if(sec>5)
		      {
			  sec=0;
			  ddsec++; 
		    if(ddsec==5)
	           TIMSK1=0X00;
			   }  
	    	}
		led_buff[0]=led[dsec];
		led_buff[1]=led[sec];
		led_buff[2]=led[ddsec];
	    }
    }
	 
/****************************动态显示函数************************/
void display(void)             
  {
  unsigned char i;
  for(i=0;i<3;i++)
    {
    PORTB=led_buff[i];
    PORTC=(1<<i);
    delay_1ms(2); 
    PORTC=0x00;
    }
  }
 
/*****************INT0中断函数*************************/
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 Key4_flag^=1;
 delay_1ms(10);
}

void chuli(void)
{
 if(Key1_flag==1)
	   {
		 if(Key4_flag==1)
	     {
	     TIMSK1=0X00;
		  }
		 if((Key4_flag==0)&&(ddsec<2))
	     {
	      TIMSK1=0X01;
		 }
	   }
		
	  if(Key2_flag==1)
	    { 
		 if(Key4_flag==1)
		 {
	     TIMSK1=0X00;
		 }
		 if((Key4_flag==0)&&(ddsec<3))
		 {
	     TIMSK1=0X01;
		 }
		}

	 if(Key3_flag==1)
		{ 
		 if(Key4_flag==1)
	     {
	     TIMSK1=0X00;
		 }
		 if((Key4_flag==0)&&(ddsec<5))
		 {
	      TIMSK1=0X01;
	     }
	    }
} 
 
/*******************************主函数*****************************/
void main(void)
    {
	MCUCR=0;
	sys_init();
	Key1_flag=0;
	Key2_flag=0;
	Key3_flag=0;
        Key4_flag=0;
        for(;;)
	   {
	    key_process();
	    chuli();
	    display();
	   }
	}




⌨️ 快捷键说明

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