Nguyên văn bởi mrcuongcon
Xem bài viết
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, 18: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 Tìm bạn thân quen cũ.bởi lvhnE nhớ bác Vivanpham làm bên điện tử y sinh, có lần đó cái sơ đồ máy chụp x quang sao có mấy con thryristor làm gì mà ko ai trả lới đúng cả
...
-
Channel: Tâm tình dân kỹ thuật
07-08-2026, 09:17 -
-
Trả lời cho Amply bị rò DC 22 voltbởi lvhnBác kiểm tra lại đường mạch, mối hàn xem có bị hở hoặc dẫn không tốt không?
Thay cầu diode lớn hơn càng tốt không vấn đề gì cả....-
Channel: Điện thanh
07-08-2026, 09:12 -
-
bởi LantheChào bạn.
Trục đầu ra của hộp số hành tinh xoắn ốc được kết nối với mặt bích của khách hàng thông qua một trục răng trong. Sau chưa đầy sáu tháng hoạt động, nó phát ra tiếng kêu lách cách và độ rơ lớn đáng báo động.
Việc...-
Channel: Thiết bị điện tử cá nhân
06-08-2026, 13:05 -
-
bởi ittcChào các anh em nhé, mình dự định sắp tới sẽ đi học lái xe Ôtô, thi lấy bằng lái. Cụ thể mình sẽ học và thi lấy giấy phép lái xe hạng B. Thật sự mình là người chưa có kiến thức hiểu biết gì về Ôtô cả ? tất nhiên mình sẽ phải...-
Channel: Tâm tình dân kỹ thuật
06-08-2026, 06:22 -
-
Trả lời cho Amply bị rò DC 22 voltbởi trung30000Theo sự hướng dẫn của bác, sau khi em kiểm tra tầng Vi sai sử dụng cặp c1815, tiếp đến là 1 con a1013, và cặp thúc sử dụng mje304g và mje305g, em đã tiến hành thay cặp Vi sai c1815 sau đó mở máy lên đo ngõ công suất DC 0,2V hai giây sau máy đo...-
Channel: Điện thanh
05-08-2026, 20:09 -

Comment