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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

/*

Тип чипа

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

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.