Przetwornik AC – dioda

Przetwornik AC – dioda

Program: mierzący dane napięcie oraz alarmujący jeśli znajduje się z podanego w programie przedziału poprzez zapalenie diody.

W tym przypadku – wartość powyżej 1.2V.

Kompilator: Code::Blocks

Kod programu:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include <stdlib.h>
#include <stdio.h>
void displayChar(char c)
{
	PORTD = c>>4;
	_delay_ms(1);
	PORTB = 0x03;
	_delay_ms(1);
	PORTB = 0x02;
	_delay_ms(1);
	PORTD = c;
	_delay_ms(1);
	PORTB = 0x03;
	_delay_ms(1);
	PORTB = 0x02;
	_delay_ms(1);
}
void wysString(const char * text)
{
	if(strlen(text) > 32)
	{
		wysString("Za dlugi text   max 32 znaki");
		return;
	}
	for(int i = 0; i < strlen(text); i = i + 1)
	{
		if(i == 16)
		{
			PORTD = 0x0C;
			_delay_ms(1);
			PORTB = 0x01;
			_delay_ms(1);
			PORTB = 0x00;
			_delay_ms(1);
			PORTD = 0x00;
			_delay_ms(1);
			PORTB = 0x01;
			_delay_ms(1);
			PORTB = 0x00;
			_delay_ms(1);
		}
		displayChar(text[i]);
	}
}
void wysInt(int x){
	char buffer [32];
	itoa (x,buffer,10);
	wysString(buffer);
}
void main() {

_delay_ms(100);
DDRD = 0xff;
DDRB = 0xff;
DDRA =0x00;
DDRC =0xff;
PORTD = 0x03;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x03;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x03;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x02;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x02;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x08;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x00;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x01;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x00;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x06;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x00;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x0f;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);

	int pomiar_L; int pomiar_H; float pomiar; int dioda=0;

ADMUX |= _BV(REFS0);
ADMUX |= _BV(REFS1);
ADMUX &= ~_BV(ADLAR);
ADCSRA |= _BV(ADEN);
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS1);
while (1) {
	ADCSRA |= _BV(ADSC);
	while(bit_is_set(ADCSRA,ADSC)){};
	pomiar_L = ADCL;
	pomiar_H = ADCH & 0x03;
	pomiar = (pomiar_H*256+pomiar_L)*0.0025;
	if (pomiar>1.2&&dioda==0)
		dioda=1;
	if (pomiar<0.7&&dioda==1)
		dioda=0;
	if (dioda==1)
		PORTC = 0xff;
	else
		PORTC = 0x00;
	char s[10];
	dtostrf(pomiar,4,2,s);
	wysString(s);
	displayChar('V');
PORTD = 0x00;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
PORTD = 0x01;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
}
}