Операции начальной настройки


· настроим выводы порта РС на выход, подключение конкретного входа порта РС к входам дисплея. Остальные настройки оставим по умолчанию.

Операции составляющие тело программы

· очистить экран дисплея;

· выключить курсор;

· запустить преобразование в датчике температуры;

· прочесть результат преобразования в микроконтроллер;

· вывести значение температуры на дисплей.

Программа на Си

// настройка связей модуля LCD c микроконтроллером

1. sbitLCD_RS at POTC2 bit;

2. sbit LCD_EN at POTC3 bit;

3. sbit LCD_D4 at POTC4 bit;

4. sbitLCD_D5 atPOTC5 bit;

5. sbit LCD_D6 atPOTC6 bit;

6. sbit LCD_D7 atPOTC7 bit;

//настройка направления передачи выводов микроконтроллера

7. sbit LCD_RS_Direction atPOTC2 bit;

8. sbit LCD_EN_Direction at POTC3 bit;

9. sbit LCD_D4_Direction at POTC4 bit;

10. sbit LCD_D5_Direction atPOTC5 bit;

11. sbit LCD_D6_Direction at POTC6 bit;

12. sbitLCD_D7_Direction atPOTC7 bit;

// установка разрешения, используемого модулем

13.const unsigned short TEMP_RESOLUTION=9;

14.char *text=”000.0000”;

15. unsignedtemp;

16. void Display_Temperature (unsignedint temp2write) {

17. const unsigned short RES_SHIFT=TEMP_RESOLUTION-8;

18.chartemp_whole; // объявление переменной для целой части

19.unsigned init temp_fraction; // объявление переменной для дробной части

// Проверка знака температуры

20. if (temp2write & 0x8000) {

21. text [0]= ‘ – ‘ ;

22. temp2write = ~temp2write +1; //преобразование отрицательного числа в прямой код

}

23. temp_whole = temp_whole >> RES_SHIFT; // выделение цалой части

// преобразование цедой части в символы

24. if(temp_whole/100)

25. text [1] = temp_whole/100+48; //определенние сотни

Else

26. text [1]=’0’;

27. text [2] =( temp_whole/10)%10+48; // определение десятка

28. text [3] = temp_whole%10+48; // определение единиц

// выделение дробной части

29. temp_fraction = temp2write <<( 4- RES_SHIFT);

30. temp_fraction &= 0x0F;

31. temp_fraction *= 625;

// преобразование кода дробной части в символы

32. text [4]= temp_fraction/1000 +48;

33. text [5]=( temp_fraction/100)%10 +48;

34. text [6]=( temp_fraction/10)%10 +48;

35. text [7]= temp_fraction%10 +48;

36. Lcd_Out (2,5,txt); //вывод значения температуры на дисплей

} }

} 37. void main () {

338.Lcd_Init ( ); //инициализация LCD

339.Lcd_Cmd (_LCD_CLEAR); //очистка экрана

340. Lcd_Cmd (_LCD_CURSOR_OFF); // сброс курсора

41.Lcd_Out (1,1,” Temperature : “); // вывод текста на экран

42. Lcd_Chr (2,13,223); //вывод на экран символа градуса

43. Lcd_Chr (2,14, ‘C’); //вывод символа С

44. do {

45. Ow_Reset (& PORB,0); //сигнал обнуления бита 0 PORTB

46. Ow_Write ( & PORTB,0, 0xCC); // выдача команды дисплея SKIP_ROM

47. Ow_ Write (& PORTB,0, 0x44); //выдача команды дисплея CONVERT_T

48. Delay_us (120);

49. Ow_Reset (& PORB,0);

50. Ow_Write ( & PORTB,0, 0xCC);

51 Ow_Write ( & PORTB,0, 0xBE); // выдача команды дисплея READ_SCRATCHPAD

52.temp = Ow_Read (&PORTB,0); .//чтение младшего байта результата преобразования

53.temp= Ow_Read (&PORTB,0)+ temp; // формирование полного результата преобразования

54. Display_Temperature (temp); //выдача результата на дисплей

54. Delay_ms (500);

}

55. while (1); // переход к началу бесконечного цикла

}

