PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > PIC - Thiết kế và Ứng dụng

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

PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 03-12-2010, 05:17 PM   #25
babybaby002
Đệ tử 1 túi
 
babybaby002's Avatar
 
Tham gia ngày: Nov 2010
Bài gửi: 12
:
Unhappy đồng hồ số đo thời gian thực dùng ds1307 và hiển thị lên LCD

Trích:
Nguyên văn bởi hvhdtk3 View Post
Giờ mình viết xong rồi đây! Không biết gửi File đính kèm như thế nào cả, đành post cả chương trình trình lên vậy! Anh em thông cảm nha!

Tuy dùng Proteus mô phỏng ngon lành, nhưng mình test trên mạch thật thì gặp vấn đề này không giải thích được! Mong anh em giúp đỡ.
Mình đặt giá trị cho DS1307: setDateDs1307(01, 02, 03, 04, 05, 06, 07);
với mục đích hiển thị trên LCD là: Time: 03:02:01 Date: 05:06:07
Nhưng trên LCD lại hiển thị: Time: 05:03:00 Date: 07:00:00
Hic! Hiển thị sai rồi! Biết làm sao đây???

Code:

////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9)
#use i2c(Master,Fast,sda=PIN_A1,scl=PIN_A0)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define DS1307_SDA PIN_A1
#define DS1307_SCL PIN_A0
//************************************************
int8 val_sec1, val_min1, val_hou1, val_dat1, val_mon1, val_yea1;
int8 val_sec2, val_min2, val_hou2, val_dat2, val_mon2, val_yea2;
//************************************************
void display_lcd();
//************************************************
#int_ext // Khai bao chuong trinh ngat
RB0_isr() {
display_lcd();
return input(PIN_B1);
}
//**********************************************
int8 decToBcd(int8 val) {
return ( (val/10*16) + (val%10) );
}
//***********************************
int8 bcdToDec1(int8 val) { //Tach lay so hang chuc
return (val/16*10);
}
//***********************************
int8 bcdToDec2(int8 val) { //Tach lay so hang don vi
return (val%16);
}
//***********************************
void init_DS1307() {
output_float(DS1307_SCL); //Bus free
output_float(DS1307_SDA); //Bus free
}
//***********************************
void write_DS1307(byte address, byte data) {
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
}
//***********************************
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}
//***********************************
void setDateDs1307(int8 second, // 0-59
int8 minute, // 0-59
int8 hour, // 1-23
int8 dayOfWeek, // 1-7
int8 dayOfMonth, // 1-28/29/30/31
int8 month, // 1-12
int8 year) // 0-99
{
write_DS1307(0x0, decToBcd(second));
delay_ms(10);
write_DS1307(0x1, decToBcd(minute));
delay_ms(10);
write_DS1307(0x2, decToBcd(hour));
delay_ms(10);
write_DS1307(0x3, decToBcd(dayOfWeek));
delay_ms(10);
write_DS1307(0x4, decToBcd(dayOfMonth));
delay_ms(10);
write_DS1307(0x5, decToBcd(month));
delay_ms(10);
write_DS1307(0x6, decToBcd(year));
}
//***********************************
void display_lcd() {
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Date:");
//*******************************************
val_sec1 = bcdToDec1(read_DS1307(0x00)); //So giay hang chuc
val_sec2 = bcdToDec2(read_DS1307(0x00)); //So giay hang don vi

val_min1 = bcdToDec1(read_DS1307(0x01));
val_min2 = bcdToDec2(read_DS1307(0x01));

val_hou1 = bcdToDec1(read_DS1307(0x02));
val_hou2 = bcdToDec2(read_DS1307(0x02));

val_dat1 = bcdToDec1(read_DS1307(0x04));
val_dat2 = bcdToDec2(read_DS1307(0x04));

val_mon1 = bcdToDec1(read_DS1307(0x05));
val_mon2 = bcdToDec2(read_DS1307(0x05));

val_yea1 = bcdToDec1(read_DS1307(0x06));
val_yea2 = bcdToDec2(read_DS1307(0x06));
//*******************************************
//In lan luot cac so ra LCD
LCD_putcmd(0x8E);
Printf(LCD_putchar,"%u",val_sec1);
LCD_putcmd(0x8F);
Printf(LCD_putchar,"%u",val_sec2);

LCD_putcmd(0x8A);
Printf(LCD_putchar,"%u:",val_min1);
LCD_putcmd(0x8B);
Printf(LCD_putchar,"%u:",val_min2);

LCD_putcmd(0x86);
Printf(LCD_putchar,"%u:",val_hou1);
LCD_putcmd(0x87);
Printf(LCD_putchar,"%u:",val_hou2);

LCD_putcmd(0xC6);
Printf(LCD_putchar,"%u/",val_dat1);
LCD_putcmd(0xC7);
Printf(LCD_putchar,"%u/",val_dat2);

LCD_putcmd(0xCA);
Printf(LCD_putchar,"%u/",val_mon1);
LCD_putcmd(0xCB);
Printf(LCD_putchar,"%u/",val_mon2);

LCD_putcmd(0xCE);
Printf(LCD_putchar,"%u",val_yea1);
LCD_putcmd(0xCF);
Printf(LCD_putchar,"%u",val_yea2);
}
//***********************************

void main()
{
set_tris_b (0x01);
set_tris_d (0x00);
output_b (0x00);
output_c (0x00);
output_d (0x00);
LCD_init(); //Khoi tao LCD
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Date:");
init_DS1307(); //Khoi tao DS1307
write_DS1307(0x07, 0x90); //Cau hinh thanh ghi cua DS1307
setDateDs1307(01, 02, 03, 04, 05, 06, 07); //Vi du Time: 03:02:01 Date: 05:06:07
enable_interrupts(GLOBAL);
enable_interrupts(INT_ext);
while (1)
{
}
}
//************************************************** **
////////////////////////////////////////////////////////////////////////////////
//************************************************** **
Mình cũng đang làm về cái đồng hồ số này nhưng làm ko chạy, thời gian trên con ds1307 vẫn chạy bình thường nhưng khi hiển thị ra LCD thì nó chạy đc 5s rồi đứng yên, bạn có thể post cái mô phỏng và code cho mình tham khảo với, post cái thư viện #include <lcd_lib_4bit.c> luon nha. hoặc bạn gửi vào mail cho mình bnktunganh@gmail.com, thanks.
babybaby002 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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Làm ơn giúp đỡ lập trình PIC với DS1307, EEPROM enti PIC - Thiết kế và Ứng dụng 1 20-11-2006 06:19 PM


Múi giờ GMT. Hiện tại là 03:55 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