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

📄 main_test.c

📁 AVR做的HID灯测试程序,详细 AVR做的HID灯测试程序,详细
💻 C
字号:
/////////////////////////////////////////////////////////
//ATmega48单片机,4M晶振/////////////////////////////////
//用于HID灯主板测试,调试通过////////////////////////////
/////////////////////ByTyiq//////////////////////////////
#include <iom48v.h>
#include <macros.h>
#include <math.h>
unsigned long int P;
unsigned int   ad_re;     
unsigned char  flag1;
unsigned int   cp1z[5];   //用于存放AD结果
//*********************************************
//****************初始化***********************  
void sys_init(void)
{
 //   OSCCAL=0X7D;   //校准时钟,内部8M
    PORTB = 0x00;   
    DDRB  = 0x00;   //PB0-5为输出端
    PORTC = 0x20;   //PC5=1  80K关
    DDRC  = 0x20;   
    DDRD  = 0xfE;   //PD1-7输出
    PORTD = 0x00;   //PD2=0 200HZ关  
//   SEI();         //开全局中断  
}
//*********************************************
//****************AD程序***********************
void adc_init()
{
    ADCSRA=0X00;
    ADMUX|=(1<<REFS0); //选择内部AVCC
	               //通道由t选择,结果右对齐
    ACSR=(1<<ACD);     //关闭模拟比较器
    ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);
}                      //AD使能,64分频
//************取平均抗干扰程序*****************
void   aver()   //计算AD值用
{
    double T5,sum=0;
    unsigned char i;
    for(i=1;i<5;i++)
      { 
        sum=sum+cp1z[i];
      }
     T5=sum/4;
     ad_re=(int)T5;
}
//***************AD转换************************
//出口参数:ad_re,10位AD转换平均值**************
void adgo(unsigned char t)
{
    unsigned char count=0x05;
    unsigned char data=0x00;
    ADMUX=(1<<REFS0)|(t&0x0f); //选择内部AVCC
	                       //通道t
    ADCSRA|=(1<<ADSC);      //开始AD转换
    while(1)
      {
       if((ADCSRA&0x40)==0) //查询ADSC是否回0
        {
         cp1z[data]=ADC&0x3ff; //存储1次捕捉值						
         data++;
         count--;
         ADCSRA|=(1<<ADSC);   //启动下一次A/D转换
        }   
       if(count==0) break;
      }		                //等待中断结束
    aver();                 //取平均抗干扰 
}
//*********************************************
//***********10微秒级延时程序******************OK
void delay_10us(int time) 
{ 
    do 
     { 
       NOP();
       time--; 
     }    
    while (time > 1); 
} 
//********************************************* 
//*************毫秒级延时程序******************OK 
void delay_ms(unsigned int time) 
{ 
    while(time != 0) 
      {       
        delay_10us(100); 
        time--; 
      } 
}
//***********************************************************
//*******************测试函数********************************
//**************电源检测***********************
void  vcc_test()
{
    adgo(1);  //通道1
    if((ad_re>573)&&(ad_re<675))  //电源电压正常
      {                 //14V-2.8V-573AD  16.5V-3.3V-675AD
        PORTD&=~0X02;   //PD1=0
      }
    else
      {
        PORTD|=0X02;   //PD1=1
        flag1=1;
      }
}
//**************VIN检测***********************
void  vin_test()
{
    adgo(0);  //通道0
    if((ad_re>400)&&(ad_re<700))  //VIN电压正常
      {                 //15V--614AD  10V-2V-409AD
        PORTD&=~0X08;     //PD3=0
      }
    else
      {
        PORTD|=0X08;   //PD3=1
        flag1=1;
      }
}
//*********************************************
void  HID_on()
{ 
    PORTC&=~0X20;   //PC5=0  80K出
    PORTD|=0X04;    //PD2=1,200HZ出
}
//*************管压检测************************
void  v400()
{
    adgo(2);//通道2
    if((ad_re>102)&&(ad_re<400))  //管压正常
      {             //50V-0.5V-102 200V-2.3V-471
        PORTD&=~0X20;     //PD5=0   2V-
      }
    else 
      {
        flag1=1;
        PORTD|=0X20;   //PD5=1  
        PORTC|=0X20;   //PC5=1输出保护
		PORTD&=~0X04;  //PD2=0,200HZ
      }
}
//*************反接测试************************
void  back()
{
    PORTD|=0X80;  //PD7=1 接反输出
	delay_ms(1000);
    adgo(3);      //通道3
    if(ad_re<500)  //反向保护
      {            
        PORTD&=~0X10; //PD4=0
      }
    else 
      {
        PORTD|=0X10;  //PD4=1 
        flag1=1;
      }
    PORTD&=~0X80;  //PD7=0 返回正向
}
//************************************************************
//***********************中断*********************************
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
   {   
     ;
   }
//*************************************************************
//*********************主程序**********************************
void main(void)              
{
 loop: 
      sys_init();               //初始化
      adc_init();    
      while(ad_re<200) 
	   {
	     adgo(0); //等待控制板插上
		 PORTD^=0X02;        
         PORTD^=0X08;        
         PORTD^=0X10;         
         PORTD^=0X20;   //4红灯闪
		 delay_ms(200);        
	   }
	  PORTD|=0X02;         //+12V   
      PORTD|=0X08;         //PD3=1  VIN
      PORTD|=0X10;         //PD4=1  反向
      PORTD|=0X20;         //PD5=1  管压  红灯全亮 
	  flag1=0;
	  delay_ms(500);
	  vin_test();          //VIN检测
	  delay_ms(500); 
	  vcc_test();          //+12V
	  if(flag1==1)  goto loop1;
	  HID_on();            //电源正常点灯
	  delay_ms(800);
	  delay_ms(800);     
	  v400();              //管压检测
	  if(flag1==1)  goto loop1;
      delay_ms(500);  	  
      back();              //反向检测
loop1:if(flag1==0)         //正常,绿灯亮
        {
          do
            {
              adgo(0); 
              PORTD|=0X40;     //PD6=1,蜂鸣器响
            }
          while(ad_re>200);    //等拔下
        }
      else          //任一不正常,绿灯闪
        {
		  PORTD^=0X40;        
          delay_ms(80); 
          PORTD^=0X40;        
          delay_ms(80);
          PORTD^=0X40;        
          delay_ms(80);
		  PORTD^=0X40;        
          delay_ms(80); 
          do
            {
              adgo(0); 
              PORTD^=0X40;       //PD6反
              delay_ms(500);
            }
          while(ad_re>200);      //等拔下
        }
      goto loop;   //复位
}































⌨️ 快捷键说明

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