Автор работы: Пользователь скрыл имя, 17 Ноября 2010 в 15:07, контрольная работа
Тема1: «Работа с лабораторной установкой. Использование портов ввода-вывода микроконтроллера».
Тема2: «Управление светодиодным индикатором от микроконтроллера».
Тема3: «Использование аналого-цифрового преобразователя (АЦП) микроконтроллера».
Лабораторная работа №1…………………………………………………………………3
Лабораторная работа №2…………………………………………………………………5
Лабораторная работа №3…………………………………………………………………8
if (timer==999) break; /*При переполнении – выход из цикла*/
}
c_1 = timer/10; /*Определение 1 цифры*/
c_2 = timer%10; /*Определение 2 цифры*/
c1 = num_to_disp (c_1); /*Определение выводимого числа на индикатор HG1*/
c2 = num_to_disp (c_2); /*Определение выводимого числа на индикатор HG2*/
for (;;); /*Бесконечный цикл*/
}
Лабораторная
работа №5
Тема:
«Использование аналого-цифрового
преобразователя (АЦП)
микроконтроллера»
Задание
Вариант
№5: Написать программу вывода с интервалом
0.5 секунды на индикатор разницу между
двумя напряжениями, подаваемыми на входы
AIN0 и AIN2 АЦП. Напряжения задается с помощью
потенциометра.
Реализация
программы
Все
сегменты индикатора подключаются к порту
9L. 3 первых бита порта 9H используются
для подсоединения индикаторов. Потенциометры
соединяются с входами AIN0 и AIN2. С помощью
АЦП считывается текущие напряжения и
вычитаются друг из друга. Эта разница
и выводится на индикатор.
Листинг
программы с комментариями
#include "io70f3707.h"
#include "intrinsics.h"
char cur_lcd;
int lcd_out;
char f(char a)/*Функция вывода числа на индикатор*/
{
switch(a) /*Определение кода числа от его значения*/
{
case 0: return 0x3F;
case 1: return 0x06;
case 2: return 0x5B;
case 3: return 0x4F;
case 4: return 0x66;
case 5: return 0x6D;
case 6: return 0x7D;
case 7: return 0x07;
case 8: return 0x7F;
case 9: return 0x6F;
default: return 0x00;
}
}
/*Подпрограмма
обработки прерывания от
#pragma vector = INTTP0OV_vector
__interrupt void indic(void)
{
P9H = 0; /*Выключаем все индикаторы HG1 – HG3 */
if (n_ind == 0) /*Вывод на индикатор HG1*/
{
P9L = c1; /*Код выводимого числа*/
P9H = 1; /*Номер индикатора*/
}
if (n_ind == 1) /*Вывод на индикатор HG2*/
{
P9L = c2; /*Код выводимого числа*/
P9H = 2; /*Номер индикатора*/
}
if (n_ind == 2) /*Вывод на индикатор HG3*/
{
P9L = c3; /*Код выводимого числа*/
P9H = 4; /*Номер индикатора*/
}
n_ind++; /*Смена номера индикатора*/
if (n_ind > 2) /*Условие перехода к индикатору HG1*/
n_ind = 0;
}
/*функция*/
void pause(unsigned char a)
{
long i;
for(i = 0; i < 30000*a; ++i)
;
}
unsigned int get_adc(char num)
{
ADCSRA = 0x87;0
ADMUX = 192 + num;
ADCSRA |= 0x10;
ADCSRA |= 0x40;
while((ADCSRA & 0x10) == 0)
;
return ADC;
}
void main(void)
{
unsigned int adc1, adc2;
long i;
cur_lcd = 0x00;
lcd_out = 0x00;
DDRD = 0xFF;
DDRC = 0xFF;
DDRA = 0x00;
DDRB = 0x03;
PORTA = 0x00;
PORTB = 0x00;
MCUCR = 0;
TIMSK = 0x01;
TCCR0 = 0x04;
_SEI();
while(1)
{
adc1 = get_adc(0)>>2;
adc2 = get_adc(2)>>2;
if (adc1 > adc2)
{
lcd_out = (adc1 - adc2);
PORTB = 1;
}
else
{
lcd_out = (adc2 - adc1);
PORTB = 2;
}
for(i = 0; i <400000; ++i)
;
}
}
Информация о работе Отчет по лабораторным работам по курсу Организация ЭВМ