霍尔传感器测转速(AVR单片机控制)

/****************************************************************
                外部晶振8M
				PA0~3:四位数码管的位选
				PB0~7:数码管的8位段选
				外部中断0用于计数
				定时器0溢出中断的定时为1ms
				说明 :检测到水流较小时,继电器延时1秒关闭
******************************************************************/				
#include
#include
#define uchar unsigned char
#define uint unsigned int

 char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //数码管段选
 
 char position[4]={0xfe,0xfd,0xfb,0xf7};//数码管位选
 
 uint sumnum=0;  //用于记录1000ms内进入中断的次数
 
 uint time=0;   //记录进入比较定时器0的次数
 
 uint num=0;     //记录1ms内进入中断的次数
 
 uint count=0;   //进入外部中断0的次数
 
 uchar flag;
 
 uint sumnum1;   //记录100ms内的数目
 
/***************************函数声明***************************/
 
 void delay();
 
 void display(uint m );
 
 void init();
 
 void init_0();
 
 void init_2();
 void _delay_us(uint l)
{
 	 unsigned int i;
	 for(i=0;i0;i--)
	  for(j=225;j>0;j--);
 }
 
 /************************数码管显示函数*****************************/
 
void segdisplay( int temp)
	 {
	  int seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
	  int temp1,temp2,temp3,temp4;
	  temp1=temp/1000;
	  temp2=(temp/100)%10;
	  temp3=(temp/10)%10;
	  temp4=temp%10;
	  DDRB=0xff;
	  DDRA|=0x0f;
	    PORTA=~BIT(3);
	  	PORTB=seg[temp1];
		_delay_us(100);
		PORTA=~BIT(2);
		PORTB=seg[temp2];
		_delay_us(100);
		PORTA=~BIT(1);
		PORTB=seg[temp3];
		_delay_us(100);
		PORTA=~BIT(0);
		PORTB=seg[temp4];
		_delay_us(100);
	}
 
 /***********************管脚初始化函数*********************/
 
 void init()
 {
  	  
	  	  DDRD|=0X40;   //PD4 设置为输出
		  PORTD=0XBF;   
	  	  DDRA=0XFF;
		  DDRB=0XFF;
		  PORTA=0XFF;
		  PORTB=0XFF;
 }
 
 /***********************外部中断0初始化*********************/
 
 void init_0()
 {
  	  MCUCR=0X02;   //INT0为下降沿触发
	  GICR=0X40;   //使能INT0中断
	  SREG=0X80;  //使能总中断
 }
 
 /**********************定时器2初始化***********************/
 
 void init_2()
 {
  	  TCCR0=0x03;   // 内部时钟,64 分频(8M/64=125KHz) 
      TCNT0=0x83;   //装初值  
      TIMSK=0x01;   // 允许 T/C0溢出中断中断  
 }


 /***********************外部中断0子函数********************/
	 #pragma interrupt_handler int0_isr:2
	 void int0_isr(void)
	 {
	  	  count++;
	 } 
	/*********************定时计数器0溢出中断子函数*****************/
	#pragma interrupt_handler int0_over:10 
	void int0_over(void)
	{
	 	TCNT0=0x83;   //重装初值 
		if((time%100) == 0)
			sumnum1 = num;
	 	if(time == 1000)
		{
			sumnum=num;
			if(sumnum<10)
			{
			    
				if((flag==1)&&(sumnum<10))
				{
				 	PORTD=0XFF;
					flag=0;
				}				
					flag++;
			}
			else
					PORTD=0XBF;
			num=0;
			time=0;
		}
	 	num+=count;
		count=0;
		++time; 
	} 

你可能感兴趣的:(单片机)