Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Thermometer(ElkinAlexanderCoorse.09-V1.2012).docx
Скачиваний:
30
Добавлен:
28.03.2015
Размер:
734.51 Кб
Скачать
    1. Алгоритм получения одного байта от датчика

Для получения очередного разряда от датчика подается низкий уровень на датчик, производится небольшая задержка, затем опрашивается порт. Датчик поддерживает нулевой потенциал на шине, если разряд равен нулю, на протяжении 60 мкс.

Код функции для получения байта от датчика:

char ReadByte()

{

unsigned char i;

unsigned char inputByte;

unsigned char value;

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

{

// Низкий уровень на датчик

PORTA=0x00;

TRISA=0xFD;

TRISA=0xFF;

// Задержка

#asm

CLRWDT

NOP

NOP

#endasm

value=PORTA;

if (value & 0x03)

{

// сдвинуть число и добавить единицу в старший разряд

inputByte = (inputByte >> 1) | 0x80;

}

else

{

inputByte = inputByte >> 1;

}

Delay10Microsecond(6);

}

return(inputByte);

}

    1. Структура программы

Блок подключения библиотек для работы с микроконтроллером

Блок макроподстановок

Блок объявлений процедур и функций работы с датчиком, других процедур

Основной цикл программы.

Блок определений процедур и функций.

    1. Код программы

  1. #include <pic.h>

  2. __CONFIG(0x03F78);

  3. #define key1 RA7

  4. #define code0 0x03

  5. #define code1 0x9F

  6. #define code2 0x25

  7. #define code3 0x0D

  8. #define code4 0x99 //4

  9. #define code5 0x49

  10. #define code6 0x41

  11. #define code7 0x1F

  12. #define code8 0x01

  13. #define code9 0x09

  14. #define codeDP 0xFE

  15. #define codeS 0xFD

  16. #define seg7_1 RA2

  17. #define seg7_2 RA3

  18. #define seg7_3 RA6

  19. // Процедура задержки

  20. void Delay(unsigned char p);

  21. // Процедура задержки, кратная 10 микросекундам

  22. void Delay10Microsecond(unsigned char t);

  23. // Процедура задержки в миллисекундах

  24. void DelayMillisecond(unsigned char t);

  25. // Процедура инициализации датчика DS18B20

  26. void InitSensor(void);

  27. // Функция получения одного байта от датчика

  28. unsigned char ReadByte();

  29. // Отправка одного байта датчику

  30. void WriteByte(unsigned char outputByte);

  31. // Процедура отображения симовола на индикаторе

  32. void Display(char number, unsigned char position, unsigned char toh);

  33. void main(void)

  34. {

  35. unsigned int counter;

  36. unsigned char t;

  37. unsigned char t2;

  38. char buff[9];

  39. char temp;

  40. char temp_dec;

  41. char keyStart = 0;

  42. CMCON=0x07; // отключение компаратора

  43. while(1)

  44. {

  45. // Опрос клавиши Старт-Стоп

  46. TRISA = 0xFF;

  47. if(keyStart == 0)

  48. {

  49. DelayMillisecond(500);

  50. while (key1!=1);

  51. keyStart = 1;

  52. DelayMillisecond(400);

  53. }

  54. InitSensor();

  55. WriteByte(0xCC); // Команда обращения к всем 1-Wire устройствам

  56. WriteByte(0x44); // Команда запуска процесса температурного преобразования датчика DS18B20

  57. while (ReadByte()==0xFF); // Ожидание завершения преобразования

  58. InitSensor();

  59. WriteByte(0xCC); // Команда обращения к всем 1-Wire устройствам

  60. WriteByte(0xBE); // Команда считывания содержимого ОЗУ датчика DS18B20

  61. for (counter = 0; counter < 9; counter++)

  62. {

  63. buff[counter] = ReadByte();

  64. }

  65. temp = buff[0]>>1;

  66. if (buff[0] & 0x1)

  67. {

  68. temp_dec=5;

  69. }

  70. else

  71. {

  72. temp_dec=0;

  73. }

  74. if(temp>80)

  75. {

  76. temp = 127 - temp;

  77. if(temp_dec == 0)

  78. {

  79. temp += 1;

  80. }

  81. t = temp/10;

  82. t2 = temp%10;

  83. for(counter = 0; counter < 200; counter++)

  84. {

  85. Display(0, 1, 2);

  86. if(temp < 10)

  87. {

  88. Display(t2, 2, 0);

  89. Display(0, 2, 1);

  90. Display(temp_dec, 3, 0);

  91. }

  92. else

  93. {

  94. Display(t, 2, 0);

  95. Display(t2, 3, 0);

  96. }

  97. }

  98. }

  99. else

  100. {

  101. t = temp/10;

  102. t2 = temp%10;

  103. for(int counter = 0; counter < 200; counter++)

  104. {

  105. if(temp > 9)

  106. {

  107. Display(t,1,0);

  108. }

  109. Display(t2, 2, 0);

  110. Display(0, 0, 1);

  111. Display(temp_dec,3,0);

  112. }

  113. }

  114. // Опрос клавиши Старт-Стоп

  115. TRISA = 0xFF;

  116. if(key1==1)

  117. {

  118. keyStart = 0;

  119. DelayMillisecond(500);

  120. }

  121. }

  122. }

  123. // Процедура инициализации датчика DS18B20

  124. // Датчик подключен к RA1

  125. void InitSensor(void)

  126. {

  127. // подаем на датчик высокий уровень, затем "проваливаем" шину

  128. TRISA = 0xFF;

  129. PORTA = 0x00;

  130. TRISA = 0xFD;

  131. Delay10Microsecond(50);

  132. // высокий уровень

  133. TRISA = 0xFF;

  134. Delay10Microsecond(50);

  135. }

  136. // Отправка одного байта датчику

  137. void WriteByte(unsigned char outputByte)

  138. {

  139. unsigned char i;

  140. for (i = 0; i < 8; i++)

  141. {

  142. if (outputByte & 0x01)

  143. {

  144. // Низкий уровень на датчик

  145. PORTA = 0x00;

  146. TRISA = 0xFD;

  147. // Высокий уровень на 60 микросекунд

  148. TRISA = 0xFF;

  149. Delay10Microsecond(6);

  150. }

  151. else

  152. {

  153. // Низкий уровень на 60 микросекунд

  154. PORTA = 0x00;

  155. TRISA = 0xFD;

  156. Delay10Microsecond(6);

  157. // Отключить выводы порта

  158. TRISA = 0xFF;

  159. }

  160. outputByte = outputByte>>1; // Обработка следущего разряда

  161. }

  162. }

  163. // Функция получения одного байта от датчика

  164. char ReadByte()

  165. {

  166. unsigned char i;

  167. unsigned char inputByte;

  168. unsigned char value;

  169. for (i = 0; i < 8; i++)

  170. {

  171. // Низкий уровень на датчик

  172. PORTA=0x00;

  173. TRISA=0xFD;

  174. TRISA=0xFF;

  175. // Задержка

  176. #asm

  177. CLRWDT

  178. NOP

  179. NOP

  180. #endasm

  181. value=PORTA;

  182. if (value & 0x03)

  183. {

  184. // сдвинуть число и добавить единицу в старший разряд

  185. inputByte = (inputByte >> 1) | 0x80;

  186. }

  187. else

  188. {

  189. inputByte = inputByte >> 1;

  190. }

  191. Delay10Microsecond(6);

  192. }

  193. return(inputByte);

  194. }

  195. // Процедура задержки

  196. void Delay(unsigned char steps)

  197. {

  198. unsigned char i;

  199. for(i = 0; i < steps; i++){asm("NOP");}

  200. }

  201. // Процедура задержки в миллисекундах

  202. void DelayMillisecond(unsigned char ms)

  203. {

  204. do

  205. {

  206. Delay10Microsecond(100);

  207. }

  208. while(--ms);

  209. }

  210. // Процедура задержки, кратная 10 микросекундам

  211. void Delay10Microsecond(unsigned char microsecondX10)

  212. {

  213. while (microsecondX10--)

  214. {

  215. #asm

  216. CLRWDT

  217. NOP

  218. NOP

  219. #endasm

  220. }

  221. }

  222. void Display(char number, char position, char attribute)

  223. {

  224. TRISB = 0xFF;

  225. // Порт RA2, RA3, RA6 на вывод

  226. TRISA=0xB3;

  227. switch(position)

  228. {

  229. case 1 :

  230. seg7_1 = 1;

  231. seg7_2 = 0;

  232. seg7_3 = 0;

  233. break;

  234. case 2 :

  235. seg7_1 = 0;

  236. seg7_2 = 1;

  237. seg7_3 = 0;

  238. break;

  239. case 3 :

  240. seg7_1 = 0;

  241. seg7_2 = 0;

  242. seg7_3 = 1;

  243. break;

  244. }

  245. if(attribute == 2)

  246. {

  247. PORTB = codeS;

  248. }

  249. else if(attribute == 1)

  250. {

  251. PORTB = codeDP;

  252. }

  253. else

  254. {

  255. switch(number % 10)

  256. {

  257. case 0 :

  258. PORTB = code0;

  259. break;

  260. case 1 :

  261. PORTB = code1;

  262. break;

  263. case 2 :

  264. PORTB = code2;

  265. break;

  266. case 3 :

  267. PORTB = code3;

  268. break;

  269. case 4 :

  270. PORTB = code4;

  271. break;

  272. case 5 :

  273. PORTB = code5;

  274. break;

  275. case 6 :

  276. PORTB = code6;

  277. break;

  278. case 7 :

  279. PORTB = code7;

  280. break;

  281. case 8 :

  282. PORTB = code8;

  283. break;

  284. case 9 :

  285. PORTB = code9;

  286. break;

  287. }

  288. }

  289. TRISB=0x00;

  290. DelayMillisecond(1);

  291. TRISA = 0xFF;

  292. }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]