📄 main_test.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 + -