- •Оглавление
- •Введение.
- •1 Выбор и обоснование основных технических решений.
- •1.1 Техническое задание
- •1.1 Источники информации
- •1.2 Приемники информации
- •1.2 Возможные варианты решения поставленной задачи, обоснования выбора
- •1.2.1 Выбор способа измерения температуры
- •1.2.2 Выбор устройства отображения информации
- •1.2.3 Выбор микроконтроллера
- •2 Структурная схема
- •2.1 Описание принципа действия и общий алгоритм работы
- •2.2 Блок-схема работы микроконтроллера
- •Алгоритм получения одного байта от датчика
- •Структура программы
- •Код программы
- •Технология отладки программы
- •Моделирование
- •7 Список литературы
Алгоритм получения одного байта от датчика
Для получения очередного разряда от датчика подается низкий уровень на датчик, производится небольшая задержка, затем опрашивается порт. Датчик поддерживает нулевой потенциал на шине, если разряд равен нулю, на протяжении 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);
}
Структура программы
Блок подключения библиотек для работы с микроконтроллером |
Блок макроподстановок |
Блок объявлений процедур и функций работы с датчиком, других процедур |
Основной цикл программы. |
Блок определений процедур и функций. |
Код программы
#include <pic.h>
__CONFIG(0x03F78);
#define key1 RA7
#define code0 0x03
#define code1 0x9F
#define code2 0x25
#define code3 0x0D
#define code4 0x99 //4
#define code5 0x49
#define code6 0x41
#define code7 0x1F
#define code8 0x01
#define code9 0x09
#define codeDP 0xFE
#define codeS 0xFD
#define seg7_1 RA2
#define seg7_2 RA3
#define seg7_3 RA6
// Процедура задержки
void Delay(unsigned char p);
// Процедура задержки, кратная 10 микросекундам
void Delay10Microsecond(unsigned char t);
// Процедура задержки в миллисекундах
void DelayMillisecond(unsigned char t);
// Процедура инициализации датчика DS18B20
void InitSensor(void);
// Функция получения одного байта от датчика
unsigned char ReadByte();
// Отправка одного байта датчику
void WriteByte(unsigned char outputByte);
// Процедура отображения симовола на индикаторе
void Display(char number, unsigned char position, unsigned char toh);
void main(void)
{
unsigned int counter;
unsigned char t;
unsigned char t2;
char buff[9];
char temp;
char temp_dec;
char keyStart = 0;
CMCON=0x07; // отключение компаратора
while(1)
{
// Опрос клавиши Старт-Стоп
TRISA = 0xFF;
if(keyStart == 0)
{
DelayMillisecond(500);
while (key1!=1);
keyStart = 1;
DelayMillisecond(400);
}
InitSensor();
WriteByte(0xCC); // Команда обращения к всем 1-Wire устройствам
WriteByte(0x44); // Команда запуска процесса температурного преобразования датчика DS18B20
while (ReadByte()==0xFF); // Ожидание завершения преобразования
InitSensor();
WriteByte(0xCC); // Команда обращения к всем 1-Wire устройствам
WriteByte(0xBE); // Команда считывания содержимого ОЗУ датчика DS18B20
for (counter = 0; counter < 9; counter++)
{
buff[counter] = ReadByte();
}
temp = buff[0]>>1;
if (buff[0] & 0x1)
{
temp_dec=5;
}
else
{
temp_dec=0;
}
if(temp>80)
{
temp = 127 - temp;
if(temp_dec == 0)
{
temp += 1;
}
t = temp/10;
t2 = temp%10;
for(counter = 0; counter < 200; counter++)
{
Display(0, 1, 2);
if(temp < 10)
{
Display(t2, 2, 0);
Display(0, 2, 1);
Display(temp_dec, 3, 0);
}
else
{
Display(t, 2, 0);
Display(t2, 3, 0);
}
}
}
else
{
t = temp/10;
t2 = temp%10;
for(int counter = 0; counter < 200; counter++)
{
if(temp > 9)
{
Display(t,1,0);
}
Display(t2, 2, 0);
Display(0, 0, 1);
Display(temp_dec,3,0);
}
}
// Опрос клавиши Старт-Стоп
TRISA = 0xFF;
if(key1==1)
{
keyStart = 0;
DelayMillisecond(500);
}
}
}
// Процедура инициализации датчика DS18B20
// Датчик подключен к RA1
void InitSensor(void)
{
// подаем на датчик высокий уровень, затем "проваливаем" шину
TRISA = 0xFF;
PORTA = 0x00;
TRISA = 0xFD;
Delay10Microsecond(50);
// высокий уровень
TRISA = 0xFF;
Delay10Microsecond(50);
}
// Отправка одного байта датчику
void WriteByte(unsigned char outputByte)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (outputByte & 0x01)
{
// Низкий уровень на датчик
PORTA = 0x00;
TRISA = 0xFD;
// Высокий уровень на 60 микросекунд
TRISA = 0xFF;
Delay10Microsecond(6);
}
else
{
// Низкий уровень на 60 микросекунд
PORTA = 0x00;
TRISA = 0xFD;
Delay10Microsecond(6);
// Отключить выводы порта
TRISA = 0xFF;
}
outputByte = outputByte>>1; // Обработка следущего разряда
}
}
// Функция получения одного байта от датчика
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);
}
// Процедура задержки
void Delay(unsigned char steps)
{
unsigned char i;
for(i = 0; i < steps; i++){asm("NOP");}
}
// Процедура задержки в миллисекундах
void DelayMillisecond(unsigned char ms)
{
do
{
Delay10Microsecond(100);
}
while(--ms);
}
// Процедура задержки, кратная 10 микросекундам
void Delay10Microsecond(unsigned char microsecondX10)
{
while (microsecondX10--)
{
#asm
CLRWDT
NOP
NOP
#endasm
}
}
void Display(char number, char position, char attribute)
{
TRISB = 0xFF;
// Порт RA2, RA3, RA6 на вывод
TRISA=0xB3;
switch(position)
{
case 1 :
seg7_1 = 1;
seg7_2 = 0;
seg7_3 = 0;
break;
case 2 :
seg7_1 = 0;
seg7_2 = 1;
seg7_3 = 0;
break;
case 3 :
seg7_1 = 0;
seg7_2 = 0;
seg7_3 = 1;
break;
}
if(attribute == 2)
{
PORTB = codeS;
}
else if(attribute == 1)
{
PORTB = codeDP;
}
else
{
switch(number % 10)
{
case 0 :
PORTB = code0;
break;
case 1 :
PORTB = code1;
break;
case 2 :
PORTB = code2;
break;
case 3 :
PORTB = code3;
break;
case 4 :
PORTB = code4;
break;
case 5 :
PORTB = code5;
break;
case 6 :
PORTB = code6;
break;
case 7 :
PORTB = code7;
break;
case 8 :
PORTB = code8;
break;
case 9 :
PORTB = code9;
break;
}
}
TRISB=0x00;
DelayMillisecond(1);
TRISA = 0xFF;
}