Программа начинается с установления контактов между выводами порта C и входами дисплея (пункты 1-6), а также определяется направление передачи для выводов порта C ( пункты 7-12) c использхованием функций, рассмотренных в предидущем задании.

Далее представляются некоторые переменные: TEMP_RESOLUTION идентификатор объявлен как константа, ему присваивается значение 9, что соответствует разрешению преобразования ( количеству разрядов полученного двоичного кода), которое в данной программе берется по умолчанию; text - указатель начала массива символов, в котором записываются выводимые на дисплей символы; temp- переменная типа int, в котораой заносится результат преобразования из дисплея.

С пункта 16 определяется функция Display_Temperature,выводящая считанные из датчика значения на дисплей. Полученный результат преобразования содержит целую и дробную часть. Количество разрядов дробной части зависит от разрешения ( разрядов кода и диапазона измерения). При разрешении 9, которое мы выбрали в данной задаче, дробная часть занимает один младший разряд. Количество дробных разрядов фиксируется в переменной RES_SHIFT(пункт 17).В пунктах 18 и 19 представлены переменные temp_wholeи temp_fractionв которых занесем целую и дробную часть, соответственно.

Значение температуры может быть положителным или отрицательным. Отрицательное значение представляется в дополнительном коде. Очевидно, для вывода температуры на дисплей она должна быть представлена в прямом коде .

В пункте 20 проверяется знак, по состоянию старшего разряда кода в скобочном выражении операторомif( указанный разряд выделяется кодом 0х8000 в переменной temp2write, в которой записан код ). Если в нем содержится единица (т.е. отрицательное число), то в первый элемент массива text заносится символ “ - “ ( пункт 21) и берется дополнительный код от дополнительного кода отрицательного числа ( переводится в прямой код) (пункт 22).

В пункте 23 выделяется целая часть сдвигом переменной на один разряд вправо ( на значение RES_SHIFT,удаляя тем самым дробный разряд) и результат записывается в temp_whole.

С пункта 24 начинается вычисление десятичных значений целой части кода: сотен, десятков и единиц. К каждому символу добавляется 48, для представления в ASCII коде, что необходимо для вывода их на дисплей. Полученные символы сохраняются в последующих элементах массива text.

С пункта 29 начинается определение значения дробной части кода. Выявленные символы также записываются в последующих элементах массива text.

В пункте 36 функцией Lcd_Out (2,5,txt) на дисплей выводятся значение температуры, содержащееся в массиве text во второй строке с пятой позиции.

С пункта 37 начинается главная программа. В начале программы в пунктах 38,39,40 выполняются инициализация дисплея, очистка зкрана и сброс курсора.

В пункте 41 на екран выводится текст ” Temperature : “ .

В пункте 42 выводится знак градуса ( Значение 223 является кодом указанного символа).

В пункте 43 выводится символ ‘C’.

С пункта 44 выполняются цикл do-while. При этом используются стандартные функции обращения микроконтроллера к датчику температуры по интерфейсу 1- wire. В пункте 45 с вывода PORTB.0 выдается сигнал обнуления,что переводит датчик в исходное состояние.

В пункте 46 по тому же выводу выдается код команды SKIP_ROM (0хСС), которая подготавливает датчик к выполнению последующей функциональной команды (см. описание датчика).

В пункте 47 высылается команда CONVERT_T (0х44) запускающая преобразование в датчике.

В В пункте 49 датчик снова приводится в исходное состояние и далее после выдачи команды SKIP_ROM, высылается команда READ_SCRATCHPAD (0хВЕ) (пункт 51)- чтение из памяти датчика. Т.к. результат преобразования соденжится в двух байтовых ячейках в датчике, сначала считывается младший байт в temp двухбайтовую переменную ( пункт 52), а за-тем старший байт, котрый размещается в старших разрядах temp. Далее выполняется функция Display_Temperature –вывод значения температуры на дисплей.

После задержки 500 мс цикл повторяется.

 



Дата добавления: 2016-12-27; просмотров: 1708;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.