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

📄 fan.c

📁 AVR MEGA8 低速脉冲频率测量程序,用于风量传感器,四位LED显示,可设置报警输出值.PROTEUS仿真验证.
💻 C
字号:
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
#define OUTBS0OFF PORTD|=0x04      //PD2 
#define OUTBS0ON PORTD&=~0x04     
#define OUTBS1OFF PORTD|=0x08     //PD3
#define OUTBS1ON PORTD&=~0x08
#define OUTBS2OFF PORTD|=0x10     //PD4
#define OUTBS2ON PORTD&=~0x10
#define OUTBS3OFF PORTB|=0x20    //PB5
#define OUTBS3ON PORTB&=~0x20
#define OUTQN1ON PORTD|=0x40      //PD6 OUT 
#define OUTQN1OFF PORTD&=~0x40
#define OUTQN1Pulse PORTD^=0x40
#define OUTQN2OFF PORTD|=0x80       //For LED
#define OUTQN2ON PORTD&=~0x80
#define OUTQN2Pulse PORTD^=0x80

////KB///////////////
#define KeyMenu (PINB&0x10)
#define KeyAdd  (PINB&0x08)
#define KeyDcc  (PINB&0x04)
unsigned char StatusVB[4]={115,109,119,124};
unsigned char BS3V=124;//b  第四位的值
unsigned char DispVB[16]={63,6,91,79,102,109,125,7,127,111,119,124,88,94,121,56};
unsigned char LEDbitV[4];
unsigned int LEDint=0;
unsigned int LEDdot=0;
unsigned char LEDrfTime=15;

unsigned char T0_1msFlag=0;

//EEPROM
unsigned char SetupADDbase=1;
unsigned char ParaTnum=3;
unsigned int MenuSet[3];
unsigned int MenuSetTemp[3];
unsigned int MenuSetMax[3]={1000,1000,1000};
unsigned int MenuSetMin[3]={0,0,0};
unsigned int MenuSetDefault[3]={100,100,100};

unsigned int ActiveV;

void watchdog_init(void)
     {
	   WDR();
	   WDTCR=0x0F ;
	 }
	 
void Delay_1ms(void)
	{
	unsigned int i;

	for (i = 1; i<1140; i++)
		
			;
	}

void delayXms(unsigned int n)
     {
	   unsigned int i=0;
	   while(i<n)
	     {
		  Delay_1ms();
		  i++;
		 }
	 }
	 
void port_init(void)
     {
	  
	  PORTB=0xFF;    
	  DDRB=0xE2;     
	                
					 
	  DDRC=0xFF;
      PORTC=0xFF;   
	      
	  PORTD=0xFF;    
	  DDRD=0xDF;     
	  
	  OUTQN1OFF;            
	  OUTBS0OFF;
      OUTBS1OFF;   
      OUTBS2OFF;
      OUTBS3OFF;
	  //delayXms(2000); //delay 1s
	 }
	 
	 
///////////////Timer init	 
void timer_init(void)
     {
	 TCCR0=0x00;     //stop T2
	 TCNT0=131;      //clk=8Mhz/64 tccr0=3 t=1ms 
	 TIMSK|=(1<<TOIE0);   //enable T0 INT	
	 TCCR0=0x03;  
	 TCCR1A=0;
	 TCCR1B=0;
	 TCNT1=0;
	 }
unsigned int T1CKCR=0;
// Timer0 INT servo program 	 
  #pragma interrupt_handler timer0_ovf_isr:10
  void timer0_ovf_isr(void)
    {
	 TCNT0=131;      ////clk=8Mhz tccr0=3 t=1ms 
	 T1CKCR++;
	 if(T1CKCR>2000)
	  {
	   MenuSet[0]=TCNT1;
	   TCNT1=0;
	   T1CKCR=0;
	  }//if(T1CKCR>2000)
	 T0_1msFlag=1;
	 //Q0MOTOR3Pulse;
	}//void timer0_ovf_isr(void)	 
	 
	 
void LEDsegOUT(unsigned char DPBB)
    {
	 PORTC=((PORTC&0xC0) | (DPBB & 0x3F));  
     PORTD=((PORTD&0xFC) | ((DPBB>>6) & 0x03));
	}
	

