Interface PIC16F877A-DS1620 final... Yahoo!
Các bác nào quan tâm về cảm biến nhiệt độ DS1620 thì vào đây, code nè:
Code:
//*---------------------------------------------------------------------
//* Tac gia : Pham Thanh Cong
//* Ngay viet : 18/06/2008
//* Ngay hoan thanh : 26/07/2008
//* Phan cung : PIC16F877A, LCD 2x16[5x7]
//* Chuong trinh : do nhiet do dung DS1620 hien thi tren LCD LMB162A
//*===================================================*/
// Khoi tien xu ly
#include <16F877A.h>
#include <stdlib.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP // dat cau hinh cho PIC
#use delay(clock=4000000)
#use fast_io(A) // su dung cung voi lenh set_tris
#use fast_io(B)
#use fast_io(D)
#byte PORTB = 0x06
#define LCD PORTB
#bit RA2 = 0x05.2
#bit RA1 = 0x05.1
#bit RA0 = 0x05.0
#define RS RA0 // chan chon thanh ghi =0 lenh hay =1 du lieu
#define RW RA1 // =1 doc hay =0 ghi
#define E RA2 // H-to-L de cho fep LCD
#bit RD1 = 0x08.1 // chan data cua DS1620
#bit RD2 = 0x08.2 // chan dong ho
#bit RD3 = 0x08.3 //
#define DQ RD1 // =0 output, =1 input
#define CLK RD2
#define RST RD3
// khai bao cac ham su dung trong chuong trinh
void LCD_init(void);
void comandwrt(void);
void datawrt(void);
void LCD_gotoxy(byte x, byte y);
void DS1620_InitTemp(void);
unsigned int8 DS1620_GetTemp(void);
void DS1620_Write(unsigned char Data);
void DS1620_WriteTHTL(unsigned char Data, int dau);
unsigned int8 DS1620_Read(void);
void display(int8 temp);
void main(void);
// Cac bien toan cuc
const unsigned char dongchu[]="Nhiet do:"; // Hang so toan cuc
int i = 0, Sign = 0; // Bien toan cuc
//xxxxxxxxxxxxxxxxxxxxxx CHUONG TRINH LCD xxxxxxxxxxxxxxxxxxxxxxx
// Khoi tao cho LCD
void LCD_init()
{
delay_ms(50); // tre it nhat 30ms
LCD = 0x38; // Hai hang, ma tran diem 5*8, 8 bit interface
comandwrt();
delay_us(50); // tre it nhat 39us
LCD = 0x0C; // bat hien thi, tat con tro va tat nhap nhay
comandwrt();
delay_us(50); // tre it nhat 39us
LCD = 0x01; // xoa man hinh
comandwrt();
delay_ms(3); // tre it nhat 1.53ms
LCD = 0x06; // che do tang con tro sau khi viet 1 ki tu
comandwrt(); // va chu khong chay
delay_ms(1);
}
// Ham gui lenh ra LCD
void comandwrt(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
// Ham gui du lieu ra LCD
void datawrt(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
// Ham di chuyen con tro toi vi tri xy(cot,hang) tren man hinh LCD
void LCD_gotoxy(int x, int y)
{ int address;
switch(y)
{
case 1: address=0;
address+=x-1;
LCD = (0x80 + address); // dong 1, cot1: 80h
break;
case 2: address=0;
address+=x-1;
LCD = (0xC0 + address); // dong 2, cot1: C0h
break;
default : break;
}
}
//xxxxxxxxxxxxxxxxxxxxx CHUONG TRINH DS1620xxxxxxxxxxxxxxxxxxxxxx
// Khoi tao DS1620
void DS1620_InitTemp(void)
{
RST = 1; // thiet lap che do giao tiep 3-wire.
DS1620_Write(0x0C); // cho phep ghi config
DS1620_Write(0x08);
RST = 0;
RST = 1; // thiet lap che do giao tiep 3-wire
DS1620_Write(0xEE); // bat dau chuyen doi nhiet do
RST = 0;
}
void DS1620_Write(unsigned char Data)
{
set_tris_D(0); // cong D la cong ra
CLK = 1; // tao clock
for (i=1; i<=8; ++i)
{
DQ = (Data & 1); // viet bit thap len DQ
CLK = 0;
CLK = 1; // tao clock
Data = Data >> 1; // dich fai Data di 1 bit
}
}
void DS1620_WriteTHTL(unsigned char Data, int dau)
{
set_tris_D(0); // cong D la cong ra
CLK = 1; // tao clock
for (i=1; i<=8; ++i)
{
DQ = (Data & 1); // viet bit thap len DQ
CLK = 0;
CLK = 1; // tao clock
Data = Data >> 1; // dich fai Data di 1 bit
}
CLK = 1;
if (dau == 1) DQ = 1; // Lay gia tri bit dau, gui not bit9 di
else DQ = 0;
CLK = 0;
}
unsigned int8 DS1620_Read(void)
{
unsigned int8 Data, temp;
set_tris_D(0x02); // Chan DQ = 1 : chan vao, con lai la chan ra
Data = 0;
temp = 1;
CLK = 1;
for (i=1; i<=8; ++i)
{
CLK = 0; // CLK = 0: convert
if (DQ == 1) Data += Temp; //neu DQ = 1, cong don Data
Temp = Temp << 1; // neu DQ = 0, dich trai temp 1bit de chen 0 vao
CLK = 1;
}
CLK = 0;
if (DQ == 1) Sign = 1;// Lay gia tri bit dau
else Sign = 0;
CLK = 1;
return(Data);
}
unsigned int8 DS1620_GetTemp(void)
{
unsigned int8 Data;
RST =1; // thiet lap che do giao tiep 3-wire
DS1620_Write(0xAA); // lenh cho phep doc noi dung thanh ghi nhiet
data = DS1620_Read(); // doc noi dung
RST =0; // ket thuc che do giao tiep 3-wire
return(data);
}
void display(int8 temp)
{
int8 Data, leng;
unsigned char string[3];
if (sign == 1) // Nhiet do am
{
LCD_gotoxy(5,2);
comandwrt();
LCD = '-'; // Hien thi dau -
datawrt();
Data = ~(temp - 1) / 2; // neu nhiet do am thi lay ma bu 2
}
else { LCD_gotoxy(5,2); // Nhiet do duong
comandwrt();
LCD = '+'; // Hien thi dau +
datawrt();
Data = temp / 2;
}
itoa(Data,10,string); // Chuyen doi Data thanh ma ASCII vao string
leng = strlen(string); // Lay chieu dai cua string
if (bit_test(temp,0)) // kiem tra bit0 =1 suy ra nhiet do .5 doC
{
for(i=0;i<leng;i++)
{
LCD = string[i]; // xuat nhiet do ra o dang ki tu so
datawrt();
}
LCD = '.'; // hien thi phan thap phan .5 do C
datawrt();
LCD = '5';
datawrt();
LCD = ' ';
datawrt();
LCD = 'd';
datawrt();
LCD = 'o';
datawrt();
LCD = 'C';
datawrt();
}
else // bit0 =0 suy ra nhiet do .0 do C
{
for(i=0;i<leng;i++)
{
LCD = string[i]; // xuat nhiet do ra o dang ki tu so
datawrt();
}
LCD = '.'; // hien thi phan thap phan .0 do C
datawrt();
LCD = '0';
datawrt();
LCD = ' ';
datawrt();
LCD = 'd';
datawrt();
LCD = 'o';
datawrt();
LCD = 'C';
datawrt();
}
}
//xxxxxxxxxxxxxxxxxxxxxxxx Ham main xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
void main(void)
{
int8 data;
set_tris_B(0); // cong ra
set_tris_A(0); // cong ra
LCD_init(); // dat che do hoat dong cho LCD
delay_us(2);
DS1620_InitTemp(); // dat che do hoat dong cho DS1620
delay_us(10);
LCD_gotoxy(5,1); // Vi tri cot 5, hang 1
comandwrt();
for (i=0;i<=8;i++)
{
LCD = dongchu[i]; // xuat chu ra LCD
datawrt();
}
RST = 1;
DS1620_Write(0x01); // Dat gioi han nhiet do cao TH
DS1620_WriteTHTL(0x44,0); // TH = +34 do C
DS1620_Write(0x00); // qua thuc te phai co them lenh nay moi 'run ok'
RST = 0;
while(1)
{
RST = 1; // qua thuc te phai dat khoi lenh nay vao vong lap moi 'run ok'
DS1620_Write(0x02); // Dat gioi han nhiet do thap TL
DS1620_WriteTHTL(0x40,0); // TL = +32 do C
DS1620_Write(0x00);
RST = 0;
data = DS1620_GetTemp(); // lay du lieu
display(data); // hien thi du lieu
}
}
xxxxxxxxxxxxxxxxxxxxxxxxx HẾT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Chúc anh em vui!
Datasheet DS1620: