Операции начальной настройки
· настроим выводы порта РС на выход, подключение конкретного входа порта РС к входам дисплея. Остальные настройки оставим по умолчанию.
Операции составляющие тело программы
· очистить экран дисплея;
· выключить курсор;
· запустить преобразование в датчике температуры;
· прочесть результат преобразования в микроконтроллер;
· вывести значение температуры на дисплей.
Программа на Си
// настройка связей модуля 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; просмотров: 1807;