Thông báo

Collapse
No announcement yet.

Giúp em ạ. Đồng hồ LCD của em làm đếm giờ sai số lớn quá...

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

  • #16
    Nguyên văn bởi mrcuongcon Xem bài viết
    Mô phỏng trên Proteus thì làm sao chính xác được? Mà tại sao không dùng thạch anh 12Mhz tính toán thời gian cho đỡ khổ, cứ phải lấy 11.0592 mà tính toán?
    .
    Theo tôi biết thì nhà sx cố tình làm thạch anh 11.0592 là để tạo ra thời gian 1us cho 1 chu kỳ máy,họ đã làm thực nghiệm và đưa ra con số này,nếu dùng 12Mhz thì kô còn chính xác nữa


    email:
    Giá mà mạch điện tử không có nhiễu (noise) thì mình bây giờ đã là ... đại gia

    Comment


    • #17
      Nguyên văn bởi otacon Xem bài viết
      Theo tôi biết thì nhà sx cố tình làm thạch anh 11.0592 là để tạo ra thời gian 1us cho 1 chu kỳ máy,họ đã làm thực nghiệm và đưa ra con số này,nếu dùng 12Mhz thì kô còn chính xác nữa
      BÁC nói quá chính xác, thực chất là con thạch anh 11.0592 MHz là chính xác nhất. tôi đã làm 1 lần với việc giao tiếp với máy tính dùng thạch anh 12MHz, mặc dù tính toán rất nhiều lần nhưng vẫn không thể giao tiếp đc, do sai tốc độ, lên gặp thầy hỏi thì thấy phán 1 câu, làm thạch anh 12 MHz thì kô chạy đâu, thử với thạch anh 11.0592 đi, tôi nghe lời và thay thạch anh, tính toán lại thông số, nạp 1 cái là chạy ngon lành, ha ha. rõ ràng là thạch anh 11.0592 OK hơn. còn chuyện làm đồng hồ này thì nếu không dùng RTC thì dùng timer mới đc, như cách của bạn khanhduy301 là ko ổn đâu. bạn nên dùng timer đi, mặc dù timer ko chính xác lắm( do thạch anh) nhưng cũng đở hơn xài delay nhiều, với lại viết chương trình cũng dễ hơn. tốt nhất là xài RTC. thêm 1 cái nữa là đừng bao giờ dùng Protues để mô phổng thời gian thực nhé, sẽ ko đc kết quả chính xác đâu, nên ráp mạch thực tế đi.
      hãy cố gắng dù vướn phải thất bại!!!!!!!!

      Comment


      • #18
        BÁC nói quá chính xác, thực chất là con thạch anh 11.0592 MHz là chính xác nhất. tôi đã làm 1 lần với việc giao tiếp với máy tính dùng thạch anh 12MHz, mặc dù tính toán rất nhiều lần nhưng vẫn không thể giao tiếp đc, do sai tốc độ, lên gặp thầy hỏi thì thấy phán 1 câu, làm thạch anh 12 MHz thì kô chạy đâu, thử với thạch anh 11.0592 đi, tôi nghe lời và thay thạch anh, tính toán lại thông số, nạp 1 cái là chạy ngon lành, ha ha. rõ ràng là thạch anh 11.0592 OK hơn.
        Các pro ơi, thạch anh 11.0592 người ta hay dùng bởi các tính toán liên quan đến sai số truyền thông ( thiết đặt baurate cho USART)còn các ứng dụng không dùng đến truyền thông thì lấy thạch anh 12MHz mà tính cho nó đỡ khổ, chẳng liên quan gì đến sai số của thạch anh cả. Mình chưa thấy ở đâu nói rằng thạch anh 11.0592Mhz sai số ít hơn thạch anh 12Mhz
        Dưới đây là một bảng nói về sai số trong truyền thông USART của họ AVR, ở đây họ đề cập đến sai số truyền thông khi dùng các loại thạch anh khác nhau, có lẽ mọi người đang hiểu rằng đây là sai số dao động của thạch anh , thật là sai lầm!
        Attached Files
        Last edited by mrcuongcon; 20-10-2008, 19:47.

        Comment


        • #19
          Theo tôi biết thì nhà sx cố tình làm thạch anh 11.0592 là để tạo ra thời gian 1us cho 1 chu kỳ máy,họ đã làm thực nghiệm và đưa ra con số này,nếu dùng 12Mhz thì kô còn chính xác nữa
          Thời gian 1 chu kỳ máy:
          Với thạch anh 11.0592 là 1000000/921600=1.08506944444.....................(us)
          Với thạch anh 12 Mhz là 1000000/1000000=1 (us)
          Việc sai số dao động của thạch anh thì do số trời quyết định thôi, mua phải con nào thì dùng con đó.

          Comment


          • #20
            Help me file c!

            Em load file .c về nhưng hex toàn lỗi sua mãi mà ko dc.nhờ các bác xem jùm em!

            Comment


            • #21
              cac bac giup em nhe.em cung co ban code ve dong ho hien thi tren lcd. nhung gio em muon chuyen hien thi tren led thi phai thay doi j.giup em voi day lan ban code cua em #include <REGX52.H>
              #include <stdio.h>
              ////////////////////
              sbit RS=P1^0;
              sbit RW=P1^1;
              sbit EN=P1^2;
              ////////////////////
              char x;
              int daitan=1;
              char so[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x3 9};
              unsigned char gio,phut,giay,time;
              /////////////////////////////
              void delay(unsigned long int t)
              {
              unsigned long int i;
              for(i=0;i<t;i++);
              }
              ////////////////////////////
              void busy_flag(void)
              {
              P2=0xff;
              RS=0;
              RW=1;
              do
              {
              EN=1;
              delay(10);
              EN=0;
              x=P2;
              x=x&0x80;
              }
              while(x==0x80);
              }
              /////////////////////////
              void write_command(unsigned char LCD_command)
              {
              busy_flag();
              P2=LCD_command;
              RS=0;
              RW=0;
              EN=1;
              delay(50);
              EN=0;
              delay(50);
              }
              /////////////////////////
              void write_data(unsigned char LCD_data)
              {
              busy_flag();
              P2=LCD_data;
              RS=1;
              RW=0;
              EN=1;
              delay(50);
              EN=0;
              delay(50);
              }
              //////////////////////////////
              void write_string(char *s)
              {
              while(*s)
              {
              write_data(*s);
              s++;
              }
              }
              //////////////////////////////
              void init(void)
              {
              write_command(0x03);
              write_command(0x38);
              write_command(0x06);
              write_command(0x0c);
              write_command(0x01);
              }
              /////////////////////////////

              ////////////////////////////////
              void main()
              {
              time=giay=phut=gio=0;
              TMOD=0x01;
              IE=0x83;
              IP=0x01;
              IT0=1;
              TF0=1;
              delay(1000);
              init();

              while(1)
              {
              write_command(0x80);
              write_string("DESIGNER:NC-HUAN");
              write_command(0xC4);
              write_data(so[gio/10]);
              write_data(so[gio%10]);
              write_string(":");
              write_data(so[phut/10]);
              write_data(so[phut%10]);
              write_string(":");
              write_data(so[giay/10]);
              write_data(so[giay%10]);
              write_string(" ");
              }
              }

              void ngatTimer0(void) interrupt 1 //dem thoi gian
              {
              TF0=0;
              TR0=0;
              TH0=-50200/256;
              TL0=-50200%256;
              TR0=1;
              time++;
              if(time==20)
              {
              giay++;
              if(giay==60)
              {
              phut++;
              if(phut==60)
              {
              gio++;
              if(gio==24)
              gio=0;
              phut=0;
              }
              giay=0;
              }
              time=0;
              }
              }

              void ngatngoai0(void) interrupt 0 //chinh thoi gian
              {
              TR0=0;
              do
              {
              P0=0xff;
              if(P0==0xfe)
              {
              ++giay;
              if(giay==60)
              giay=0;
              delay(2000);
              }
              if(P0==0xfd)
              {
              ++phut;
              if(phut==60)
              phut=0;
              delay(2000);
              }
              if(P0==0xfb)
              {
              ++gio;
              if(gio==24)
              gio=0;
              delay(2000);
              }
              write_command(0xC4);
              write_data(so[gio/10]);
              write_data(so[gio%10]);
              write_string(":");
              write_data(so[phut/10]);
              write_data(so[phut%10]);
              write_string(":");
              write_data(so[giay/10]);
              write_data(so[giay%10]);
              } while(P0!=0xf7);
              P0=0xff;
              TR0=1;
              }

              Comment


              • #22
                bai nao biet giup gium em nha em ko biet neu hien thi tren led thi code se thay doi nhu the nao
                hothieugia86@gmail.com

                Comment


                • #23
                  bạn phải dùng con thời gian thực thì chạy mới có thể gọi là chính xác được, chẳng hạn minh dùng con DS1307, làm cái đồng hồ hiển thị bằng Led 7 thanh, chạy cũng khá chính xác, chạy 5 tháng rùi mà vẫn ngon, minh là dân Hệ thống điện nên chỉ làm cho vui thui
                  đây là code
                  /*//////////////////////////////////////////////////
                  * DONG HO DIEN TU SO
                  * File: version2.c
                  * Programmer: Nguyen Van Dung
                  * Email: dungbk51@yahoo.com.vn
                  * Version: 2.0
                  * Compiler: Keil uVision 3
                  * Update: dungbk51 12/08/2008
                  * System:
                  - ...
                  *///////////////////////////////////////////////////
                  #include <AT89X51.h>


                  #define SDA P2_1 //SDA
                  #define SCL P2_0 //SCL

                  #define s_inc P3_0
                  #define s_dec P3_1
                  #define select P3_3



                  #define DISABLE_INT IE=0x00; //cam toan bo ngat
                  #define ENABLE_INT IE=0x81; //cho phep ngat ngoai so 0


                  #define CLK {SCL=1;{};{};{};{};{};SCL=0;{};{};{};{};{};}
                  #define ACK {SDA=0;CLK;}
                  #define NO_ACK {SDA=1;CLK;}
                  #define I2C_START {SDA=1;SCL=1;{};{};{};{};{};SDA=0;{};{};{};{};{};S CL=0;{};{};{};{};{};} // Marco
                  #define I2C_STOP {SDA=0;SCL=1;{};{};{};{};{};SDA=1;{};{};{};{};{};}//Marco


                  bit flag;
                  unsigned char sec,min,hour,day,date,mon,year,tgmin,tghour,tg1,tg 2,i;

                  unsigned char sec1,min1,hour1,day1,date1,mon1,year1;//ma thap phan
                  unsigned char sec2,min2,hour2,day2,date2,mon2,year2;//ma thap phan
                  unsigned char led_array[11]={0x40,0x73,0x24,0x21,0x13,0x09,0x08,0x63,0x00,0x0 1,0x7f};



                  //doi thap phan sang thap luc phan va nguoc lai
                  unsigned char hex_dec(unsigned char hex)
                  {
                  return((hex/0x10)*0xA+(hex%0x10));
                  }

                  unsigned char dec_hex(unsigned char dec)
                  {
                  return((dec/0xA)*0x10+(dec%0xA));
                  }

                  void I2C_RW(unsigned char);
                  unsigned char I2C_RD(bit);
                  void RTC_Read(void);
                  void RTC_Write(void);
                  //chuong trinh hien thi dong ho
                  void delay(void);
                  void dislay(void);
                  void set_clock(void);
                  void tre_1phan6_giay(void);
                  //chuong trinh chinh
                  void main ()
                  {
                  P3=0xff;
                  ENABLE_INT

                  //can lam chuong bao khi co dien o day



                  while(1)
                  {


                  RTC_Read();


                  sec1=sec/16; //doan nay tre qua lon den khong sang deu
                  sec2=sec%16;

                  min1=min/16;
                  min2=min%16;

                  hour1=hour/16;
                  hour2=hour%16;
                  if (hour1==0) hour1=10;

                  date1=date/16;
                  date2=date%16;
                  if (date1==0) date1=10;

                  mon1=mon/16;
                  mon2=mon%16;
                  if(mon1==0) mon1=10;

                  year1=year/16;
                  year2=year%16;

                  dislay();

                  if (flag!=0)
                  {

                  flag=0;
                  sec1=sec2=0;
                  hour=hex_dec(hour);
                  min=hex_dec(min);
                  mon=hex_dec(mon);
                  date=hex_dec(date);
                  year=hex_dec(year);

                  set_clock();


                  //sau khi da chinh xong
                  min=dec_hex(min);
                  hour=dec_hex(hour);
                  mon=dec_hex(mon);
                  date=dec_hex(date);
                  year=dec_hex(year);

                  RTC_Write();//sau khi thuc hien cau lenh nay thi thoat
                  P3=0xff;
                  flag=0;


                  }

                  }}


                  voidflag() interrupt 0 //ngat ngoai so 0
                  {
                  flag =1;
                  }



                  void I2C_WR(unsigned char c)
                  {
                  char i;
                  for (i=7;i>=0;i--)
                  { //sau khi START thi SCL=0;SDA=1---co the thay doi data khi SCL=0
                  SDA= (c>>i) & 0x01;
                  CLK;
                  }
                  ACK;

                  }

                  unsigned char I2C_RD(bit ack)
                  {
                  unsigned char c=0;
                  bit a;
                  char i;
                  for (i=7;i>=0;i--)
                  {
                  SDA=1;//cau hinh lam cong vao
                  SCL=1;
                  {};{};{};{};{}; // SCL tu 1 xuong 0
                  a=SDA;
                  SCL=0;{};{};{};
                  c=c<<1;
                  if (a) c++;
                  }
                  SDA=ack; //bit ACK
                  CLK;
                  return (c);
                  }



                  void RTC_Read()
                  {
                  I2C_START
                  I2C_WR(0xd0);
                  I2C_WR(0x00); //vi tri con tro RTC
                  I2C_STOP
                  I2C_START
                  I2C_WR(0xd1);
                  sec=I2C_RD(0);
                  min=I2C_RD(0);
                  hour=I2C_RD(0);
                  day=I2C_RD(0);
                  date=I2C_RD(0);
                  mon=I2C_RD(0);
                  year=I2C_RD(1); //ket thuc doc du lieu
                  I2C_STOP
                  }


                  /*----------------------------------

                  --------------------------------*/
                  void RTC_Write()
                  {

                  I2C_START
                  I2C_WR(0xd0);
                  I2C_WR(0x00); //vi tri con tro RTC
                  I2C_WR(0x00); //giay
                  I2C_WR(min); //phut
                  I2C_WR(hour); //gio
                  I2C_WR(day); //thu
                  I2C_WR(date); //ngay
                  I2C_WR(mon); //thang
                  I2C_WR(year); //nam
                  I2C_WR(0x10);
                  I2C_STOP;
                  }




                  void delay(void)
                  {

                  TMOD=0x01;
                  TL0=0x72;
                  TH0=0xdf;
                  TR0=1;
                  while(TF0==0);
                  TR0=0;
                  TF0=0;

                  }




                  void dislay(void)
                  {

                  tre_1phan6_giay();
                  tre_1phan6_giay();

                  tre_1phan6_giay();
                  tre_1phan6_giay();
                  tre_1phan6_giay();
                  tre_1phan6_giay();


                  }

                  /*--------------------------------------*/

                  void tre_1phan6_giay(void)
                  {

                  unsigned char i;
                  for(i=1;i<5;i++)
                  {

                  P2=0xdf;
                  P0=led_array[date1];
                  P1=led_array[hour1];
                  delay();

                  P2=0xbf;
                  P0=led_array[date2];
                  P1=led_array[hour2];
                  delay();

                  P2=0x7f;
                  P0=led_array[mon1];
                  P1=led_array[min1];
                  delay();

                  P2=0xef;
                  P0=led_array[mon2];
                  P1=led_array[min2];
                  delay();

                  P2=0xf7;
                  P0=led_array[year1];
                  P1=led_array[sec1];
                  delay();

                  P2=0xfb;
                  P0=led_array[year2];
                  P1=led_array[sec2];
                  delay();



                  }
                  }

                  void set_clock(void)
                  {
                  //chinh theo thu tu ngay thang nam gio phut giay
                  while(1)//set_hour
                  {

                  delay();//chong rung phim

                  for(i=0;i<6;i++)
                  {
                  P3=0xff;//cong P3 lam cong vao

                  if(i<3) {hour1=hour2=10;}
                  else {hour1=hour/10; hour2=hour%10;}
                  tre_1phan6_giay();//hien thi va chong rung phim
                  tre_1phan6_giay();
                  if(s_inc==0) //cho tang gio
                  {
                  hour++;
                  if(hour==24) hour=0;
                  //chong rung phim
                  }

                  if(s_dec==0)
                  {
                  hour--;
                  if(hour==0xff) hour=23;
                  //chong rung phim
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap for cua chinh gio
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap while cua set_hour
                  }
                  if(flag!=0) goto exit;
                  hour1=hour/10;
                  hour2=hour%10;

                  while(1)//set_min
                  {

                  delay();//chong rung phim

                  for(i=0;i<6;i++)
                  {
                  P3=0xff;//cong P3 lam cong vao

                  if(i<3) {min1=min2=10;}
                  else {min1=min/10; min2=min%10;}
                  tre_1phan6_giay();//hien thi va chong rung phim
                  tre_1phan6_giay();

                  if(s_inc==0)
                  {
                  min++;
                  if(min==60) min=0;
                  //chong rung phim
                  }

                  if(s_dec==0)
                  {
                  min--;
                  if(min==0xff) min=59;
                  //chong rung phim
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap for
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap while
                  }
                  if (flag!=0) goto exit;
                  min1=min/10;
                  min2=min%10;

                  while(1)//set_date
                  {

                  delay();//chong rung phim

                  for(i=0;i<6;i++)
                  {
                  P3=0xff;//cong P3 lam cong vao

                  if(i<3) {date1=date2=10;}
                  else {date1=date/10; date2=date%10;}
                  tre_1phan6_giay();//hien thi va chong rung phim
                  tre_1phan6_giay();//hien thi va chong rung phim

                  if(s_inc==0)
                  {
                  date++;
                  if(date==32) date=1;
                  //chong rung phim
                  }

                  if(s_dec==0)
                  {
                  date--;
                  if(date==0) date=31;
                  //chong rung phim
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap for
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap while
                  }
                  if (flag!=0) goto exit;
                  date1=date/10;
                  date2=date%10;

                  while(1)//set_mon
                  {

                  delay();//chong rung phim

                  for(i=0;i<6;i++)
                  {
                  P3=0xff;//cong P3 lam cong vao

                  if(i<3) {mon1=mon2=10;}
                  else {mon1=mon/10; mon2=mon%10;}
                  tre_1phan6_giay();//hien thi va chong rung phim
                  tre_1phan6_giay();//hien thi va chong rung phim

                  if(s_inc==0)
                  {
                  mon++;
                  if(mon==13) mon=1;
                  //chong rung phim
                  }

                  if(s_dec==0)
                  {
                  mon--;
                  if(mon==0) mon=12;
                  //chong rung phim
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap for
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap while
                  }
                  if (flag!=0) goto exit;
                  mon1=mon/10;
                  mon2=mon%10;

                  while(1)//set_year
                  {

                  delay();//chong rung phim

                  for(i=0;i<6;i++)
                  {
                  P3=0xff;//cong P3 lam cong vao

                  if(i<3) {year1=year2=10;}
                  else {year1=year/10; year2=year%10;}
                  tre_1phan6_giay();//hien thi va chong rung phim
                  tre_1phan6_giay();//hien thi va chong rung phim

                  if(s_inc==0)
                  {
                  year++;
                  if(year==100) year=0;
                  //chong rung phim
                  }

                  if(s_dec==0)
                  {
                  year--;
                  if(year==0xff) year=99;
                  //chong rung phim
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap for
                  }

                  if((flag!=0)|(select==0)) break; //thoat ra khoi vong lap while
                  }
                  if (flag!=0) goto exit;
                  year1=year/10;
                  year2=year%10;
                  exit: flag=0;

                  }

                  còn đây là sản phẩm, minh đang dự đinh nâg cấp thành hiển thị LCD và có hẹn h, bạn nào quan tâm thì liên hệ nvdung8987@yahoo.com hoặc dungbk51@yahoo.com.vn
                  Attached Files

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X