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