Програма на языке Си
Программа имеет следующий вид:
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).
PB0 PB1 PB2 PC2 PB3 PB4 PB5 PB6 PB7 PD0 PD1 |
Аналоговый сигнал |
Atmega 128 |
Рис.2.2
Алгоритм
Дата добавления: 2016-12-27; просмотров: 1908;