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

📄 main.c

📁 LPC2103 - project (using UART, 1wire, interrupts)
💻 C
字号:
/******************************************************************************
* Plik: main.c                                                    
* Autor: Dariusz Wysocki
*******************************************************************************/
                  
//#include <stdio.h>                    // dolaczenie biblioteki dla funkcji sprintf()
#include <LPC2103.H>                                 

#define CR     0x0D	 					// powrot karetki

// deklaracje funkcji
void initSerial (void);
int sendChar (int ch);
void sendString(char *p);
void initADC(void);
void initTimer(void);
void T0isr (void)	__irq;

// zmienne globalne
float data10 = 0, last10 = 0;

/******************************************************************************
* Inicjalizacja przetwornika A/C
******************************************************************************/
void initADC(void)
{										
  PINSEL1 = 0x00003000;					// ustawienie pinu P0.22 na AIN0
  ADCR  = 0x00200401;					// 10bit/3MHZ
}

/******************************************************************************
* Inicjalizacja ukladu UART1
******************************************************************************/
void initSerial (void)  {            
  PINSEL0 = 0x00050000;                  // ustawienie pinow dla RxD0 i TxD0
  U1LCR = 0x8B;                          // 8 bitow, bit parzystosci, bit stopu
  U1DLL = 19;                            // 38400bps @ 15MHz VPB Clock
  U1FDR = 228;							 
  U1LCR = 0x0B;                          // DLAB = 0
}

/******************************************************************************
* Funkcja wysylajaca znak na port szeregowy
******************************************************************************/
int sendChar (int ch)  {               

  if (ch == '\n')  {
    while (!(U1LSR & 0x20));
    U1THR = CR;     
  }
  while (!(U1LSR & 0x20));
  return (U1THR = ch);
}

/******************************************************************************
* Funkcja wysylajaca string na port szeregowy
******************************************************************************/
void sendString(char *p)
{                  
  while(*p)
  {
    sendChar(*p++);
  }
}

/******************************************************************************
* Funkcja wysylajaca wartosc pomiaru na port szeregowy
******************************************************************************/
void sendFloat(float wyn)
{
	float pom;
   	pom = (int)wyn;	  	
	sendChar(pom+48);
	sendChar('.');
	pom = ((int)(wyn * 10)) % 10;
	sendChar(pom+48);
	pom = (((int)(wyn * 100)) % 100) % 10; 
	sendChar(pom+48);
	pom = ((((int)(wyn * 1000)) % 1000) % 100) % 10; 
	sendChar(pom+48);
	sendChar(' ');
}

void initTimer(void)
{
	T0TCR 		= 0x00000002;			//Reset
	T0MCR 		= 0x00000003;			//Przy zrownaniu TCR z MR0 reset TCR i przerwanie
	T0MR0		= 0x0016E360;			//Ustawienie czasu przerwania
	T0TCR 		= 0x00000001;			//Uruchomienie licznika	1 * TOMR0 / 60 000 000
	VICVectAddr0 = (unsigned)T0isr;		//Ustawienie wektora przerwania
	VICVectCntl0 = 0x00000024;			//Ustawienie kanalu przerwania (od timer'a 0)
	VICIntEnable |= 0x00000010;			//Uaktywnienie przerwania
}

/******************************************************************************
* Funkcja glowna
******************************************************************************/
int main (void) 
{
  	initTimer();
  	initADC();
  	initSerial();                       
  	sendString("Projekt 1 - stacja pomiarowa\n");
  	while (1) 
  	{                              		// Petla nieskonczona
    	;                           
  	}
}

/******************************************************************************
* Przerwanie od licznika (wywolywane co 100ms)
******************************************************************************/
void T0isr (void)	__irq
{  
	static int count = 0;  	
    unsigned int val;
    float wynik;

    ADCR  |= 0x01000000;    			// Start konwersji A/D
	do
	{
    val = ADDR0;                   		// Czytanie rejestu danych 
	}        
	while ((val & 0x80000000) == 0);  	// Czy konwersja skonczona?

	ADCR  = 0x00200401;    				// Stop A/D

	val = ((val >> 6) & 0x03FF);  		// Wydzielenie wyniku z rejestru
	wynik = ((float)(val)*3.3f/1023);  	// Zamiana wyniku na napiecie wejsciowe
	
	count++;
	data10 += wynik;

	sendFloat(wynik);	 				// wyswietlenie wartosci pomiaru

	//sprintf(tabl,"%f",wynik);
    //sendString(tabl);

	if (count == 10)	 				// Czy zebranych 10 pomiarow?
	{
		sendChar('\n');
		sendString("Wart.sr. = ");
		sendFloat((data10/10));
		if (data10 > last10)
	  	{
		 	sendString("wzrosla\n");
		}
		else if (data10 == last10)
		{
		 	sendString("nie zmienila sie\n");
		}
		else
		{
		 	sendString("zmalala\n");
		}
	  	count = 0;
		last10 = data10;
		data10 = 0;
	}
	T0IR 		|= 0x00000001;			// Skasowanie flagi przerwania
	VICVectAddr = 0x00000000;			// Sygnal skonczenia przerwania
}

⌨️ 快捷键说明

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