Разработка программы для измерительной системы на базе микроконтроллера

Страницы работы

6 страниц (Word-файл)

Содержание работы

/*

Тип чипа

ATmega8

Тактовая частота

3,000000 MHz

Модель памяти

Small

Внешний размер

0

Размер данных стека

256

*/

1.  #include <mega8.h> /* Включаем библиотеку для работы с микроконтроллером Atmega8 */

2.  #include <stdio.h> /* Включаем стандартный заголовочный файл ввода-вывода */

3.  #include <delay.h>  // Включаем библиотеку для организации задержек

4.  void avr_init(void) // Инициализация контроллера

5.  {

6.  DDRB = 0b11101111; /* Зададим бит 4 порта В как вход, остальные - выходы */

7.  PORTB=0b11011111; /* Установим бит 5 порта В как выход, на котором установлен уровень логического 0, остальные – логическая 1 */

8.  DDRD = 0xFF; // Зададим все биты порта D как выходы

9.  PORTD = 0x00; /* Установим все биты порта D как выходы, на которых установлен уровень логического 0 */

/* Инициализация USART

Параметры связи: 8 данных, 1 стоп, без контроля четности

USART Приемник: Выключен

USART передатчика: Включен

USART Режим: Асинхронный */

10.  UCSRA=0x00; // Обнуляем  регистр состояния

11.  UCSRB=0x08;

12.  UCSRC=0x86;

13.  UBRRH=0x00; // Регистр UBRR отвечает за скорость передачи данных.

14.  UBRRL=0x19; /*Задаются значения младшего (L) и старшего (H) байтов регистра */

15.  }    

16.  unsigned int adc_read() //определяем функцию чтения из АЦП

17.  {

18.  int i; // объявляем целую переменную

19.  unsigned int result=0; /* объявляем и инициализируем целую без знака переменную */

20.  PORTB.1 = 1; /* Устанавливаем бит 1 порта В как выход, на котором установлена логическая единица */

21.  PORTB.2 = 0; //CS = 0  

22.  delay_us(20); // сгенерируем задержку в 20 мкс

23.  PORTB.5 = 1; /* Устанавливаем бит 5 порта В как выход, на котором установлена логическая единица */

/* #asm – говорит компилятору о начале ассемблерного кода. Ее используют для включения в любое место исходной программы ассемблерного кода. NOP - команда, которая предписывает ничего не делать. */

24.  #asm("nop")

25.  #asm("nop")

26.  #asm("nop")

27.  #asm("nop") 

28.  #asm("nop")

29.  #asm("nop")

30.  #asm("nop")

31.  #asm("nop")

32.  #asm("nop")

33.  #asm("nop")

34.  #asm("nop")

35.  #asm("nop")

36.  PORTB.5 = 0; /* Устанавливаем бит 5 порта В как выход, на котором установлен логический ноль */

37.  for(i=0;i<16;i++) /* цикл будет выполняться, начиная со значения i=0, после каждого выполнения цикла i будет увеличиваться на единицу и тело цикла будет выполняться с новым значением i до тех пор, пока i не превысит 16 */

38.  {

39.  PORTB.5 = 1; //SS=1

40.  #asm("nop")

41.  #asm("nop")

42.  #asm("nop")

43.  #asm("nop")       

44.  delay_us(8); // сгенерируем задержку в 8 мкс

45.  if (PINB.4 == 0) result = result << 1; /* Если DOUT=0, тогда просто сдвигаем result влево */

46.  if (PINB.4 == 1) result = (result << 1) + 1; /* Если DOUT=1 - тогда сдвигаем и прибавляем единицу */

47.  PORTB.5 = 0; //SS=0

48.  delay_us(10); // сгенерируем задержку в 10 мкс

49.  };

50.  PORTB.5 = 0; /* Устанавливаем бит 5 порта В как выход, на котором установлен логический ноль */

51.  PORTB.2 = 1;   //CS=1

52.  PORTB.1 = 0; /* Устанавливаем бит 1 порта В как выход, на котором установлен логический ноль */

53.  return result; // возвращаем значение переменной

54.  }

55.  void main(void) // основная функция программы

56.  {

57.  unsigned long a; // объявляем  длинную без знака переменную

58.  avr_init(); // первоначальная инициализация процессора

/* printf является универсальной функцией для форматного вывода */

59.  printf("Test");

60.  while(1) // бесконечный цикл

61.  {

62.  a = 0; // переменной а присваивается 0

63.  a = adc_read(); // переменной а присваивается adc_read()

64.  PORTD.6 = 1;  /* Устанавливаем бит 6 порта В как выход, на котором установлена логическая единица */

65.  delay_ms(100); // сгенерируем задержку в 100 мс

66.  PORTD.6 = 0; /* Устанавливаем бит 6 порта В как выход, на котором установлен логический ноль */

67.  printf("%04d",a); /* спецификация преобразования %04d означает, что число а будет напечатано в поле с шириной, по крайней мере в 6 символов в десятичном виде(символ преобразования ‘d’ */

68.  delay_ms(1000); // сгенерируем задержку в 1000 мс

69.  };

70.  }

Знаками /* (начало) и */ (конец) выделены блоки с комментариями, а затем знаком // - строки с комментариями.

Рисунок 5.1 – Проверка работы SPI

Рисунок 5.2 – Осциллограмма

Рисунок 5.2 – Собранная вPROTEUS схема

Рисунок 5.1 – Код программы в AVR Studio

Похожие материалы

Информация о работе