PIC Vietnam

Go Back   PIC Vietnam > Robotics > Cảm biến

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn...

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
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
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 08:22 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam