Читайте также:
|
|
Оператор break имеет два назначения. Первое – это окончание работы оператора switch. Второе – это принудительное окончание цикла, минуя стандартную проверку условия. Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом.
Рассмотрим пример использования оператора break для досрочного прекращения работы цикла for.
#include<reg51.h>
unsigned char in_port1;
void main(void)
{
int x;
P1 = 0xFF; // настроить порт Р1 на ввод
in_port1 = P1; // ввод числа из порта Р1
for(x = 0; x < 100; x++)
{
P2 = x; // вывод в порт Р2
if (x == in_port1)
break; // прекращение цикла вывода
}
while(1);
}
Работа оператора continue чем-то похожа на работу оператора break. Но вместо форсированного окончания цикла оператор continue переходит к следующей итерации цикла, пропуская оставшийся код тела цикла.
Рассмотрим программу, в которой оператор continue используется для отбрасывания нечетных сумм.
#include<reg51.h>
int sum = 0; // сумма чисел
int sum_even = 0; // накопленная сумма четных сумм
void main(void)
{
int i;
for(i = 1; i < 15; i++)
{
sum += i; // вычисление суммы чисел
if (sum % 2) // проверка суммы чисел на четность
continue;
sum_even += sum; // накопление четных сумм
}
while(1);
}
В программе continue.c производится вычисление суммы чисел и накопление четных сумм в переменной sum_even. Когда сумма чисел от 1 до i становится нечетной (это проверяется операцией sum % 2 – определением остатка от деления на 2), оператор continue передает управление на очередное повторение цикла for, не выполняя оператор sum_even += sum накопления четных сумм.
Оператор goto (идти к ….) – это безусловный переход на метку. Метка – это идентификатор Си, завершающийся двоеточием. Пример записи оператора goto:
goto label;
……….
label: …….
Рассмотрим простейшую программу, где используется оператор перехода goto.
#include<reg51.h>
void main(void)
{
char x = 1;
loop:
x++;
if (x < 10)
goto loop;
while(1);
}
В программе goto.c реализуется цикл инкремента переменной x от 1 до 10 с помощью оператора goto и метки loop. Очевидно, что такой цикл можно было бы реализовать и с использованием операторов while или for.
Программирование параллельным вводом/выводом в С51: операторы управления портами и отдельными разрядами портов. Примеры программ управления светодиодами и опроса контактов переключателей.
Микроконтроллеры семейства MCS-51 имеют несколько портов ввода/вывода, позволяющих получать информацию от внешних устройств (ввод данных) или отправлять данные внешним устройствам (вывод данных). Стандартный МК 8051 имеет четыре 8-разрядных порта, которые нумеруются цифрами: порт 0, порт 1, порт 2 и порт 3. Все порты являются двунаправленными, то есть они могут использоваться как для ввода, так и для вывода.
Управление портами производится при помощи так называемых регистров специальных функций (РСФ). Каждый из четырех портов имеет свой РСФ, они именуются, соответственно, как Р0, Р1, Р2 и Р3.
В заголовочном файле reg51.h переменные Р0-Р3 объявляются с помощью ключевого слова sfr как регистры специальных функций.
Объявив имена портов как РСФ, мы можем их использовать для записи данных или чтения данных.
Например, мы можем послать какие-либо данные в порт Р1 следующим образом:
P1 = 0xF0; // записать 11110000 в порт 1
Операцию предварительной записи единиц в регистры-защелки порта часто называют настройкой порта на ввод или настройкой на режим чтения.
Таким образом, для чтения данных из порта Р1 нужно выполнить следующий код программы:
unsigned char port_data; // объявление однобайтной переменной
// для хранения введенных данных
P1 = 0xFF; // настроить порт 1 на ввод
port_data = P1; // чтение (ввод) из порта 1
По сигналу сброса RST в регистры-защелки всех портов МК 8051 автоматически записываются единицы, настраивающие их тем самым на режим ввода.
В языке С51 имеется возможность доступа к отдельным разрядам (битам) регистров специальных функций, в частности, к разрядам (линиям) портов Р0-Р3. Для этого используется ключевое слово sbit.
Например, для доступа к разряду 0 порта Р2 (линия Р2.0) можно создать битовую переменную с именем Р2_0 следующим образом:
sbit P2_0 = P2^0;
Здесь символ “^” означает доступ к разряду 0 порта Р2. В классическом Си этот символ обозначает поразрядную операцию Исключающее ИЛИ.
С использованием переменной Р2_0 мы можем записывать (выводить) данные на линию Р2.0 порта:
P2_0 = 1; // вывести 1 на линию Р2.0 порта Р2
P2_0 = 0; // вывести 0 на линию Р2.0 порта Р2
При чтении (вводе) с выводов порта (ножки микросхемы) необходимо предварительно объявить битовую переменную, в которой будут храниться введенные данные. Это объявление в С51 выполняется с использованием ключевого слова bit. Битовая переменная может принимать одно из двух значений: 0 или 1. Вот пример объявления битовых переменных:
bit my_bit;
bit bit0;
Для хранения битовых переменных используется внутренняя область памяти данных МК (ячейки памяти с адресами 20H – 2FH), обладающая свойством поразрядной адресации.
Таким образом, для чтения данных (вводе) с линии порта Р2.7 нужно выполнить следующий код программы:
sbit P2_7 = P2^7; // объявление переменной P2_7
bit bit2_7; // объявление переменной bit2_7
P2_7 = 1; // настроить линию Р2.7 на ввод
bit2_7 = P2_7; // чтение состояния линии порта Р2.7
Следует отметить, что переменные, объявленные с помощью ключевого слова sbit, могут быть только глобальными, т.е. их нельзя объявлять в теле функции, где они используются, в том числе и main().
/*программа переключения светодиода */
#include<reg51.h>
void delay_ms(unsigned int MS); // прототип функции задержки
sbit P2_0 = P2^0;
void main(void)
{
while(1)
{
P2_0 = 0; // зажечь светодиод
delay_ms(1000); // задержка на 1000 мс = 1 с
P2_0 = 1; // погасить светодиод
delay_ms(1000);
}
}
void delay_ms(unsigned int MS) // функция задержки
{
unsigned int i, j;
for(i = 0; i < MS; i++)
for(j = 0; j < 123; j++);
}
/* программа управления светодиодом VD1 от кнопки SB1 */
#include<reg51.h>
sbit P1_0 = P1^0;
sbit P2_0 = P2^0;
void main(void)
{
bit bit1_0;
while(1)
{
while((bit1_0 = P1_0) == 1); // ожидание замыкания контакта SB1
P2_0 = 0; // зажечь светодиод
while((bit1_0 = P1_0) == 0); // ожидание размыкания контакта SB1
P2_0 = 1; // погасить светодиод
}
}
Дата добавления: 2015-12-07; просмотров: 68 | Нарушение авторских прав