Thông báo

Collapse
No announcement yet.

Sửa giúp em code 8051 - DS1307

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

  • #16
    Nguyên văn bởi fan.8051 Xem bài viết
    thanks pctcom, code đó chạy ok rồi. nhưng ko co phần xử lý phím bấm, mình đang học C nên đang tìm thuật toán để viết bằng C. Bạn bổ sung thêm phan thay đổi phím bấm được ko ? vì ÁM ko rành lắm
    asm không rành sao bạn lại xin code bằng asm vậy
    bạn viết bằng C thì đã coi lại cái tôi thắc mắc chưa? có REG51F.H không? tôi chưa dùng C nên cũng muốn học hỏi
    sale of Gobal Automation Solution Company Limited

    Comment


    • #17
      Nguyên văn bởi fan.8051 Xem bài viết
      thanks pctcom, code đó chạy ok rồi. nhưng ko co phần xử lý phím bấm, mình đang học C nên đang tìm thuật toán để viết bằng C. Bạn bổ sung thêm phan thay đổi phím bấm được ko ? vì ÁM ko rành lắm
      Bạn có thể tham khảo code sau, nó chạy tốt với mạch Proteus ở trên.

      /************************************************** ************************************************
      DONG HO SU DUNG TIMER PCT COMPUTER Tel:0918227077 Mailct@pctco.net
      PHAN CUNG: 89c51; THACH ANH: 12MHZ ;
      SU DUNG 6 LED 7 DOAN GIO : PHUT : GIAY

      /************KHAI BAO THU VIEN, DINH NGHIA********************************************* ***********/
      #include<AT89X52.H>

      #define Set_key P3_2
      #define Up_key P3_3
      #define Dw_key P3_4
      #define SDA P3_1
      #define SCL P3_0
      #define DS1307_ID 0xD0
      #define SEC 0x00
      #define MIN 0x01
      #define HOUR 0x02
      //#define DATE 0x04
      //#define MONTH 0x05
      //#define YEAR 0x06

      /************KHAI BAO BIEN, MANG...******************************************* ********************/
      unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //Decimal to Led7seg
      unsigned char t_view,time,index,F_set,B_nhay,get_t ;
      unsigned char hour,sec,min;

      /************KHAI BAO HAM, CHUONG TRINH CON*********************************************** ********/
      void set_main(void); // Chuong trinh khoi tao main
      void setup_timer(void); // Chuong trinh cai dat timer 1 va 0
      void delay(unsigned int time); // Delay
      void Fix_time(void); // Kiem tra va hieu chinh gia tri cua gio,phut,giay
      void Keypad(void); // Kiem tra xu ly phim nhan.
      void T1_ISR(void); //ngat timer 1 phuc vu nhay led
      void T0_ISR(void); // Dung ngat timer 0 de quet led

      /************CAC CHUONG TRINH CON*********************************************** ******************/
      // FOR I2C
      /************************************************** *********************/

      void I2C_start(void)
      {
      SCL = 1; SCL = 0;
      SDA = 1; SCL = 1;
      delay(2);
      SDA = 0; delay(2);
      SCL = 0; delay(2);
      }
      void I2C_stop(void)
      {
      SCL = 1; SCL = 0;
      SDA = 0; delay(2);
      SCL = 1; delay(2);
      SDA = 1;
      }
      bit I2C_write(unsigned char dat)
      {
      unsigned char i;
      for (i=0;i<8;i++)
      {
      SDA = (dat & 0x80) ? 1:0;
      SCL=1;SCL=0;
      dat<<=1;
      }
      SCL = 1; delay(2);
      SCL = 0;
      }
      unsigned char I2C_read(void)
      {
      bit rd_bit;
      unsigned char i, dat;
      dat = 0x00;
      for(i=0;i<8;i++) /* For loop read data 1 byte */
      {
      delay(2);
      SCL = 1; /* Set SCL */
      delay(2);
      rd_bit = SDA; /* Keep for check acknowledge */
      dat = dat<<1;
      dat = dat | rd_bit; /* Keep bit data in dat */
      SCL = 0; /* Clear SCL */
      }
      return dat;
      }
      /************************************************** *********************/
      // FOR DS1307
      /************************************************** *********************/

      unsigned char DS1307_get(unsigned char addr)
      {
      unsigned int temp,ret;
      I2C_start(); /* Start i2c bus */
      I2C_write(DS1307_ID); /* Connect to DS1307 */
      I2C_write(addr); /* Request RAM address on DS1307 */
      I2C_start(); /* Start i2c bus */
      I2C_write(DS1307_ID+1); /* Connect to DS1307 for Read */
      ret = I2C_read(); /* Receive data */
      I2C_stop();
      //*********************************************
      temp = ret; /*BCD to HEX*/
      ret = (((ret/16)*10)+ (temp & 0x0f)); /*for Led 7seg*/
      //*********************************************
      return ret;
      }

      void DS1307_Write(unsigned char addr,unsigned char dat)
      {
      unsigned int temp;
      //********************************************** /*HEX to BCD*/
      temp = dat ; /*for Led 7seg*/
      dat = (((dat/10)*16)|(temp %10));
      //**********************************************
      I2C_start(); /* Start i2c bus */
      I2C_write(DS1307_ID); /* Connect to DS1307 */
      I2C_write(addr); /* Request RAM address on DS1307 */
      I2C_write(dat); /* Connect to DS1307 for Read */
      I2C_stop();
      }
      /************************************************** *********************/

      void delay(unsigned int time)
      { while(time--); }
      void set_main(void) // Chuong trinh khoi tao main
      {
      P1=0xFF;
      P0=0x00;
      P2=0x00;
      P3=0xFF;
      }
      void setup_timer(void) // Setup timer 0 va timer 1
      {
      TMOD=0x11; // timer0 & timer1 set che do 1
      TH0=-1000/256; TL0=-1000%256;
      TH1=0x3C; TL1=0xAF;
      ET1=1; ET0=1; EA=1;
      TF0=0; TF1=0; TR0=1; TR1=1;
      }
      void Fix_time(void) // Kiem tra va hieu chinh gia tri cua gio,phut,giay
      {
      //Tang
      if(sec==60) {sec=0;min++; }
      if(min==60) {min=0;hour++; }
      if(hour==24) hour=0;
      //Giam
      if(sec== -1) {sec=59;min--;}
      if(min== -1) {min=59;hour-- ;}
      if(hour== -1)hour= 23;
      }
      void Keypad(void) // Kiem tra phim nhan.
      {
      if(!Set_key){ //phim Set duoc nhan ?
      F_set++; // Bien F_set co gia tri tu 0->2
      if(F_set==3) {F_set=0;
      DS1307_Write(0x01,min);
      DS1307_Write(0x02,hour); }
      }
      if(F_set==1){ //Tang hoac giam phut neu F_set = 1
      if(!Up_key) min++;
      if(!Dw_key) min--;
      }
      if(F_set==2){ //Tang hoac giam gio neu F_set = 2
      if(!Up_key) hour++;
      if(!Dw_key) hour--;
      }
      Fix_time(); //kiem tra tran so
      delay(50000);
      }
      void T1_ISR(void) interrupt 3 //ngat timer 1 chay dong ho
      {
      TR1=0;
      TF1=0;
      TH1=0x3C; // nap lai gia tri cho thanh ghi
      TL1=0xAF;
      time++;
      if(time==10)
      {time=0; B_nhay++; get_t=1;
      if(B_nhay==2)
      B_nhay=0;
      }
      TR1=1;
      }
      /*************************************/
      void T0_ISR(void) interrupt 1 // Dung ngat timer 0 de quet led
      {
      TR0=0;
      TF0=0;
      TH0=-1000/256; // Nap lai gia tri cho thanh ghi
      TL0=-1000%256;
      index++;
      if(index==1)
      { t_view=sec; //sec;
      P0=0xff;
      P2=0x01;
      P0=led7_data[t_view%10]; } //lay so du sau khi chia 10
      if(index==2)
      { P0=0xff;
      P2=0x02;
      P0=led7_data[t_view/10]; } //xuat gia tri hang chuc

      if(index==3){
      if(F_set==1 && B_nhay==1){index++; index++;}
      else
      { t_view=min;
      P0=0xff;
      P2=0x04;
      P0=led7_data[t_view%10]; }}
      if(index==4)
      { P0=0xff;
      P2=0x08;
      P0=led7_data[t_view/10]; }

      if(index==5) {
      if(F_set==2 && B_nhay==1){index=0;}
      else
      { t_view=hour;
      P0=0xff;
      P2=0x10;
      P0=led7_data[t_view%10]; } }
      if(index==6)
      { P0=0xff;
      P2=0x20;
      P0=led7_data[t_view/10];
      index=0; }
      TR0=1;
      }
      /************CHUONG TRINH CHINH********************************************* **********************/
      void main()
      {
      set_main();
      time=index=0;
      hour=0;
      min=5;
      sec=0;
      F_set=0;
      get_t=0;
      setup_timer();
      while(1)
      {
      Keypad();

      if(F_set==0)
      {
      if(get_t == 1)
      {
      get_t = 0;
      sec = DS1307_get(SEC);
      min = DS1307_get(MIN);
      hour = DS1307_get(HOUR);

      }
      }
      }
      }
      Last edited by pctcom; 04-09-2010, 09:27.
      PCT COMPUTER
      (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

      Comment


      • #18
        Nguyên văn bởi pctcom Xem bài viết
        CODE của bạn có 2 phần bị lỗi:

        Thứ 1:

        Bạn khai báo kiểu Bit

        LED_GIAY BIT P2.0
        LED_C_GIAY BIT P2.1
        LED_PHUT BIT P2.2
        LED_C_PHUT BIT P2.3
        LED_GIO BIT P2.4
        LED_C_GIO BIT P2.5
        LED_DATA EQU P0

        Nhưng lại dùng lệnh Mov cho biến đó

        MOV LED_GIAY,#0 ;** RESET TAT CA CAC BIEN
        MOV LED_C_GIAY,#0
        MOV LED_PHUT,#0
        MOV LED_C_PHUT,#0

        cách viết nhanh nhất là set cả Port về không

        MOV P2,#0

        hoặc set tường minh bằng lệnh:

        CLR LED_GIAY

        Thứ 2:


        Đây là phần các bạn hay bị lỗi nhất là Start và Stop của I2C,

        Bạn chỉ cần thêm phần code màu đỏ vào là được:


        START_DS:
        CLR SCL
        SETB SCL

        SETB SDA
        SETB SCL
        NOP
        CLR SDA
        CLR SCL
        RET

        STOP_DS:
        SET SCL
        CLR SCL

        CLR SDA
        SETB SCL
        NOP
        SETB SDA
        RET
        anh pctcom ơi! anh có thể giải thích giúp em sao khi thiếu phần code màu đỏ thì trình tự hiển thị giờ, phút, giây trên các led 7 đoạn lại bị đảo lộn được không anh, tại vì em thấy cấu trúc start của i2c là chỉ cần đưa scl và sda lên mức 1, rồi sau đó đưa sda về mức 0. stop thì sda xuống mức 0, scl lên mức 1 rồi sau đó đưa sda lên mức 1 là được mà anh. Sao mình phải thêm 1 xung lên xuống của scl trươc đó nữa vậy? anh chỉ giúp em nha! em còn chưa hiểu được chỗ đó. em cảm ơn anh!

        Comment


        • #19
          Nguyên văn bởi bbdevil Xem bài viết
          anh pctcom ơi! anh có thể giải thích giúp em sao khi thiếu phần code màu đỏ thì trình tự hiển thị giờ, phút, giây trên các led 7 đoạn lại bị đảo lộn được không anh, tại vì em thấy cấu trúc start của i2c là chỉ cần đưa scl và sda lên mức 1, rồi sau đó đưa sda về mức 0. stop thì sda xuống mức 0, scl lên mức 1 rồi sau đó đưa sda lên mức 1 là được mà anh. Sao mình phải thêm 1 xung lên xuống của scl trươc đó nữa vậy? anh chỉ giúp em nha! em còn chưa hiểu được chỗ đó. em cảm ơn anh!
          Trình tự hiện thị trên led7seg không đúng ở lỗi này là do bước chuẩn bị Start và bước kết thúc Stop bị lỗi do độ "trễ" của Ds1307, nên CT phải đọc nhiều lần mới lấy thực thi được 1 lệnh đọc, kết quả là đọc được giá trị là giây nhưng lại cất vào biến phút hoặc giờ.

          Để giải quyết vấn đề nay người ta thường dùng Delay hoặc đơn giản hơn là dùng thêm 1 xung clock trước thủ tục Start, Stop.
          PCT COMPUTER
          (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

          Comment


          • #20
            Nguyên văn bởi pctcom Xem bài viết
            Trình tự hiện thị trên led7seg không đúng ở lỗi này là do bước chuẩn bị Start và bước kết thúc Stop bị lỗi do độ "trễ" của Ds1307, nên CT phải đọc nhiều lần mới lấy thực thi được 1 lệnh đọc, kết quả là đọc được giá trị là giây nhưng lại cất vào biến phút hoặc giờ.

            Để giải quyết vấn đề nay người ta thường dùng Delay hoặc đơn giản hơn là dùng thêm 1 xung clock trước thủ tục Start, Stop.
            Em cảm ơn anh pctcom đã giải thích giúp em, em cũng mới hoc vi điều khiển nên cũng còn nhiều điều chưa hiểu hết!
            Em thấy cái giao tiếp I2C cũng hay, anh cho em hỏi giao tiếp USB có phải là giao tiếp này hay không, và chúng ta có thể truyền dữ liệu giữa máy tính và vi điều khiển 8051 qua giao tiếp này không? em thấy có mấy cái mạch đo nhiệt độ và hiển thị lên máy tính thông qua VB6, anh có tài liệu về cái này không, có thể cho em xin được không?

            Comment


            • #21
              Nguyên văn bởi bbdevil Xem bài viết
              Em cảm ơn anh pctcom đã giải thích giúp em, em cũng mới hoc vi điều khiển nên cũng còn nhiều điều chưa hiểu hết!
              Em thấy cái giao tiếp I2C cũng hay, anh cho em hỏi giao tiếp USB có phải là giao tiếp này hay không, và chúng ta có thể truyền dữ liệu giữa máy tính và vi điều khiển 8051 qua giao tiếp này không? em thấy có mấy cái mạch đo nhiệt độ và hiển thị lên máy tính thông qua VB6, anh có tài liệu về cái này không, có thể cho em xin được không?
              I2C và USB là 2 giao tiếp khác nhau hoàn toàn nhe bạn.

              Nếu bạn là Fan của VB, bạn nên bắt đầu từ giao tiếp đơn giản nhất t là LPT -> COM -> cuối cùng bạn hãy chơi với cái phức tạp nhất là USB.

              Nếu thích bạn có thể tìm thêm trong diễn đàn này đã có nhiều bài viết về USB khá hay.
              PCT COMPUTER
              (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

              Comment


              • #22
                Lâu nay em về quê nên không có lên diễn đàn được! Anh ơi cho em hỏi, con DS1307 có những thanh ghi hẹn giờ giống như bên con DS12c887 không anh? hay là mình phải tự lập trình trong VDK hả anh?

                Comment


                • #23
                  minh viet xong phan men dong ho dien tu dung ds1307 va 89c51 xuat ra man hinh lcd 4x20 cac ban tham khao nhe phan mem viet bang keil c
                  #include <REGX52.H>
                  //#include<reg51.h>
                  #include<stdio.h>
                  #include<stdlib.h>
                  #define RELOAD_HIGH 0x3c
                  #define RELOAD_LOW 0xb0
                  #define DB_VAL 6
                  #define HOME 0
                  #define HOUR 1
                  #define MIN 2
                  #define SEC 3
                  #define DAY 4
                  #define DATE 5
                  #define MON 6
                  #define YEAR 7
                  #define OFF 0
                  #define ON 1
                  #define DISP_BUSY 0x80 //co bao ban
                  #define DISP_FUNC 0x38//hien thi hai hang kieu 5x7
                  #define DISP_HOME 0x02//tro ve dau dong
                  #define DISP_ENTRY 0x06//di chuyen con tro DDRam ko thay doi
                  #define DISP_CLEAR 0x01//xoa man hinh
                  #define DISP_CNTN 0x08//man hinh on
                  #define DISP_CURSOR 0x02//con tro off
                  #define DISP_POS 0x80//dia chi dau cua ddram,dong1
                  #define DISP_LINE2 0x40
                  #define DISP_ON 0x04
                  #define DISP_LINE2 0x40 //dia chi dong 2
                  #define DISP_LINE3 0x14 //dia chi dong 3
                  #define DISP_LINE4 0x54 //dia chi dong4
                  sbit RW_LCD=P3^6;
                  sbit RD_LCD=P3^7;
                  sbit E_LCD= P3^5;
                  sbit SET = P3^4;
                  sbit SELECT= P3^3;
                  sbit SDA= P1^0;
                  sbit SCL= P1^1;
                  sfr DATA= 0xA0;
                  unsigned char c[7];
                  unsigned char tam[1];
                  bit set_mode=0,up_date=1,truycap=0,co=1;
                  unsigned char switch_debounce=0,cur_field=HOME,cap_lcd=10;
                  unsigned char code fieldpos[7]={
                  DISP_POS | 0x07,
                  DISP_POS | 0x0a,
                  DISP_POS | 0x0d,
                  DISP_LINE2|0x07,
                  DISP_POS | 27,
                  DISP_POS | 30,
                  DISP_POS | 33
                  };
                  unsigned char disp_read(void);
                  void disp_write(unsigned char);
                  void disp_cmd(unsigned char);
                  void disp_init(void);
                  void delay(int);
                  void disp_time(void);
                  void incr_field(void);
                  void set_cursor(bit,unsigned char);
                  void inser(void);
                  void print(unsigned char *ch);
                  void xuat(unsigned char);
                  void Stop(void);
                  void Start(void);
                  void WriteRTC(void);
                  void Write_I2C(unsigned char);
                  void nop(void);
                  void Read_RTC(void);
                  unsigned char ReadI2C(void);
                  void main(void){
                  TMOD=0x11;
                  TCON=0x15;
                  IE=0x82;
                  disp_init();
                  c[0]=0x59;
                  c[1]=0x59;
                  c[2]=0x23;
                  c[3]=0x07;
                  c[4]=0x23;
                  c[5]=0x10;
                  c[6]=0x11;
                  for({
                  if(up_date){
                  //IE=0;
                  WriteRTC();
                  up_date=0;
                  }
                  if(!set_mode&truycap){
                  // delay(10);

                  disp_time();
                  truycap=0;
                  }
                  if(!co){
                  inser();
                  co=1;
                  }
                  }
                  }
                  unsigned char disp_read(void){
                  unsigned char value;
                  DATA=0xFF;
                  RD_LCD=0;
                  RW_LCD=1;//che do doc
                  E_LCD=1;
                  value=DATA;
                  E_LCD=0;
                  return value;
                  }
                  //***********************************
                  void disp_write(unsigned char value){
                  RD_LCD=1;
                  RW_LCD=0;//che do ghi
                  E_LCD=1;
                  DATA=value;
                  E_LCD=0;
                  }
                  void disp_cmd(unsigned char cmd){
                  RD_LCD=0;
                  RW_LCD=0;//chot lenh
                  E_LCD=1;
                  DATA=cmd;
                  E_LCD=0;
                  TH1=0;
                  TL1=0;//bo dinh thoi 1,85ms
                  TR1=1;
                  while (!TF1 && disp_read() & DISP_BUSY);//cho bo hien thi
                  TR1=0;
                  }
                  void disp_init(void){
                  TH1=0;
                  TL1=0;//bo dinh thoi 1,85ms
                  TR1=1;
                  while(!TF1&& disp_read() & DISP_BUSY);//cho bo hien thi
                  TR1=0;
                  disp_cmd(DISP_FUNC);
                  disp_cmd(DISP_ENTRY);
                  disp_cmd(0x0c);
                  disp_cmd(DISP_CLEAR);
                  }
                  //*************************************
                  void Start(void)
                  {
                  SDA = 1;
                  SCL = 1;
                  nop();nop();
                  SDA = 0;
                  nop();nop();
                  SCL = 0;
                  nop();nop();
                  }
                  //-------------------------------
                  void Stop(void)
                  {
                  SDA = 0;
                  nop();nop();
                  SCL = 1;
                  nop();nop();
                  SDA = 1;
                  }
                  //-------------------------------
                  void Write_I2C(unsigned char Data)
                  {
                  unsigned char i;
                  for (i=0;i<8;i++)
                  {
                  SDA = (Data & 0x80) ? 1:0;//sda=1,neu data.7=1
                  SCL=1;
                  nop(); nop();
                  SCL=0;
                  Data<<=1;//dich 1 bit
                  }

                  SCL = 1;
                  nop();nop();
                  SCL = 0;
                  }
                  void WriteRTC(void){
                  unsigned char i,x;
                  Start();
                  Write_I2C(0xD0);//dia chi slave
                  Write_I2C(0x00); //ghi dc byte dau tien
                  for (i=0;i<7;i++){
                  x=c[i];//ghi dia chi sec,min,hour...
                  Write_I2C(x);
                  }
                  Stop();
                  }
                  void nop(void){;}
                  unsigned char ReadI2C(void){
                  unsigned char i,value=0;
                  SDA=1;
                  for(i=0;i<8;i++){
                  SCL=1;
                  value<<=1;
                  value=(value|SDA);//cong gia tri cua bit sda voi value
                  SCL=0;
                  nop();
                  nop();
                  }
                  SDA=1;
                  SCL=0;
                  nop(); nop();
                  SDA=0;
                  SCL=1;
                  nop(); nop();
                  SCL=0;
                  return value;
                  }
                  void Read_RTC(void){
                  unsigned char i;
                  Start();
                  Write_I2C(0xd0); //dia chi slave+W
                  Write_I2C(0x00); // dia chi byte dau(sec)
                  Stop();
                  Start();
                  Write_I2C(0xd1); //dia chi slave+R
                  for (i=0;i<7;i++){
                  c[i]=ReadI2C(); //luu gia tri doc duoc tu rtc
                  nop(); nop();
                  }
                  Stop();
                  tam[0]=c[0];//doi vi tri cua gio cho giay
                  c[0]=c[2];
                  c[2]=tam[0];
                  }
                  void disp_time(void){
                  unsigned char x,y,i;
                  Read_RTC();
                  for (i=0;i<7;i++){
                  if (i==0){disp_cmd(DISP_POS);print("Time:");}
                  else if(i==1){disp_cmd(DISP_POS+7);print(":");}
                  else if(i==2){disp_cmd(DISP_POS+10);print(":");}
                  else if(i==3){disp_cmd(DISP_POS|DISP_LINE2);print("Day :");}
                  else if(i==4){disp_cmd(DISP_POS|DISP_LINE3);print("Date :");}
                  else if(i==5){disp_cmd(DISP_POS+27);print("/");}
                  else if(i==6){disp_cmd(DISP_POS+30);print("/");}
                  x=c[i];
                  y=x&0xf0;
                  y>>=4; //tach lay 4 bit cao
                  xuat(y);
                  y=x&0x0f; //tach lay 4 bit thap
                  xuat(y);
                  }
                  disp_cmd(DISP_POS|DISP_LINE4);
                  print("*****VU_HUU_KHOA****");
                  delay(1);
                  disp_cmd(DISP_POS);
                  }
                  void print(unsigned char *ch){
                  while(*ch){
                  disp_write(*ch);
                  ch++;
                  delay(1);
                  }
                  return;
                  }
                  void xuat(unsigned char x){
                  switch(x){
                  case 0: print("0");delay(1);break;
                  case 1: print("1");delay(1);break;
                  case 2: print("2");delay(1);break;
                  case 3: print("3");delay(1);break;
                  case 4: print("4");delay(1);break;
                  case 5: print("5");delay(1);break;
                  case 6: print("6");delay(1);break;
                  case 7: print("7");delay(1);break;
                  case 8: print("8");delay(1);break;
                  case 9: print("9");delay(1);break;
                  }
                  }
                  void inser(void){
                  unsigned char x,y;
                  if(cur_field==SEC){x=c[0];}
                  if(cur_field==MIN){x=c[1];}
                  if(cur_field==HOUR){x=c[2];}
                  if(cur_field==DAY){x=c[3];}
                  if(cur_field==DATE){x=c[4];}
                  if(cur_field==MON){x=c[5];}
                  if(cur_field==YEAR){x=c[6];}
                  disp_cmd(DISP_POS|fieldpos[cur_field-1]-2);
                  y=x&0xf0;
                  y>>=4;
                  xuat(y);
                  y=x&0x0f;
                  xuat(y);
                  }

                  void delay(int time){
                  int i,j;
                  for (i=0;i<time;i++)
                  for(j=0;j<50;j++)
                  {;}
                  }
                  //******************************************
                  void incr_field(void){
                  //unsigned char x;
                  if(cur_field==SEC){
                  c[0]++;
                  if(c[0]>0x59){
                  c[0]=0;
                  }
                  }
                  if(cur_field==MIN){
                  c[1]++;
                  if(c[1]>0x59){
                  c[1]=0;
                  }
                  }
                  if(cur_field==HOUR){
                  c[2]++;
                  if(c[2]>0x23){
                  c[2]=0;
                  }
                  }
                  if(cur_field==DAY){
                  c[3]++;
                  if(c[3]>7){
                  c[3]=0;
                  }
                  }
                  if(cur_field==DATE){
                  c[4]++;
                  if(c[5]==2){
                  if(!c[6]%4){
                  if(c[4]>0x29){
                  c[4]=0;
                  }
                  }
                  else {
                  if(c[4]>0x28){
                  c[4]=0;
                  }
                  }
                  }
                  if(c[5]==0x01||c[5]==0x03||c[5]==0x05||c[5]==0x7||c[5]==0x08||c[5]==0x10||c[5]==0x12){
                  if(c[4]>0x31){
                  c[4]=0;
                  }
                  }
                  else {
                  if (c[4]>0x30){
                  c[4]=0;
                  }
                  }
                  }
                  if(cur_field==MON){
                  c[5]++;
                  if(c[5]>0x12){
                  c[5]=0;
                  }
                  }
                  if(cur_field==YEAR){
                  c[6]++;
                  }
                  }
                  //*************************************
                  //**************************************
                  void set_cursor(bit new_mode,unsigned char field){
                  if(new_mode){
                  disp_cmd(DISP_POS|fieldpos[field-1]);//vi tri hien thi
                  disp_cmd(0x0D);//cursor on
                  }else{
                  disp_cmd(0x0C);// cursor off
                  }
                  }
                  void system_tick(void)interrupt 1{
                  TR0=0;
                  TH0=RELOAD_HIGH;
                  TL0=RELOAD_LOW;
                  TR0=1;
                  if(switch_debounce){
                  switch_debounce--;
                  }
                  if(!switch_debounce){
                  if(!SET){
                  switch_debounce=DB_VAL;
                  if(!set_mode){
                  cur_field=HOUR;
                  set_mode=1;//di vao che do thiet lap
                  set_cursor(ON,HOUR);//cursor nhap nhay o hour
                  }else{
                  cur_field++;
                  if(cur_field>7){
                  set_mode=0;
                  set_cursor(OFF,HOME);
                  cur_field=HOME;
                  TR0=0; //dung bo dinh thoi
                  WriteRTC(); //truyen du lieu moi vao rtc
                  TR0=1;
                  }else{
                  set_cursor(ON,cur_field);
                  }
                  }
                  }
                  if(set_mode&&!SELECT){
                  switch_debounce=DB_VAL;
                  incr_field();
                  co=0;//cho phep chen ky tu vao vi tri can hien
                  }
                  if(!set_mode){
                  cap_lcd--;
                  if(!cap_lcd){
                  cap_lcd=10;
                  truycap=1;
                  }
                  }
                  }
                  }

                  Comment


                  • #24
                    link bị die hết rùi, bác nào còn mạch+code asm cho em xin với, em đang cần gấp lắm!!! Thanks
                    student_dtvt@yahoo.com

                    Comment


                    • #25
                      Chào các bác! các bác cho e hỏi con DS1307 cập nhập nhật ngày với những tháng thiếu thì như nào nhỉ ? e tìm mãi trên Google chỉ thấy nói DS1307 tự động cập nhật ngày tháng còn không nói rõ nó cập nhật như nào? hay phải viết code cập nhật ngày riêng cho nó nhỉ ?

                      Comment


                      • #26
                        Chào bạn,mình đang làm mạch đồng hồ số có hẹn giờ.nhưng mình chưa rành cái này lắm,thấy trên diễn đàn bạn đã làm cái này.nếu Bạn có đồ án hay tài liệu về cái này thì gửi cho mình tham khảo với nhe!
                        giao tiếp của con DS1307 - 8051-HIỂN THỊ LED 7 ĐOẠN + HẸN GIỜ
                        vẽ và chạy mô phỏng trên protues,lập trình bang ngôn ngữ ASM
                        CÁC Bạn gửi cho mình theo địa chỉ mail nay nhe : thoisinhvienqnu@gmail.com

                        Comment

                        Về tác giả

                        Collapse

                        fan.8051 Say mê Điện tử Tìm hiểu thêm về fan.8051

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

                        Collapse

                        Đang tải...
                        X