Tình hình là em đang nghiên cứu mạch đồng hồ thời gian thực 89s52+rtcds1307.Tuy đã chạy được nhưng giây chỉ đếm được tới 39 rồi về 00, rồi lại đếm tới 19 thì mới được 1 phút còn phút cũng có lỗi tương tự, các thanh ghi khác bình thường. Mấy bác xem giúp em với em cảm ơn.
còn đây là link video về lỗi:
https://youtu.be/Mvx2esuPxxQ
còn đây là link video về lỗi:
https://youtu.be/Mvx2esuPxxQ
Code:
#include <REGX51.H> //============== sbit SCL =P1^0; //KHAI BAO KET NOI DS1307 sbit SDA =P1^1; //============== bit ackread; unsigned char s=0,min=0,h=0; //============================================== void delay(unsigned int t) // HAM DELAY { unsigned int x,y; for(x=0;x<t;x++) { for(y=0;y<123;y++); } } //============================================== //============================================== void start(void) //START CONDITION { delay (1); SCL=SDA=1; delay (1); SDA=0; delay (1); SCL=0; } //============================================== //============================================== void stop(void) //STOP CONDITION { delay (1); SCL=0; delay (1); SDA=0; delay (1); SCL=1; delay (1); SDA=1; } //============================================== //============================================== void bitnacksend(void) //SEND BIT NACK { SDA=1; delay(1) ; SCL=1; delay(1) ; SCL=0; SDA=0; } //============================================== //============================================== void bitacksend(void) //SEND BIT ACK { SDA=0; delay(2) ; SCL=1; delay(2) ; SCL=0; } //============================================== //============================================== void datatransmission(unsigned char dt) //TRUYEN DU LIEU { unsigned int bt; do { for (bt=0;bt<8;bt++) { SDA=(dt&0X80)? 1:0; delay (2); SCL=1; delay (2); SCL=0; delay (2); dt<<=1; } delay(2); SCL=1; delay(2); SDA=ackread; delay(2); SCL=0; } while(ackread==1); //LAM CHO TOI KHI GOI DUOC DU LIEU } //============================================== //============================================== unsigned char readdata(bit ackr) //DOC DU LIEU { bit dtbit ; unsigned char dt_read=0x00,cout; SDA=1; for(cout=0;cout<8;cout++) { delay(1) ; SCL=1; delay(1) ; dtbit=SDA; dt_read=dt_read|dtbit; dt_read=dt_read<<1; delay(1); SCL=0; delay(1); } if(ackr==1) //GOI BIT NACK NEU ACKR=1 { bitnacksend(); } else //GOI BIT ACK NEU ACKR=0 { bitacksend(); } return dt_read; } //============================================== //============================================== void Ds1307_Init(void) //KHOI TAO DS1307 { unsigned int tmp; start(); datatransmission(0xd0); //GHI DIA CHI VA BIT GHI=0 DS1307 datatransmission(0x00); //GHI DIA CHI CAN DOC start(); datatransmission(0xd1);//GHI DIA CHI VA BIT DOC=1 tmp=readdata(1); // DOC DU LIEU TU DS1307 VA GAN VAO temp stop(); tmp &= 0x7F; //AND VOI 0X7F DE DUOC BIT CH=0 start(); datatransmission(0xd0);//GHI DIA CHI VA BIT GHI=0 DS1307 datatransmission(0x00); //GHI DIA CHI CAN GHI datatransmission(tmp); //GHI GIA TRI CUA BIEN TEMP stop(); P3=0; } //============================================== void main() //HAM CHUONG TRINH CHINH { Ds1307_Init(); while(1)//VONG LAP VO HAN { start(); datatransmission(0xd0); //GHI DIA CHI VA BIT GHI=0 DS1307 datatransmission(0x00); //GHI DIA CHI CAN DOC start(); datatransmission(0xd1);//GHI DIA CHI VA BIT DOC=1 s=readdata(0); min=readdata(0); h=readdata(1); // DOC DU LIEU TU DS1307 stop(); delay(333);//DOC 3 LAN TRONG 1 GIAY if(P2_0==0) { P3=h; //XUAT GIO RA IC GIAI MA 4511 NEU P2_0=0 } else if(P2_1==0) { P3=min; //XUAT PHUT RA IC GIAI MA 4511 NEU P2_1=0 } else { P3=s; //MAC DINH XUAT GIAY RA IC GIAI MA 4511 } } } //============================================== //END
Comment