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

📄 sourse__.c

📁 通过AT90S2313的边缘触发功能构成频率级完成金属探测功能
💻 C
字号:
#include <90s2313.h>  
#include <math.h>     
#include <delay.h>
void volage_light(void);     /* MADE (LED) TRUE*/
void init_system(void);   
void UART_INIT(); 
void SendIntoUp(unsigned char abc);  //发送到上位机器 
int int_diff(unsigned int first,unsigned int second);
long int comp();
void get_count(unsigned char mode);
/*mode=0 ->Get Base Freq  mode=1 -->Get CaiYang Freq*/
unsigned int  base_count,caiyang_count,inter_count;
unsigned char base_times,caiyang_times,inter_times;
unsigned int diff[8]={200,400,600,800,1000,1200,1400,1600};
void main(void)  
       
{                             
long int comp_result=0;
long int  MaxZeroMove=0; //在自学阶段记录出最大的零漂值
volage_light();     //made sourse LED ture
init_system();      //system init
 delay_ms(1);      
 SendIntoUp(2);       
 get_count(0);      //get base_*(count,times)
while(1)
   {     
   get_count(1);       //get caiyang_*(count,times)                   

comp_result=comp();
while(comp_result--) {PORTD.2=0;}PORTD.2=1;       
if(comp_result>=diff[PIND&0x07])
        {PORTD.0=1;   //信号指示灯有效
        }  //输出正常的驱动电平
    else                                           
      {PORTD.0=2; 
      MaxZeroMove=0;
      }         
     
   }
    }
         
long int comp()
{ 
char diff_times;    //caiyang_times-base_times
long int comp_result=0; //caiyang_MU-base_MU 
/***********OLD comp() start!!**************/
diff_times=caiyang_times-base_times;
   if(diff_times>=0)
       { for(;diff_times>0;diff_times--)  
             {comp_result+=0xfffe;}
    comp_result=comp_result+int_diff(caiyang_count,base_count);
       }
   else
      {
        for(;diff_times<0;diff_times++) comp_result+=0xfffe;
       comp_result=int_diff(caiyang_count,base_count)-comp_result;
      }
return labs(comp_result);

}
     
int int_diff(unsigned int first,unsigned int second)
   {int abc;abc=first-second;return abc;}
                         

                 


void  get_count(unsigned char mode)
{
/*T0-->time  T1-->count*/
unsigned int round;
inter_times=0;
TCNT0=55; 
TCNT1=0; /***Here will change into init_value**/
TCCR0=0X01;    //启动定时器20MS
TCCR1B=0X07;   //启动外部计数器  T1
for(round=0;round<400;round++)//200*0.25us *400 =20ms*/
{                                                 
  while((TIFR&0X02)!=0X02)
   {
    if((TIFR&0x80)==0x80) //Count interrupt
     {TIFR|=0X80;         //Cls T1 flag
      TCNT1=0;
      inter_times++; }
    }                       
TIFR|=0X02;          //cls T0 flag     
TCNT0=55;          //T0 =Init Value
}          
TCCR0=0X0;    //停止定时器     T0
TCCR1B=0X0;   //停止外部计数器  T1
/*T0 as a timer finish ,now read TCNTH1~~~TCHTL1*/      
inter_count=TCNT1;               
if(mode==0) //save into base_*
  {base_times=inter_times;
   base_count=inter_count;
   //send_out(base_times); send_out(0xa0);
    //send_out(TCNT1L);send_out(0xa1);
    //send_out(TCNT1H);send_out(0xa2);
   
   }
else if(mode==1) // save into CaiYang_*
   {caiyang_times=inter_times;
    caiyang_count=inter_count;
     //send_out(caiyang_times); send_out(0xb0);
   // send_out(TCNT1L);send_out(0xb1);
   // send_out(TCNT1H);send_out(0xb2);
   }             
}                            
void volage_light(void)
  {DDRB.7=1; PORTB.7=0; //加电工作指示灯   
  DDRD.2=1;PORTD.2=0;   //自学指示灯   INT1脚为0--->自学功能
    DDRB.6=1;PORTB.6=0; //检测到信号指示灯
   DDRD.6=1;PORTD.2=1;  //检测到信号给出真正的驱动电平脚(输出)
   }
 

void init_system(void)
{#asm("cli");
UART_INIT();  
   }


void UART_INIT()
{UBRR=25;  //4M ----9600 BIT/S
UCR=0X18;   
DDRD.1=1;          
DDRD.0=0;//OUT ,TXD
}    
void SendIntoUp(unsigned char abc)
 { //  将数据发送到上位观察
  UDR=abc;
while((USR&0X40)!=0X40);
  USR=USR|0X40;
}                                

⌨️ 快捷键说明

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