Thông báo

Collapse
No announcement yet.

cần giúp đỡ về mạch đồng hồ dùng pic16f và ic ds1307

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • cần giúp đỡ về mạch đồng hồ dùng pic16f và ic ds1307

    Chào các bác! Tình hình là e có làm cái mạch giao tiếp i2c giữa pic với con ic ds1307 để lấy giá trị điều khiển một số thiết bị!
    khi mô phỏng thì mạch đã chạy nhưng khi làm mạch thực tế thì không đọc được!
    Các bác giúp em thông não phần này với ạ!

  • #2
    Đây là code chương trình! mong các bác giúp đỡ!

    #include <16f877a.h>
    #FUSEs hs
    #use delay(clock=20000000)
    #use i2c(master,fast,sda = pin_e0,scl = pin_e1) //khai bao su dung cac chan i2c
    //kha bao cac chan LCD
    #define LCD_ENABLE_PIN PIN_C6
    #define LCD_RS_PIN PIN_C7
    #define LCD_RW_PIN PIN_E2
    #define LCD_DATA4 PIN_D4
    #define LCD_DATA5 PIN_D5
    #define LCD_DATA6 PIN_D6
    #define LCD_DATA7 PIN_D7
    #include <lcd.c>

    int8 c_g,dv_g,c_p,dv_p,c_h,dv_h,thu,c_d,dv_d,c_t,dv_t,c _n,dv_n;
    int8 mang_tg_rtc[7];
    //int8 a1,a2;
    // int8 h1=0,p1=0,g1=0;

    void convert_bcd();
    void ReadRTC(int8 * buff);
    void WriteRTC(int8 * buff);
    void rtc_init(void);
    void hienthi();

    void main()
    {
    lcd_init();

    rtc_init();


    while(true)
    {
    ReadRTC(&mang_tg_rtc[0]);
    i2c_read();
    convert_bcd();
    hienthi();

    }
    }

    void convert_bcd() // BCD sang so thap phan
    {

    c_g=mang_tg_rtc[0]>>4; // dich phai 4 bit de lay hang chuc
    dv_g=mang_tg_rtc[0]&15; // xoa 4 vit cao de lay hang don vi
    c_p=mang_tg_rtc[1]>>4;
    dv_p=mang_tg_rtc[1]&0x0f;
    c_h=mang_tg_rtc[2]>>4;
    dv_h=mang_tg_rtc[2]&0x0f;
    thu = mang_tg_rtc[3];
    c_d=mang_tg_rtc[4]>>4;
    dv_d=mang_tg_rtc[4]&0x0f;
    c_t=mang_tg_rtc[5]>>4;
    dv_t=mang_tg_rtc[5]&0x0f;
    c_n=mang_tg_rtc[6]>>4;
    dv_n=mang_tg_rtc[6]&0x0f;

    }
    void ReadRTC(int8 * buff) // doc du lieu tu 1307
    {

    i2c_Start(); // Lenh bat dau i2c
    i2c_Write(0xD0); // ghi ma ghi vào DS1307
    i2c_Write(0x00); // Ghi dia chi 0 vao DS
    i2c_Start(); // Lenh restart i2c
    i2c_Write(0xD1); // chi ma doc vao DS
    *(buff+0)=i2c_Read(1); // Doc giay voi bit thua nhan (ACK) de dia chi tang tu dong
    *(buff+1)=i2c_Read(1); // doc phut
    *(buff+2)=i2c_Read(1); // doc gio
    *(buff+3)=i2c_Read(1); // doc thu
    *(buff+4)=i2c_Read(1); // doc ngay
    *(buff+5)=i2c_Read(1); // doc thang
    *(buff+6)=i2c_Read(0); // doc nam khong bit thua nhan de ket thuc viec doc
    i2c_Stop(); // Lenh dung i2c
    }
    void rtc_init(void) // khoi tao cho ds1307
    {
    int8 a; // byte luu tam gia tri o nho 0 cua ds
    i2c_start();
    i2c_write(0xD0); // ghi vao ds1307 chieu ghi
    i2c_write(0); // ghi dia chi can doc
    i2c_start(); // start bit i2c
    i2c_write(0xD1); // ghi vao ds1307 chieu doc
    a = i2c_read(0);

    i2c_stop();

    if ((a&0x80)!=0)
    {
    a&=0x7f;
    i2c_start();
    i2c_write(0); // ghi vao ds1307 chieu ghi
    i2c_write(0); // ghi dia chi can doc
    i2c_write(a); //
    i2c_stop();
    }
    }
    void hienthi()
    {
    lcd_putc("\f");
    LCD_gotoxy(1,1); // lenh dua con tro den hang 1 cot 1 LCD
    printf(LCD_putc,"TIME: ");
    LCD_putc(c_h + 0x30); // doi ma thap phan sang ASCII va xuat hien thi len LCD
    LCD_putc(dv_h + 0x30); // doi ma thap phan sang ASCII va xuat hien thi len LCD
    printf(LCD_putc,":");
    LCD_putc(c_p + 0x30);
    LCD_putc(dv_p + 0x30);
    printf(LCD_putc,":");
    LCD_putc(c_g + 0x30);
    LCD_putc(dv_g + 0x30);
    printf(LCD_putc," ");

    LCD_gotoxy(1,2);
    printf(LCD_putc,"DATE:");

    LCD_putc(c_d + 0x30);
    LCD_putc(dv_d + 0x30);

    printf(LCD_putc,"/");

    LCD_putc(c_t + 0x30);
    LCD_putc(dv_t + 0x30);

    printf(LCD_putc,"/");
    printf(LCD_putc,"20");

    LCD_putc(c_n + 0x30);
    LCD_putc(dv_n + 0x30);

    printf(LCD_putc," ");
    delay_ms(998);
    }

    Comment

    Về tác giả

    Collapse

    doanlui18 Tìm hiểu thêm về doanlui18

    Bài viết mới nhất

    Collapse

    Đang tải...
    X