Вот от сюда пример взял
http://radioparty.ru/prog-avr/program-c ... n2-ds18b20Что есть датчик что нету всегда Y
if(OK_Flag == 1) // åñëè äàò÷èê íå îòâåòèë
{
// ñòàâèì ïðî÷åðêè âî âñåõ ðàçðÿäàõ
lcd_dat('N');
}
else
{
lcd_dat('Y');
}
Вот мой код (на экране)
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#define RS PC0
#define EN PC1
int s = 0; // ïåðåìåííàÿ äëÿ õðàíåíèÿ ñåêóíä
int m = 0; // ïåðåìåííàÿ äëÿ õðàíåíèÿ ìèíóò
int z = 0; // ïåðåìåííàÿ äëÿ õðàíåíèÿ ÷àñû
//----------
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80, 0x40, 0x00};
volatile unsigned char segcounter = 0;
volatile int display1 = 0, display2 = 0, display3 = 0, display4 = 0;
unsigned char Temp_H = 0,Temp_L = 0,OK_Flag = 0,temp_flag;
/*** Èíèöèàëèçàöèÿ DS18B20 ***/
unsigned char DS18B20_init(void)
{
PORTD &= ~(1 << PD5); // óñòàíàâëèâàåì íèçêèé óðîâåíü
DDRD |= (1 << PD5);
_delay_us(490);
DDRD &= ~(1 << PD5);
_delay_us(68);
OK_Flag = (PIND & (1 << PD5)); // ëîâèì èìïóëüñ ïðèñóòñòâèÿ äàò÷èêà
// åñëè OK_Flag = 0 äàò÷èê ïîäêëþ÷åí, OK_Flag = 1 äàò÷èê íå ïîäêëþ÷åí
_delay_us(422);
return OK_Flag;
}
/*** Ôóíêöèÿ ÷òåíèÿ áàéòà èç DS18B20 ***/
unsigned char read_18b20(void)
{
unsigned char i;
unsigned char dat = 0;
for(i = 0;i < 8;i++)
{
DDRD |= (1 << PD5);
_delay_us(2);
DDRD &= ~(1 << PD5);
_delay_us(4);
dat = dat >> 1;
if(PIND & (1 << PD5))
{
dat |= 0x80;
}
_delay_us(62);
}
return dat;
}
/*** ôóíêöèÿ çàïèñè áàéòà â DS18B20 ***/
void write_18b20(unsigned char dat)
{
unsigned char i;
for(i = 0;i < 8;i++)
{
DDRD |= (1 << PD5);
_delay_us(2);
if(dat & 0x01)
{
DDRD &= ~(1 << PD5);
}
else
{
DDRD |= (1 << PD5);
}
dat = dat >> 1;
_delay_us(62);
DDRD &= ~(1 << PD5);
_delay_us(2);
}
}
// Ôóíêöèÿ çàïèñè êîìàíäû â ÆÊÈ
void lcd_com(unsigned char p)
{
PORTC &= ~(1 << RS); // RS = 0 (çàïèñü êîìàíä)
PORTC |= (1 << EN); // EN = 1 (íà÷àëî çàïèñè êîìàíäû â LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Âûäåëÿåì ñòàðøèé íèáë
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (êîíåö çàïèñè êîìàíäû â LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (íà÷àëî çàïèñè êîìàíäû â LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Âûäåëÿåì ìëàäøèé íèáë
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (êîíåö çàïèñè êîìàíäû â LCD)
_delay_us(100);
}
// Ôóíêöèÿ çàïèñè äàííûõ â ÆÊÈ
void lcd_dat(unsigned char p)
{
PORTC |= (1 << RS)|(1 << EN); // RS = 1 (çàïèñü äàííûõ), EN - 1 (íà÷àëî çàïèñè êîìàíäû â LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Âûäåëÿåì ñòàðøèé íèáë
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (êîíåö çàïèñè êîìàíäû â LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (íà÷àëî çàïèñè êîìàíäû â LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Âûäåëÿåì ìëàäøèé íèáë
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (êîíåö çàïèñè êîìàíäû â LCD)
_delay_us(100);
}
// Ôóíêöèÿ èíèöèàëèçàöèè ÆÊÈ
void lcd_init(void)
{
DDRC |= (1 << PC1)|(1 << PC0); // PC1, PC0 - âûõîäû
PORTC = 0x00;
DDRA = 0xFF; // ïîðò D - âûõîä
PORTA = 0x00;
_delay_ms(50); // Îæèäàíèå ãîòîâíîñòè ÆÊ-ìîäóëÿ
// Êîíôèãóðèðîâàíèå ÷åòûðåõðàçðÿäíîãî ðåæèìà
PORTA |= (1 << PA5);
PORTA &= ~(1 << PA4);
// Àêòèâèçàöèÿ ÷åòûðåõðàçðÿäíîãî ðåæèìà
PORTC |= (1 << EN);
PORTC &= ~(1 << EN);
_delay_ms(5);
lcd_com(0x28); // Øèíà 4 áèò, LCD - 2 ñòðîêè
lcd_com(0x08); // Ïîëíîå âûêëþ÷åíèå äèñïëåÿ
lcd_com(0x01); // Î÷èñòêà äèñïëåÿ
_delay_us(100);
lcd_com(0x06); // Ñäâèã êóðñîðà âïðàâî
_delay_ms(10);
lcd_com(0x0C); // Âêëþ÷åíèå äèñïëåÿ, êóðñîð íå âèäèì
}
ISR(TIMER1_COMPA_vect)
{
s++; // óâåëè÷èâàåì ïåðåìåííóþ êàæäóþ ñåêóíäó
if(s>59) // îáíóëÿåì ñåêóíäû ïîñëå 59
{
s=0;
m++;
}
if(m>59)
{
m=0;
z++;
}
if(z>59)
{
z=0;
}
TCNT1 = 0; //?????????? ????????? ???????? TCNT1
}
// Îñíîâíàÿ ïðîãðàììà
int main (void)
{
lcd_init(); // Èíèöèàëèçàöèÿ äèñïëåÿ
TCCR1A=0x00; //íàñòðîéêà òàéìåðà
TCCR1B=0x05;
TCNT1=0x00; //çäåñü óâåëè÷èâàþòñÿ òèêè
OCR1A=0x2dc7; //çàïèñûâàåì ÷èñëî â ðåãèñòð ñðàâíåíèÿ
TIMSK=0x10; //çàïóñêàåì òàéìåð
_delay_ms(50);
unsigned int tempint = 0,tempint1,tempint2,tempint3; // ïåðåìåííûå äëÿ öåëîãî çíà÷åíèÿ òåìïåðàòóðû
unsigned int temppoint = 0,temppoint1; // ïåðåìåííûå äëÿ äðîáíîãî çíà÷åíèÿ òåìïåðàòóðû
//sei();
while (1)
{
lcd_com(0x80); // Âûâîä â âåðõíþþ ëåâóþ ïîçèöèþ 1 ñòðîêè
lcd_dat(z/10+0x30); //âûâîä äåñÿòêîâ ÷àñîâ
lcd_dat(z%10+0x30); //âûâîä ÷àñîâ
lcd_dat(':');
lcd_dat(m/10+0x30); //âûâîä äåñÿòêîâ ìèíóò
lcd_dat(m%10+0x30); //âûâîä ìèíóò
lcd_dat(':');
lcd_dat(s/10+0x30); //âûâîä äåñÿòêîâ ñåêóíä
lcd_dat(s%10+0x30); //âûâîä ñåêóíä
if(OK_Flag == 1) // åñëè äàò÷èê íå îòâåòèë
{
// ñòàâèì ïðî÷åðêè âî âñåõ ðàçðÿäàõ
lcd_dat('N');
}
else
{
lcd_dat('Y');
}
DS18B20_init(); // èíèöèàëèçàöèÿ DS18B20
write_18b20(0xCC); // ïðîâåðêà êîäà äàò÷èêà
write_18b20(0x44); // çàïóñê òåìïåðàòóðíîãî ïðåîáðàçîâàíèÿ
_delay_ms(1000);
DS18B20_init(); // èíèöèàëèçàöèÿ DS18B20
write_18b20(0xCC); // ïðîâåðêà êîäà äàò÷èêà
write_18b20(0xBE); // ñ÷èòûâàåì ñîäåðæèìîå ÎÇÓ
Temp_L = read_18b20(); // ÷èòàåì ïåðâûå 2 áàéòà áëîêíîòà
Temp_H = read_18b20();
temp_flag = 1; // ôëàã çíàêà òåìïåðàòóðû ðàâåí 1(ïëþñ)
if(Temp_H &(1 << 3)) // ïðîâåðÿåì áèò çíàêà òåìïåðàòóðû íà ðàâåíñòâî åäèíèöå
{
signed int tmp;
temp_flag = 0; // ôëàã çíàêà ðàâåí 0(ìèíóñ)
tmp = (Temp_H <<
| Temp_L;
tmp = -tmp;
Temp_L = tmp;
Temp_H = tmp >> 8;
}
tempint = ((Temp_H << 4) & 0x70)|(Temp_L >> 4); // âû÷èñëÿåì öåëîå çíà÷åíèå òåìïåðàòóðû
tempint1 = tempint % 1000 / 100;
tempint2 = tempint % 100 / 10;
tempint3 = tempint % 10;
temppoint = Temp_L & 0x0F; // âû÷èñëÿåì äðîáíîå çíà÷åíèå òåìïåðàòóðû
temppoint = temppoint * 625; // òî÷íîñòü òåìïåðàòóðû
temppoint1 = temppoint / 1000;
if(temp_flag == 0) // åñëè ôëàã çíàêà òåìïåðàòóðû ðàâåí 0, â ïåðâîì ðàçðÿäå ñòàâèì ìèíóñ
tempint1 = 11;
if(tempint1 < 1) // åñëè ïåðâàÿ öèôðà çíà÷åíèÿ òåìïåðàòóðû ìåíüøå 1, òî ãàñèì 1 ðàçðÿä èíäèêàòîðà
tempint1 = 12;
if(tempint1 == 12 && tempint2 < 1) // åñëè ïåðâàÿ öèôðà ïîãàøåíà è âòîðàÿ öèôðà çíà÷åíèÿ òåìïåðàòóðû ìåíüøå 1, òî ãàñèì 2 ðàçðÿä èíäèêàòîðà
tempint2 = 12;
if(tempint2 < 1 && temp_flag == 0) // åñëè âòîðàÿ öèôðà çíà÷åíèÿ òåìïåðàòóðû ìåíüøå 1 è çíàê ðàâåí "ìèíóñ", òî ãàñèì 2 ðàçðÿä èíäèêàòîðà
tempint2 = 12;
// âûâîäèì çíà÷åíèÿ íà äèñïëåé
display1 = tempint1;
display2 = tempint2;
display3 = tempint3;
display4 = temppoint1;
lcd_dat(tempint1);
lcd_dat(tempint2);
lcd_dat(tempint3);
}
}