Nguyên văn bởi mrcuongcon
Xem bài viết
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
-
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
-
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.Nguyên văn bởi otacon Xem bài viếtTheo 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ữahãy cố gắng dù vướn phải thất bại!!!!!!!!
Comment
-
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 12MhzBÁ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.
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!Last edited by mrcuongcon; 20-10-2008, 19:47.
Comment
-
Thời gian 1 chu kỳ máy: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
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
-
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
-
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
-
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
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi bqvietBqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
-
Channel: Thiết bị điện tử cá nhân
06-12-2025, 17:17 -
-
Trả lời cho Xin hỏi về mạch thu FM/AM trong catsettebởi nguyendinhvanTheo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
-
Channel: Điện thanh
05-12-2025, 19:59 -
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi afrendlyCó vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
-
Channel: Thiết bị điện tử cá nhân
04-12-2025, 01:27 -
-
Trả lời cho Máy điện châm ?bởi nick22Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
-
Channel: Điện tử y sinh
01-12-2025, 13:23 -

Comment