void LEDdisp(void)
     {
	  unsigned char LightTime;
	  LightTime=1;
	  OUTBS0ON;
      LEDsegOUT(LEDbitV[0]);    
      delayXms(LightTime);
      OUTBS0OFF;
	  OUTBS1ON;
      LEDsegOUT(LEDbitV[1]);    
      delayXms(LightTime);
      OUTBS1OFF;
	  OUTBS2ON;
      LEDsegOUT(LEDbitV[2]);    
      delayXms(LightTime);
      OUTBS2OFF;
	  OUTBS3ON;
      LEDsegOUT(LEDbitV[3]);    
      delayXms(LightTime);
      OUTBS3OFF;
	 }//void LEDdisp(void)
void LEDputSign(unsigned int LINT,unsigned int LDOT)
     {
	 unsigned char dpb=0;
	  unsigned char sp[6],i,j;
	  unsigned char spdp[6];
	  unsigned int x;
	  
	  if(LEDint<1000)
	  {
	   
	   x=1000;
	   for(i=0;i<4;i++)	
	    {
	     sp[i]=LINT/x;	
		 spdp[i]=LDOT/x;
	     LINT=LINT%x;
		 LDOT=LDOT%x;
		 x=x/10;
	    }	//for
	   LEDbitV[3]=BS3V;
	   dpb=4;
	   for(i=1;i<4;i++)  //取得小数点位
	     {
		  if(sp[i]>0)
		    {
			 dpb=i;
			 break;
			}//if(sp[i]>0)
		 }//for(i=1;i<4;i++)
	   //dpb--;
	   j=3;
	   for(i=dpb;i<4;i++)  //写整数位
	      {
		   j--;
		   LEDbitV[j]=DispVB[sp[i]];
		  }//for(i=dpb;i<4;i++)
	      LEDbitV[j]=LEDbitV[j]+128;
	   
	   for(i=0;i<j;i++) //写小数位
	     {
		  LEDbitV[i]=DispVB[spdp[j-i]];
		 }//for
	   
		}//if(di<1000)
	  else
	    {
		 for(i=0;i<3;i++)
		 LEDbitV[i]=56;
		}//else
	 }//LCDputUint(void)
 
//;*****************************************************************
//////////////read a int from EEPROM///
unsigned int ReadEEPint(unsigned int uAddr)
 {
  unsigned char edh,edl;
  unsigned int eev;
    while(EECR&(1<<EEWE));
	EEAR=uAddr;
	EECR|=(1<<EERE);
	edh=EEDR;
	EEAR=uAddr+1;
	EECR|=(1<<EERE);
	edl=EEDR;
	eev=edh;
	eev=(eev<<8)+edl;
	return eev;
 }
 void WriteEEPint(unsigned int uAddr,unsigned int eev)
 {
  unsigned char edh,edl;
  //unsigned int eev;
  edh=(eev>>8);
  edl=eev;
    while(EECR&(1<<EEWE));
	EEAR=uAddr;	
	EEDR=edh;
	CLI();
	EECR|=(1<<EEMWE);
	EECR|=(1<<EEWE);
	SEI();
	while(EECR&(1<<EEWE));
	EEAR=uAddr+1;	
	EEDR=edl;
	CLI();
	EECR|=(1<<EEMWE);
	EECR|=(1<<EEWE);
	SEI();
 }
	
void LoadPG(void)
  {
   unsigned char i;
    for(i=0;i<ParaTnum;i++)	
	 {
	  MenuSet[i]=ReadEEPint(SetupADDbase+i*2);
	  if((MenuSet[i]>MenuSetMax[i]) || (MenuSet[i]<MenuSetMin[i]))
	     MenuSet[i]=MenuSetDefault[i];
	  MenuSetTemp[i]=MenuSet[i];
	 }
  }

void SavePG(unsigned char MP)
{
 if(MenuSetTemp[MP] != MenuSet[MP])
   {
    WriteEEPint((SetupADDbase+MP*2),MenuSet[MP]);
	MenuSetTemp[MP]=MenuSet[MP];
   }
}// void SavePG(void) 
  
