Pic16f84 kullanılarak yapılmış termometre devresi. Sıcaklık 2×16 LCD’de gösteriliyor. Program dili olarak C kullanılmış.

Devrede sıcaklık ölçümü için DS1820 ısı entegresi kullanılmış. DS1820’nin 1 nolu ucu GND, 3 nolu ucu VCC, 2 nolu ucu ise veri ucudur. Devrenin şeması aşağıdaki gibidir.

PIC16F84 İle LCD'li Termometre Devresi

Devrenin C kodları şöyledir:

temp84.c dosyası:

[code]
<pre>//================================================

#include <16F84A.h>
#use delay(clock=4000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT
#include <mylcd.c>
#include <ds1820.c>
//=====================================
// main program start here
//=====================================
void main(void)
{
int buff[9], sensor, n,temp,temp_dec;

delay_ms(50);
lcd_init();

while(true)
{
sensor=0;
init_ds1820(sensor);
write_ds1820_one_byte(0xcc, sensor); // skip ROM
write_ds1820_one_byte(0x44, sensor); // perform temperature conversion
while (read_ds1820_one_byte(sensor)==0xff); // wait for conversion complete
init_ds1820(sensor);
write_ds1820_one_byte(0xcc, sensor); // skip ROM
write_ds1820_one_byte(0xbe, sensor); // read the result

for (n=0; n<9; n++) // read 9 bytes but, use only one byte
{
buff[n]=read_ds1820_one_byte(sensor); // read DS1820
}
temp=buff[0]>>1;

if ((buff[0] & 0x1)==1)
temp_dec=5;
else
temp_dec=0;

lcd_putc("\f");
printf(lcd_putc,"Temp :\n");
printf(lcd_putc," %u.%u’C",temp,temp_dec);
delay_ms(1000);
}
} //enf of main program

[/code] 
mylcd.c dosyası:
[code]

struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
}
lcd;

#byte lcd = 6 // on to port B (at address 6)
#define set_tris_lcd(x) set_tris_b(x)
#define lcd_type 1 // 1 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 3),0xC,1,6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in

BYTE lcd_read_byte()
{
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}

void lcd_send_nibble( BYTE n )
{
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}

void lcd_send_byte( BYTE address, BYTE n )
{
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

void lcd_init()
{
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}

void lcd_gotoxy( BYTE x, BYTE y)
{
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0×80|address);
}

void lcd_putc( char c)
{
switch (c) {
case ‘\f’ : lcd_send_byte(0,1);
delay_ms(2);
break;
case ‘\n’ : lcd_gotoxy(1,2); break;
case ‘\b’ : lcd_send_byte(0,0×10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( BYTE x, BYTE y)
{
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
[/code] 
ds1820.c dosyası:
[code]
#BYTE TRISA=0x85
#BYTE PORTA=0x5
#BYTE STATUS=0x3
#define RP0 5
#define C 0

// The following are standard 1-Wire routines.
void make_ds1820_high_pin(int sensor)
{
TRISA = 0xff;
}

void make_ds1820_low_pin(int sensor)
{
PORTA = 0x00;
TRISA = 0xff & (~(0x01 << sensor));
}

// delay routines
void delay_10us(int t)
{
#asm
BCF STATUS, RP0
DELAY_10US_X:
CLRWDT
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ t, F
GOTO DELAY_10US_X
#endasm
}

void delay_ms(long t) // delays t millisecs
{
do
{
delay_10us(100);
} while(–t);
}

void init_ds1820(int sensor)
{
make_ds1820_high_pin(sensor);
make_ds1820_low_pin(sensor);
delay_10us(50);

make_ds1820_high_pin(sensor);
delay_10us(50);
}

int read_ds1820_one_byte(int sensor)
{
int n, i_byte, temp, mask;
mask = 0xff & (~(0x01<<sensor));
for (n=0; n<8; n++)
{
PORTA=0x00;
TRISA=mask;
TRISA=0xff;
#asm
CLRWDT
NOP
NOP
#endasm
temp=PORTA;
if (temp & ~mask)
{
i_byte=(i_byte>>1) | 0x80; // least sig bit first
}
else
{
i_byte=i_byte >> 1;
}
delay_10us(6);
}
return(i_byte);
}

void write_ds1820_one_byte(int d, int sensor)
{
int n, mask;
mask = 0xff & (~(0x01<<sensor));
for(n=0; n<8; n++)
{
if (d&0x01)
{
PORTA=0;
TRISA=mask; // momentary low
TRISA=0xff;
delay_10us(6);
}

else
{
PORTA=0;
TRISA=mask;
delay_10us(6);
TRISA=0xff;
}
d=d>>1;
}
}[/code] 
Devrenin C kaynak kodları ve HEX dosyası ektedir.

Yazıyla İlgili Dosyaları İndirmek İçin Aşağıdaki Dosyaları İndir Butonuna Tıklayın


Benzer Yazılar

PIC16F84 İle 0-9999 Sayıcı Devre – PBP

Devrede mikrodenetleyici olarak Pic16F84 kullanıldı. Programlama dili olarak da PicBasic Pro. Devre 0 ile 9999 arasında ileri geri sayım yapıyor

PIC16F84 ile 4’lü Tek Display İle 0-9999 Sayıcı

Devre 16F84 ile 0-9999 ileri geri sayıcı devresi. Devrede sayıları göstermek amacıyla 4 tane 7 segment display yerine 4lü tek display kullanılıyor. Bu da devrede kullanılan devre elemanı ve bağlantı sayısını azaltıyor

LM35 ile Isı Sensör Devresi

LM 35 3 bacaklı bir ısı sensörüdür görüntüsü transistöre benzer. pic 18f2550 ile hazırlanan bu devrede birleşik diplayleri sürmek için 7442 kullanıldı.

PIC16F84 İle 7×16 (112 LED) Kayan Yazı Devresi + PCB

PIC16F84 kullanılarak yapılmış bir kayan yazı devresi. Devrede 7 satır 12 sütundan oluşan 112 LED li bir ekran var.


Facebookta Paylas