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

📄 main.c

📁 共享几个AVR单片机的常用代码
💻 C
字号:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "KEYB.h"
#include "LCD4.h"
#include "ADC.h"
#include "Func.h"
#include "DDS_AD9850.h"
#include "DAC_MAX515.h"
#include "Timer.h"

#include "Mix.c"

const char *mnuA[] = {"  TEST MODE   ","  WORK MODE   "};
const char *mnuB[] = {" REFRESH RATE ","  NOISE LEVEL ","  START SCAN  ","    RETURN    "};
const char *mnuC[] = {"   TEST DDS   ","  TEST TIMER  ","   TEST ADC   ","   TEST DAC   ","    RETURN    "};

uint16_t rRate,BaseFreq;
uint8_t  noise,cursor,curC;
uint8_t result[201];


void UISelWork(void);
void UISelTest(void);
void refreshDisp(void);
uint8_t TestInput(void);




int main(void)
{
	uint8_t cur;
	
	sei();
    Timer_Wait_s(1);	//wait LCD init
	
	LCD_Init();
	LCD_DispStr("INITIALIZING...");

	ADC_Init(1);
	DA_Init();
	DDS_Init();

	rRate = 40;
	noise = 50;
	while(1)
	{
		cur = LCD_DispMenu(mnuA,1);
		if(cur)
			UISelWork();
		else
			UISelTest();
	}
	return 0;
}

uint8_t TestInput(void)
{
	uint8_t cur;
	cur = KB_GetChar(0,1);
	switch(cur)
	{
		case 'F':
			if(cursor < 200)
			{
				cursor++;
				curC=1;
			}
			break;
		case 'E':
			return 1;
		case 'D':
			if(cursor > 0)
			{
				cursor--;
				curC=1;
			}
			break;
		default:
			return 0;
	}
	return 0;
}

void refreshDisp(void)
{
	uint8_t x,y,t;

	t = 1;
	DA_SetLevel_B(5);

	for(x = 0;x < 201;x++)
	{
		DA_SetLevel_A(x);
		DA_SetLevel_B(result[x] + 5);
		/*
		DELAY_4M_us;
		if(x==cursor)
		{
			for(y = 20;y>4;y--)
				DA_SetLevel_B(y);
		}
		else if(t == 0)
		{
			t = 20;
			for(y = 0;y < 6;y++)
				DA_SetLevel_B(y);
		}
		else
			DA_SetLevel_B(5);
		t--;
		*/
		DELAY_8M_us;DELAY_8M_us;
		DA_SetLevel_B(5);
	}
	
	if(curC)
	{
		LCD_SetXY(6,1);
		LCD_DispStr("     ");
		LCD_SetXY(6,1);
		LCD_DispNum(cursor*10 + BaseFreq);
		curC = 0;
	}
	DA_SetLevel_A(0);
	Timer_Set_ms(rRate);
}

void UISelWork(void)
{
	uint8_t cur,rTmp[201];
	uint16_t avg;
	uint32_t cFreq,f;
	
	int16_t sub,calc;
	
	while(1)
	{
		switch(cur = LCD_DispMenu(mnuB,3))
		{
		case 0:
			
			LCD_Clear();
			LCD_DispStr("SET RATE:    Hz");
			cur = KB_GetNum(10,0,25,1,100,5,"  ");
			rRate = 1000/cur;
		break;
		case 1:
			LCD_Clear();
			LCD_DispStr(" COUPLE GROUND ");
			LCD_SetXY(0,1);
			LCD_DispStr("PRESS E WHEN OK");
			
			do
			{
				cur = KB_GetChar(1,1);
			}while(cur != 'E');
			
			LCD_Clear();
			LCD_DispStr("  WAIT 5 SEC ");
			cur = 10;
			avg = 0;
			while(cur--)
			{
				avg += ADC_Read_Sync();
				Timer_Wait_ms(450);
			}
			noise = avg/10;
			
			LCD_Clear();
			LCD_DispStr("AVG NOISE: ");
			LCD_DispNum(noise);
			LCD_DispStr("mV");
			Timer_Wait_s(2);
		break;
		case 2:
			LCD_Clear();
			LCD_DispStr("CENTRAL FREQ:");
			LCD_SetXY(0,1);
			LCD_DispStr("      KHz");
			cFreq = KB_GetNum(0,1,0,1000,30000,10,"     ");
			BaseFreq = cFreq - 1000;
			cFreq += 470;
			LCD_Clear();
			LCD_DispStr("SCANING ...");
			LCD_SetXY(0,1);
			LCD_DispStr("FREQ:       KHz");
			LCD_SetXY(5,1);

			cFreq *= 1000;
			cursor = 1;
			curC = 1;
			Timer_Set_ms(rRate);
			while(1)
			{
				cur = 0;
				
				for(f = cFreq - 1000000;f < cFreq + 1000001;f += 10000)
				{
					avg = 0;
					for(sub = -4000;sub < 3001;sub+=1000)
					{
						DDS_UpdateFreq(f + sub);
						DELAY_8M_us;
						avg += ADC_Read_Sync();
						if(waitFlag == 0)
							refreshDisp();
					}
					avg >>=3;
					if (avg <= noise) 
						avg = 0;
				
					rTmp[cur++] = avg;
				}
				
				if(TestInput())
				{
					DDS_Init();
					DA_Init();
					break;
				}

				for(calc = 200;calc>=0;calc--)
				{
					if(rTmp[calc]==0)
						result[calc] = 0;
					else
					{
						result[calc] = rTmp[calc];

						if(calc >= 94)
						{
							sub = (rTmp[calc - 94] - rTmp[calc]);
							if(sub <= noise)
								sub = 0;
							rTmp[calc - 94] = sub;
						}

					}
					
					if(waitFlag == 0)
							refreshDisp();
				}
				if(TestInput())
				{
					DDS_Init();
					DA_Init();
					break;
				}
			}
		break;
		case 3:
			return;
		}
	}

	}


void UISelTest(void)
{
	uint8_t cur;
	uint32_t cFreq;
	while(1)
	{
	switch(cur = LCD_DispMenu(mnuC,4))
	{
		case 0:
			LCD_Clear();
			LCD_DispStr("SELECT FREQ:");
			LCD_SetXY(0,1);
			LCD_DispStr("         HZ");
			while(1)
			{
				cFreq = KB_GetNum(0,1,0,0,60000000,10,"        ");
				DDS_UpdateFreq(cFreq);
			}
			break;
		case 1:

			break;
		case 2:
			LCD_Clear();
			while(1)
			{
				cur = ADC_Read_Sync();
				LCD_DispStr("PA0:     mV");
				LCD_SetXY(5,0);
				LCD_DispNum(cur);
				Timer_Wait_ms(500);
			}
			break;
		case 3:

			break;
		case 4:
			return;
	}
	}
}


⌨️ 快捷键说明

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