unsigned char MenuStep=10;
unsigned char MenuPos=0;
unsigned char KeyAddCR=0;
unsigned char KeyDccCR=0;
unsigned char KeyAddFastCR=0;
unsigned char KeyDccFastCR=0;
unsigned char KeySpeed=100;
void MenuAction(void)
{
 switch(MenuStep)
  {
   case 10:
     if(KeyMenu==0)
	   {
	    MenuPos++;
		if(MenuPos>2)
		  MenuPos=0;
		BS3V=StatusVB[MenuPos];  
		LEDputSign(MenuSet[MenuPos],0);
		MenuSetTemp[MenuPos]=MenuSet[MenuPos];
		MenuStep=20;
		KeyAddCR=0;
		KeyAddCR=0;
		KeyAddFastCR=0;
        KeyDccFastCR=0;
	   }//if(KeyMenu==0)
   break;
   case 20:
     if(KeyMenu>0)
	   MenuStep=30;
   break;
   case 30:
     if(MenuPos>0)
	   {
        if(KeyAdd==0)  //++		
		  {
		   KeyAddCR++;
		   if(KeyAddCR>KeySpeed)
		     {
		      if(MenuSet[MenuPos]<MenuSetMax[MenuPos])
		        MenuSet[MenuPos]++;
			  LEDputSign(MenuSet[MenuPos],0);
			  KeyAddFastCR++;
			  if(KeyAddFastCR>10)
			     KeySpeed=20;
			  KeyAddCR=0;
			 }//if(KeyAddCR>50)
		  }//if(KeyAdd==0) 
		else
		 {		  		    
		  KeyAddCR=0;
		  KeyAddFastCR=0;
		  KeySpeed=100;
		  SavePG(MenuPos);
		 }//else if(KeyAdd==0)
		 
		 if(KeyDcc==0)  //-		
		  {//OUTQN2Pulse;
		   KeyDccCR++;
		   if(KeyDccCR>KeySpeed)
		     {
		      if(MenuSet[MenuPos]>MenuSetMin[MenuPos])
		        MenuSet[MenuPos]--;
			  LEDputSign(MenuSet[MenuPos],0);
			  KeyDccFastCR++;
			  if(KeyDccFastCR>10)
			     KeySpeed=20;
			  KeyDccCR=0;
			 }//if(KeyDccCR>50)
		  }//if(KeyDcc==0) 
		else
		 {		  		    
		  KeyDccCR=0;
		  KeyDccFastCR=0;
		  KeySpeed=100;
		   SavePG(MenuPos);
		 }//else if(KeyDcc==0)   
	   }// if(MenuPos>0)
     if(KeyMenu==0) 
	    MenuStep=10;
   break;
   case 40:
     if(KeyMenu>0)
	   MenuStep=10;
   break;
  }//switch(MenuStep)
}//void MenuAction(void)
  
  
  
unsigned char LEDCR=0;
 
void main()
{
  
  unsigned char i=0;
  
  port_init();
  LoadPG();
  timer_init();
  SEI();
  TCCR1B=0x06;  //start T1 Ext CLK
  
  //LEDint=9;
  //LEDdot=260;
  //LEDputSign();
 LEDrfTime=15;
 //LEDint=999;
 //LEDdot=0;
 //MenuSet[1]=111;
 //MenuSet[2]=222;
 BS3V=StatusVB[0];
 MenuSet[0]=0;
 LEDputSign(MenuSet[0],0);
  while(1)
  {
  
  if(T0_1msFlag)
    {
	 
	 MenuAction();
	 if(MenuSet[0]<MenuSet[1])
	   OUTQN1ON;
	 else
	   OUTQN1OFF;
	////LED display
	 LEDCR++;
	 if(LEDCR>LEDrfTime)
	   {
	     
         LEDputSign(MenuSet[MenuPos],0);
		 
	     LEDdisp();
		 LEDCR=0;
	   }//if(LEDCR>LEDrfTime)
	 T0_1msFlag=0;
	}//if(T0_1msFlag)
  
  //LEDbitV[3]=124;//b
 
  
 
  //delayXms(LEDrfTime);
  
  
  }//while

}//MAIN

⌨️ 快捷键说明

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