Програма на языке Си

Программа имеет следующий вид:

1. Char counter; // определение переменной в качестве счетчика разрядов

2. Void Wait ( ) { // определение функции задержки

3. Delay ms (100);

}

4. Void main ( ) { //главная программа

5. DDRA= 0XFF; // установка выводов порта А как выходы

6. DDRB= 0XFF; // установка выводов порта В как выходы

7. DDRC= 0XFF; // установка выводов порта С как выходы

8. DDRD= 0XFF; // установка выводов порта D как выходы

9. PORTA= 0X00; // установка выходов порта А в 0

10. PORTB= 0X00; // установка выходов порта В в 0

11. PORTC= 0X00; // установка выходов порта С в 0

12. PORTD = 0X00; // установка выходов порта D в 0

13. While (1) {

14. For (counter=0; counter<8; counter++) {

15. PORTA |= 1<< counter; // сдвиг единицы в порте А

16. PORTB |= 1<< counter; // сдвиг единицы в порте В

17. PORTC |= 1<< counter; // сдвиг единицы в порте С

18. PORTD |= 1<< counter; // сдвиг единицы в порте D

19. Wait ( ); // задержка

}

20. Counter=0;

21. While (counter<8 ) {

22. PORTA &= ~(1<< counter); // сдвиг нуля в порте А

23. PORTB &= ~(1<< counter); // сдвиг нуля в порте В

24. PORTC &= ~(1<< counter); // сдвиг нуля в порте С

25. PORTD &= ~(1<< counter); // сдвиг нуля в порте D

26. Wait ( ); // задержка

27. Counter++; // инкремент счетчика

}

}

В начале объявляется функция задержки, которая используется между переклю чениями состояний светодиодов. Задержка состояния светодиодов необходима для их визуального восприятия. Без задержки мигание светодиодов будет неразличимым для глаз человека.

Основная программа начинвается с инициализации портов: так как на выводах портов А,В,С,D подключаются светодиоды, то они назначаются выходами занесением единиц в соответствующие регистры портов (пункты 5-8) . В исходном состоянии светодиоды должны быть погашены, поэтому в указанных портах запишем нули (пункты 9-12).

Далее начинается бесконечный цикл While (пункт 13). В начале выполняется оператор For (пункты 14-18), который осуществляет последовательное занесение единц в портах. На каждом шаге цикла над содержимым портов выполняется операция ИЛИ с единицей, сдвинутой влево относительно младшего разряда на количество разрядов определяемое переменной Counter и результат заносится в порт. Таким образом в разряде порта окажется записана единица, которая зажигает светодиод. Так как, значение Counter после каждого прохода цикла увеличивается на единицу, единицы заносятся в последующих разрядах портов и следовательно во всех группах светодиоды зажигаются последовательно. Цикл завершается при заполнении всех разрядов портов единицами (когда counter=7) – загараются все светодиоды.

После некоторой задержки функцией Wait (пункт 19), начинается цикл гашения светодиодов. Для этого используется оператор цикла While (пункты 21-15). На каждом шаге цикла над содержимым портов ( в которых записали единицы) выполняется операция И с нулем, которая получается после инвертирования сдвинутой влево единицы на количество разрядов определяемых переменной counter. В начале цикла переменная указывает на младший разряд порта и следовательно нуль заносится в этот разряд. В следствие соответствующие светодиоды погаснут. В процессе выполнения цикла значение counter увеличивается на единицу, указывая на последующие разряды портов, в которых заносятся нули.

Таким образом светодиоды будут гаснуть последовательно в том же порядке, как и при зажигании. Цикл продолжается до достижения значения counter=7 ( занесения нулей во все разряды портов), т.е. погашения всех светодиодов. После задержки (пункт 26), программа переходит к началу цикла While (пункт 13).

выводеводе     2.3. Преобразователь аналоговых сигналов в цифравую форму (АЦП).       Сформулируем задачу следующим образом:   Спроектировать схему преобразователя аналогового сигнала в цифровой формат, с выводом результата в двоичном коде. Принципиальная электрическая схема Для этой цели используем АЦП, встроенный в микроконтроллер Atmega 128. В качестве входов блока АЦП предусмотрены выводы порта РС, каждый из которых может быть подключен к нему занесением соответствующего кода в регистр ADMUX. Выберем для нашего проекта вход РС2, на который будет подаваться преобразуемый аналоговый сигнал . Сигналы могут поступать из различных датчиков (сенсоров) в виде напряжения. На входы микроконтроллеров значения подаваемых сигналов ограничены- они не должны выше питания контроллера. По этому если величина преобразуемого сигнала выше указанного ограничения то они будут подаваться через потенциометры. Результатом преобразования является десятиразрядный двоичный код. От разрядности двоичного кода полученного результата во многом зависит точность преобразования- чем больше количество разрядов, тем выше точность. Для вывода результата преобразования используем светодиоды, котрых будем подключать к портам микропроцессора. Так как код результата имеет 10 разрядов, а каждый порт - восемь выводов, то используем два порта РВ и РD. Через РВ будем выводить младшие 8 разряд, через РD старшие 2 разряда. Ниже приводится схема устройства (Рис.2.2) .              

 
PB0 PB1 PB2 PC2 PB3 PB4 PB5 PB6 PB7     PD0 PD1    
Аналоговый сигнал
Atmega 128
Програма на языке Си - №1 - открытая онлайн библиотека

Рис.2.2

Алгоритм