Отчет по лабораторным работам по курсу Организация ЭВМ

Федеральное агентство по образованию и науке  РФ

Южно-Уральский  Государственный Университет

Кафедра Систем управления 
 
 
 
 
 
 
 
 
 
 
 
 
 

Отчет по лабораторным работам

  по курсу Организация  ЭВМ  
 
 
 
 
 
 
 

                    Выполнил: студент ПС-219

                                         Меркулов А.

                    «____»____________ 2008 г. 

                    Руководитель:

                    _______________ Садов В.Б.

                    «____»____________ 2008 г. 

                    Работа  защищена

                    с оценкой _______________

                    «____»____________ 2008 г. 
                     
                     
                     
                     
                     
                     
                     
                     
                     

Челябинск

2008

Содержание 

Лабораторная  работа №1…………………………………………………………………3

Лабораторная работа №2…………………………………………………………………5

Лабораторная  работа №3…………………………………………………………………8 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Лабораторная  работа №1 

Тема: «Работа с лабораторной установкой. Использование  портов ввода-вывода микроконтроллера» 
 

Задание 

     Вариант №3: Написать программу вывода на светодиоды «нарастающей линейки» (8светодиодов). Шаг по времени задается с тумблера: 0.5 или 1 сек.   
 

Реализация программы 

     Все 8 светодиодов подключаются к выходам порта 7. Тумблер подсоединяется к выходу 0 порта 9. В бесконечном цикле в начале проверяется, в каком положении находится тумблер, в соответствии с этим определяется скорость нарастания «световой линейки» на светодиодах, то есть определяется величина программной паузы. 
 

Листинг программы с комментариями 

#include<io70f3707.h>

#include<intrinsics.h> 

int main( void )

{

  int i, k;    /*Переменные цикла для создания программной паузы*/

 

  WDTM2 = 0x1f;   /*Запрет сторожевого таймера*/

  PM7L = 0;    /*Определение всех битов порта 7L как выходов*/

  PM9L = 0xff;   /*Определение 0 бита порта 9L как входа*/

  PU9L = 0x1;    /*Подключение подтягивающего резистра к 0 биту порта 9L*/

  for(;;)    /*Общий цикл программы*/

  {

    if (P9L_bit.no0)  /*Если тумблер в положении 1*/

      k = 10000;   /*Величина программной паузы*/

    else    /*Если тумблер в положении 0*/

      k = 50000;   /*Величина программной паузы*/

 

    P7L_bit.no0 = 1;  /*Зажигаем 1 светодиод*/

    for (i = 0; i < k; i++); /*Программная пауза*/

    P7L_bit.no1 = 1;

    for (i = 0; i < k; i++);

    P7L_bit.no2 = 1;

    for (i = 0; i < k; i++);

    P7L_bit.no3 = 1;

    for (i = 0; i < k; i++);

    P7L_bit.no4 = 1;

    for (i = 0; i < k; i++);

    P7L_bit.no5 = 1;

    for (i = 0; i < k; i++);

    P7L_bit.no6 = 1;

    for (i = 0; i < k; i++);

    P7L_bit.no7 = 1;

    for (i = 0; i < k; i++);

   

    for (i = 0; i < k; i++);  /*Программная пауза*/ 

    P7L_bit.no7=0;   /*Выключаем 8 из 8 светодиод*/

    for (i = 0; i < k; i++);  /*Программная пауза*/

    P7L_bit.no6 = 0;

    for (i = 0; i < k; i++);

    P7L_bit.no5 = 0;

    for (i = 0; i < k; i++);

    P7L_bit.no4 = 0;

    for (i = 0; i < k; i++);

    P7L_bit.no3 = 0;

    for (i = 0; i < k; i++);

    P7L_bit.no2 = 0;

    for (i = 0; i < k; i++);

    P7L_bit.no1 = 0;

    for (i = 0; i < k; i++);

    P7L_bit.no0 = 0;

    for (i = 0; i < k; i++);

  }

 

 

} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Лабораторная работа №2 

Тема: «Управление светодиодным индикатором от микроконтроллера» 
 

Задание 

Вариант №3: Написать программу вывода на семисегментный индикатор времени между нажатием одной кнопки (до 99). Время вычислять с помощью программных пауз. 
 

Реализация программы 

     Все сегменты индикатора подключаются к порту 7L. 2 первых бита порта 7H используются для подсоединения индикаторов. Кнопка подсоединяется к выходу 0 порта 9. В бесконечном цикле проверяется нажатие кнопки, замеряется интервал времени до повторного нажатия. Полученное значение выводится на индикаторы. 
 

