|
Tài trợ cho PIC Vietnam |
Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn... |
|
Ðiều Chỉnh | Xếp Bài |
26-07-2008, 02:00 AM | #5 |
Đệ tử 1 túi
Tham gia ngày: Jun 2008
Nơi Cư Ngụ: Lê Duẩn - Hà Nội
Bài gửi: 23
: |
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 Datasheet DS1620:
__________________
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 |
|
|