Добавил:
Andrejjavd
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Примеры решения лабораторных работ / Лаб9
.txtНапишите программу «Вольтметр» для динамической индикации входного напряжения на семисегментных индикаторах.
В целях упрощения при обработке сигнала используются только 8 двоичных разрядов. Вывод выполняется:
- в шестнадцатеричном коде (00.FF);
- в десятичном коде (000.255);
- в виде напряжения (десятичный код с фиксированной запятой 0,00.5,00).
#include <iom8535v.h>
#include <macros.h>
#define NUM 1000
int values1[2]={0,0};
int number1[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
int values2[3]={0,0,0};
int number2[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void port_init(void)
{
PORTA=0;
DDRA = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
PORTB = 0x00;
DDRB = 0x07;
}
void adc_init(void)
{
ADMUX = 0x43;
ACSR = 0x80;
ADCSRA = 0xCF;
}
#pragma interrupt_handler adc_isr1:15
void adc_isr1(void)
{
int v,i,sum,temp;
CLI ();
sum=0;
v=ADCL>>2;
sum=(0x30&v);
sum+=0x0F&v;
v=ADCH;
sum+=(0x0f&v)*64;
values1[0]=sum%16;
values1[1]=sum/16;
PORTB=0x02;
for (i=0; i<NUM; i++)
PORTD=number1[values1[1]];
PORTB=0x01;
for (i=0; i<NUM; i++)
PORTD=number1[values1[0]];
ADCSRA|=0x40;
SEI () ;
}
#pragma interrupt_handler adc_isr1:15
void adc_isr1(void)
{
int v,i,temp;
CLI ();
v=ADCL>>2;
temp=0x0f&v;
temp+=0x30&v;
v=ADCH;
temp+=(0x0f&v)*64;
Perevod(values2,&temp);
PORTB=0x04;
for (i=0; i<100; i++)
PORTD=number1[values2[0]];
PORTB=0x02;
for (i=0; i<100; i++)
PORTD=number1[values2[1]];
PORTB=0x01;
for (i=0; i<100; i++)
PORTD=number1[values2[2]];
ADCSRA|=0x40;
SEI () ;
}
void Perevod (int values[],int *sum)
{
int i=0;
while (*sum>0)
{
values[i]=*sum%10;
*sum/=10;
i++;
}
if (i==1)
{
values[1]=0;
values[2]=0;
}
if (i==2)
{
values[2]=0;
}
}
void init_devices(void)
{
CLI ();
port_init();
adc_init();
SEI ();
}
//
void main(void)
{
init_devices();
while (1)
{
}
}
Соседние файлы в папке Примеры решения лабораторных работ