Листинг программы с комментариями 

#include <io70f3707.h>

#include <intrinsics.h> 

unsigned char c1, c2, c3;  /*Выводимые на индикатор значения*/

unsigned char n_ind;   /*Номер текущего индикатора*/ 

char num_to_disp (char c)  /*Функция вывода числа на индикатор*/

{

  switch (c)    /*Определение кода числа от его значения*/

 {

    case 0: return 0x3f;

    case 1: return 0x6; 

    case 2: return 0x5b;

    case 3: return 0x4f;

    case 4: return 0x66;

    case 5: return 0x6d;

    case 6: return 0x7d;

    case 7: return 0x7; 

    case 8: return 0x7f;

    case 9: return 0x6f;

  }

} 

/*Подпрограмма обработки прерывания от таймера TMP0*/

#pragma vector = INTTP0OV_vector

__interrupt void indic(void)

{

  P7H = 0;    /*Выключаем все индикаторы HG1 – HG3 */

  if (n_ind == 0)   /*Вывод на индикатор HG1*/

  {

    P7L = c1;    /*Код выводимого числа*/

    P7H = 1;    /*Номер индикатора*/

  }

  if (n_ind == 1)   /*Вывод на индикатор HG2*/

  {

    P7L = c2;    /*Код выводимого числа*/

    P7H = 2;    /*Номер индикатора*/

  }

  if (n_ind == 2)   /*Вывод на индикатор HG3*/

  {

    P7L = c3;    /*Код выводимого числа*/

    P7H = 4;    /*Номер индикатора*/

  }

  n_ind++;    /*Смена номера индикатора*/

  if (n_ind > 2)    /*Условие перехода к индикатору HG1*/

    n_ind = 0;

} 

/*Основная программа*/

int main(void)    

{

  int timer;    /*Счетчик времени*/

  int i;     /*Переменная цикла для программной паузы*/

  short c_1, c_2, c_3;   /*Цифры выводимого числа*/

 

  WDTM2 = 0x1f;   /*Запрет сторожевого таймера*/

  PM9L = 0xff;   /*Определение всех битов порта 9L как входов*/

  PU9L = 0x1;    /*Подтягивающий резистор к битам порта 9L*/

  /*Установка коэффициента деления частоты тактового генератора в 1*/

  PRCMD = 0;    

  PCC = 0;

  __asm("nop");

  __asm("nop");

  __asm("nop");

  __asm("nop");

  __asm("nop");

  /*Установка коэффициента умножения частоты в 4*/

  PLLCTL_bit.no0 = 1;

  while (LOCKR_bit.no0);

  PLLCTL_bit.no1 = 1;

  __asm("nop");

  __asm("nop");

  __asm("nop");

  __asm("nop");

  __asm("nop");

  PM7L = 0;    /*Определение битов 0-7 порта 7 как выходов*/

  PM7H = 0xf8;   /*Определение битов 8-10 порта 7 как выходов*/

  P7L = 0;    /*Сегменты не светятся*/

  P7H = 0;    /*Индикаторы не выбраны*/

  c1 = 0x3f;    /*Коды индицируемых символов*/

  c2 = 0x3f;

  n_ind = 0;    /*Текущий номер индикатора – HG1*/

/*Разрешение прерывания по переполнению счетчика таймера TMP0*/ 

TP0OVIC_bit.no6 = 0;

  __EI();    /*Общее разрешение прерывания*/

  TP0CTL1 = 5;   /*Режим таймера со свободным пуском*/

  TP0CTL0 = 0;   /*Коэффициент пересчета = 244 Гц*/

  TP0CTL0_bit.no7 = 1;  /*Таймер запущен*/

 

  while(P9L_bit.no0);   /*Ожидание, если кнопка находится в положении 1*/

  while(!P9L_bit.no0);  /*Ожидание, если кнопка находится в положении 0*/

  timer = 0;    /*Обнуление счетчика времени*/

  while(P9L_bit.no0)   /*Выполнение, пока кнопка  - в положении 1*/

  {

    for (i = 0; i < 10000; i++);  /*Программная пауза*/

    timer+=1;    /*Увеличение счетчика на 1 единицу времени*/

    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;

  }

}

/*Подпрограмма  обработки прерывания от таймера  TMP0*/

#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)

      ;

  }

}

Отчет по лабораторным работам по курсу Организация ЭВМ