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

📄 mainc.c

📁 手机充电器的电路板的测试机架的测试程序,利用AVR的AD转换器测试各点的电压.
💻 C
字号:
#include "extern.h"
GOB g;
VOLTAGEST Voltage;
unsigned int us[5];
unsigned char uc[5];
unsigned char Buf[15];
const U8 SampleTime[]={0,5,5,5,5,80,80,200,5,5,20,5,210,5};
U16 Minmin,Minmax,Maxmin,Maxmax;
void Measure(void);
void MainDisp(void);
int main(void)
{
	IOInit();
	ADCInit();
	Timer0Init();
	Rs232Init();
	g.State=0;
	IntEn();
	wdt_enable(WDTO_1S);
	while(1){
	    g.Flag.ms10=0;
	    wdt_reset();
		DispChange();
		if(g.Flag.ms10){
			KeyScan();
		}
		GetCh();
		GetKey();
		switch(g.State){
			case 0://Init.				
				if(ADCConvert(0)>50){
					Rs232.State=0;
					gSet(10);
					break;
				}							
				Voltage.Cur=ADCConvert(0);
				Voltage.Channel=1;
				g.State=90;
				break;
			case 10://DownLoad.
				Rs232Service();
				break;
			case 90:
				Delay(10);
				if(!ChkBit(PIND,5)) Delay(20);
				if(!ChkBit(PIND,6)) Delay(40);
				if(!ChkBit(PIND,7)) Delay(80);
				if(!ChkBit(PINB,0)) Delay(10);	
				gSet(99);
				ClrBit(PORTD,4);
				Voltage.Channel=1;
				g.ADTime=0;
				g.Flag.ERROR=0;
				g.Flag.FIRST=1;
				g.Flag.OK=0;
			case 99:
				if(!g.Flag.ms10) break;             //10ms测量一次。
				Measure();                          //测量。
				DispVal(Voltage.Channel);           //显示测量值。
				//如没有到测量次数则跳出。
				if(++g.ms100<SampleTime[Voltage.Channel]) break;
				g.ms100=0;
//				Voltage.Channel++;
				g.Flag.FIRST=1;                     //第一次测量标记。
				if(++Voltage.Channel<14) break;
				 //测量完了。
				gSet(101);
				for(uc[3]=1;uc[3]<14;uc[3]++){
					uc[0]=uc[3]<<4;
                    Minmin=ReadInfinit(uc[0]);		//小的最小值。.
					uc[0] +=4;
					Minmax =ReadInfinit(uc[0]);     //小的最大值。
					uc[0] +=4;
					Maxmin =ReadInfinit(uc[0]);     //大的最小值。
					uc[0] +=4;
					Maxmax =ReadInfinit(uc[0]);     //大的最大值。
					Voltage.MeasureFlag[uc[3]]=0;	//开始认为是正确的。
					if((Voltage.MeasureMax[uc[3]]>Maxmax)||
					   (Voltage.MeasureMax[uc[3]]<Maxmin)||
					   (Voltage.MeasureMin[uc[3]]<Minmin)||
					   (Voltage.MeasureMin[uc[3]]>Minmax)){
						Voltage.MeasureFlag[uc[3]]=1;
						g.Flag.ERROR=1;
					}
					else  g.Flag.OK=1;	//表示有正确数据。

				}
				SetBit(PORTD,4);
				Voltage.Channel=0;
				g.Flag.ERRFLAG=0;
				Beep(1);
				if(g.Flag.ERROR){
					Beep(1);
					DispStr("FAIL");
					g.Flag.ERRFLAG=1;
					break;
				}
				g.Flag.ERROR=1;
				DispStr("PASS");
				break;
			case 101:
				switch(Key.hz){
					case RESET:
						gSet(90);
						break;
					case MEASURE:
						gSet(103);
						Voltage.Channel=1;
						g.Flag.FIRST=1;
						break;
					case FIND:
					    if(!g.Flag.OK) break;
					    gSet(104);
						Voltage.Channel=0;
						FindChannel(0);
						break;
					case FINDERR:
					    if(!g.Flag.ERRFLAG) break;
						Voltage.Channel=0;
						FindChannel(1);
					    gSet(105);
						break;
					default:break;
					
				}
				break;
			
			case 103://MEASURE
				ClrBit(PORTD,4);
				switch(Key.hz){
				    case FIND:
					    if(!g.Flag.OK) break;
						Voltage.Channel=0;
						FindChannel(0);
				        gSet(104);
				        break;
					case FINDERR:
					    if(!g.Flag.ERRFLAG) break;
						Voltage.Channel=0;
						FindChannel(1);
						gSet(105);
					    break;
					case RESET:
						gSet(90);
						break;
					case MEASURE:
						if(++Voltage.Channel>13){
							Voltage.Channel=1;
						}
						g.Flag.FIRST=1;
						break;
					default:break;
					
				}
				if(g.Flag.ms10){
					if(++g.ms100>1){
						g.ms100=0;
						Measure();
					}
				}
				MainDisp();
				break;
			case 104:  //FIND
			    switch(Key.hz){
			        case RESET:
			            gSet(90);
			            break;
					case MEASURE:
					    gSet(103);
					    Voltage.Channel=1;
						g.Flag.FIRST=1;
					    break;
					case FIND:
					    FindChannel(0);
					    break;
					case FINDERR:
					    if(!g.Flag.ERRFLAG) break;
					    gSet(105);
					    Voltage.Channel=0;
					    FindChannel(1);
					    break;
			    }
				MainDisp();
			    break;
			case 105://FINDERR
			    switch(Key.hz){
			        case RESET:
			            gSet(90);
			            break;
					case MEASURE:
						gSet(103);
					    Voltage.Channel=1;
						g.Flag.FIRST=1;
					    break;
					case FIND:
					    if(!g.Flag.OK) break;
					    gSet(104);
					    Voltage.Channel=0;
					    FindChannel(0);
					    break;
					case FINDERR:
					    FindChannel(1);
					    break;
			    }
				MainDisp();
			    break;
		}
	}
}
U16 ReadInfinit(U8 num)
{

	U8 uc0;
	U8 buf[5];
	U16 us;
	for(uc0=0;uc0<4;uc0++){
		buf[uc0+1]=EEPromRead(num+uc0);
	}
	buf[5]=0;
	us=Mul(&buf[1],VOLTAGEREF);
	return (us);
}
void Measure(void)
{
	Voltage.Cur=VoltageADC(Voltage.Channel);
	if(g.Flag.FIRST){//
		us[0]=Voltage.Cur;
		us[1]=Voltage.Cur;
		g.Flag.FIRST=0;
	}else{
		us[0]=Max(Voltage.Cur,Voltage.MeasureMax[Voltage.Channel]);
		us[1]=Min(Voltage.Cur,Voltage.MeasureMin[Voltage.Channel]);
	}
	Voltage.MeasureMax[Voltage.Channel]=us[0];
	Voltage.MeasureMin[Voltage.Channel]=us[1];
}
void MainDisp(void)
{
	if(!g.Flag.ms10) return;				
	if(++g.DispTime>80) g.DispTime=0;
	if(g.DispTime<40){
		Voltage.Cur=Voltage.MeasureMin[Voltage.Channel];
			
	}else{
		Voltage.Cur=Voltage.MeasureMax[Voltage.Channel];
	}
	DispVal(Voltage.Channel);
}
void FindChannel(U8 match)
{
	while(1){
	    Voltage.Channel++;
		if(Voltage.Channel>13) Voltage.Channel=1;
		if(Voltage.MeasureFlag[Voltage.Channel]==match) break;
	}
}

⌨️ 快捷键说明

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