Исследование принципа работы микроконтроллеров семейства AVR, страница 2

sprintf(lcd_buffer,"%u DS1820\nDevice detcted",devices);

lcd_puts(lcd_buffer);

delay_ms(1000);

Отобразим РОМ код каждого устройства.

if (devices)

{

for (i=0; i<devices;i++)

{

sprintf(lcd_buffer,"Device #%u ROM\nCode is:", i+1);

lcd_clear();

lcd_puts(lcd_buffer);

delay_ms(1000);

lcd_clear();

for (j=0;j<8;j++)

{

sprintf(lcd_buffer,"%02X",rom_code[i][j]);

lcd_puts(lcd_buffer);

if (j==3) lcd_gotoxy (0,1);

};

delay_ms(1000);

};

}

else

while (1);    

Здесь остановка, если не было обнаружено никакого устройства

Измерим и отобразим температуры

while (1)

{

// Place your code here

for (i=0;i<devices;)

{

temp=ds1820_temperature_10(&rom_code[i][0]);

sprintf(lcd_buffer,"t%u=%i.%u\xdfC",++i,temp/10,abs(temp%10));

lcd_clear();

lcd_puts(lcd_buffer);

delay_ms(100);

};

};

}

Краткое описание программы:

В этом файле знаками /* (начало) и */ (конец) выделены блоки с комментариями, а знаком // — строки с комментариями (см. Комментарии).

В блоке с комментариями (строки 1...28) даются рекомендации по подключению температурных датчиков к отладочной плате STK500.

В строках 30...33 объявляется, какой порт микроконтроллера и какой бит порта будут использованы для связи через протокол 1-Wire. Для этого в программу включён ассемблерный код. В строке 30 директива #asm говорит компилятору о начале ассемблерного кода, а в строке 33 директива #endasm  о его завершении (см. Директивы ttasm и ttendasm). В строке 31 директива ассемблера .equ присваивает значение идентификатору_wl_port. Это значение, соответствующее адресу регистра PORTx выбранного порта (в данном случае выбран Порт А), находим в файле 90s8515.h в соответствующей строке: «sfrb PORTA=Oxlb;». Этот файл находится в поддиректории ..\INC.

В строке 32 директива ассемблера .equ присваивает значение идентификатору_wl_bit. Это значение соответствует номеру соответствующего бита.

В следующем блоке с комментариями (строки 35...49) даются рекомендации по подключению к отладочной плате STK500 алфавитно-цифрового LCD-модуля 2x16.

В строках 51...53 объявляется, какой порт микроконтроллера будет использоваться для подключения LCD-модуля. Для этого в программу включён ещё один ассемблерный код. В строке 51 директива #asm говорит компилятору о начале ассемблерного кода, а в строке 53 директива #endasm  о его завершении (см. Директивы ttasm и ttendasm).

В строке 52 директива ассемблера .equ присваивает значение идентификатору_lcd_port. Это значение, соответствующее адресу регистра PORT* выбранного порта (в данном случае выбран Порт С), находим в файле 90s8515.h в соответствующей строке: «sfrb PORTC=Oxl5;».

При трансляции ассемблерного кода, полученного при компиляции данного проекта компилятором Си CodeVisionAVR, ассемблер вместо идентификаторов  wl_port, _wl_bit и_lcd_port подставит их значения.

Директивами #include (строки 55...59) подключаются: LCD-функции — файл Icd.h (см. LCD-функции для дисгиеев до 2x40 символов); функции DS1820/DS18S20 — файл dsl820.h (см. Функции температурного датчика DS1820/DS18S20 от Dallas Semiconductor); функции задержки — файл delay.h (см. Функции задержки); математические функции — файл math.h (см. Математические функции) и функции ввода/вывода — файл stdio.h (см. Стандартные функции ввода/вывода). Перед компиляцией препроцессор компилятора вставит вместо этих строк текст соответствующих файлов (см. Директива Uinclude).

В строке 61 объявляется глобальный символьный массив (строковая переменная) lcd_buffer, состоящий из 33 членов. Этот массив будет расположен в SRAM микроконтроллера. При этом все элементы этого массива автоматически инициализируются со значением 0 (см. Массивы). В этом массиве будет храниться информация, предназначенная для вывода на LCD.