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);
}
}