View Single Post
Old 26-07-2008, 02:00 AM   #5
andyhug
Đệ tử 1 túi
 
andyhug's Avatar
 
Tham gia ngày: Jun 2008
Nơi Cư Ngụ: Lê Duẩn - Hà Nội
Bài gửi: 23
:
Thumbs up

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:
File Kèm Theo
File Type: pdf DS1620.pdf (196.4 KB, 187 lần tải)
__________________
Sống ở trên đời cần phải có một tấm lòng để gió cuốn đi!
xxxxxxxxxxxxxxxxxxx Trịnh Công Sơn xxxxxxxxxxxxxxxxxxx

thay đổi nội dung bởi: namqn, 26-07-2008 lúc 02:09 AM. Lý do: định dạng code
andyhug vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn