Mọi người giúp dùm mình nhé,sắp tết rồi làm cái đồng hồ đem về quê cho gia đình.Mình có đọc các bài viết trước của các bạn,có bạn cũng làm thành công!mình hy vọng bạn nào làm thành công có kinh nghiệm chỉ giáo lại dùm mình nhé.
Sơ đồ mạch mô phỏng:
![](http://nh9.upanh.com/b6.s25.d1/f6b7f84b457fccb863d39357d623f50a_39905829.112201222533pm.png)
code:
#include <REGX51.H>
//==========================================
//Cac chan dieu khien
#define SEC 0x00
#define MIN 0x01
#define HOUR 0x02
char sec,hour,min;
sbit L01 = P2^0; //LED 1
sbit L02 = P2^1; //
sbit L03 = P2^2;
sbit L04 = P2^3;
sbit L05 = P2^4;
sbit L06 = P2^5; //LED 6
sbit SCL = P1^1; // Dieu khien doc ghi Data
sbit SDA = P1^0; // Dieu khien xung Clock
sbit MENU = P3^0;
sbit OK = P3^4;
sbit DOWN = P3^2;
sbit UP = P3^1;
//************************************************** ****************************
// KHAI BAO BIEN, MANG...
unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //Decimal to Led7seg
unsigned char Data,time,index,setx,bat_nhay,read_time=0;
// KHAI BAO HAM, CHUONG TRINH CON
void set_main(void); // Chuong trinh khoi tao main
void setup_timer(void); // Chuong trinh cai dat timer
void delay(unsigned int time); // Delay
void Set_Clock(void); // Kiem tra va hieu chinh gia tri cua gio,phut,giay
void Keypad(void); // Kiem tra xu ly phim nhan
void T1_ISR(void); // Ngat timer 1 de nhay led
void T0_ISR(void); // Ngat timer 0 de quet led
// CAC CHUONG TRINH CON CHO I2C
//************************************************** ****************************
void I2C_start(void)
{
SCL = 1; SCL = 0;
SDA = 1; SCL = 1;
delay(2);
SDA = 0; delay(2);
SCL = 0; delay(2);
}
void I2C_stop(void)
{
SCL = 1; SCL = 0;
SDA = 0; delay(2);
SCL = 1; delay(2);
SDA = 1;
}
bit I2C_write(unsigned char dat)
{
unsigned char i;
for (i=0;i<8;i++)
{
SDA = (dat & 0x80) ? 1:0;
SCL=1;SCL=0;
dat<<=1;
}
SCL = 1; delay(2);
SCL = 0;
return dat;
}
unsigned char I2C_read(void)
{
bit rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++) /* For loop read data 1 byte */
{
delay(2);
SCL = 1; delay(2); /* Set SCL */
rd_bit = SDA; /* Keep for check acknowledge */
dat = dat<<1;
dat = dat | rd_bit; /* Keep bit data in dat */
SCL = 0; /* Clear SCL */
}
return dat;
}
//************************************************** ****************************
// CAC CHUONG TRINH CON CHO DS1307
//************************************************** ****************************
unsigned char DS1307_read(unsigned char addr)
{
unsigned int temp,ret;
I2C_start(); /* Start i2c bus */
I2C_write(0xD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_start(); /* Start i2c bus */
I2C_write(0XD1); /* Connect to DS1307 for Read */
ret = I2C_read(); /* Receive data */
I2C_stop();
//************************************************** ********
temp = ret; /*BCD to HEX*/
ret = (((ret/16)*10)+ (temp & 0x0f)); /*for Led 7seg*/
//************************************************** ********
return ret;
}
void DS1307_Write(unsigned char addr,unsigned char dat)
{
unsigned int temp;
//**********************************************
temp = dat ; /*HEX to BCD*/
dat = (((dat/10)*16)|(temp %10)); /*for Led 7seg*/
//**********************************************
I2C_start(); /* Start i2c bus */
I2C_write(0XD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_write(dat); /* Connect to DS1307 for Read */
I2C_stop();
}
void Out_1Hz()
{
I2C_start(); /* Start i2c bus */
I2C_write(0xD0); /* Connect to DS1307 */
I2C_write(0x07); /* thanh ghi CONTROL */
I2C_write(0x10); /* lay ra xung chuan 1Hz ~ 1s */
I2C_stop();
}
void Read_DS1307()
{
sec = DS1307_read(SEC);
min = DS1307_read(MIN);
hour = DS1307_read(HOUR);
}
void Write_DS1307()
{
DS1307_Write(SEC,sec);
DS1307_Write(MIN,min);
DS1307_Write(HOUR,hour);
}
//************************************************** ****************************
void delay(unsigned int time)
{
while(time--); // chuong trinh con delay
}
void set_main(void) // Chuong trinh khoi tao main
{
P0=P1=P3=0x00;
P2=0xFF; // P2 chan dieu khien led
UP=DOWN=MENU=OK=1; // set cac swith len 1,tich cuc muc thap
}
void setup_timer(void) // Setup timer 0;1;
{
TMOD=0x11; // timer0 & timer1 set che do 8 bit tu nap lai
TH0=-1000/256; TL0=-1000%256;
TH1=0x3C; TL1=0xAF;
ET1=1; ET0=1; EA=1;
TF0=0; TF1=0;
TR0=1; TR1=1;
}
void T1_ISR(void) interrupt 3 // Dung ngat Timer0 de doc DS1307
{
TR1=0;TF1=0;
TH1=0x3C; // nap lai gia tri cho thanh ghi
TL1=0xAF;
time++;
if(time==5)
{
time=0; bat_nhay++; read_time=1;
if(bat_nhay==3)
bat_nhay=0; // chop tat khi dieu chinh Clock
}
TR1=1;
}
//*************************************
void T0_ISR(void) interrupt 1 // Dung ngat Timer1 de hien thi 6 Led_7D
{
TR0=0;TF0=0;
TH0=-1000/256; // Nap lai gia tri cho thanh ghi
TL0=-1000%256;
{
index++;
P2=0xFF;L01=L02=L03=L04=L05=L06=1;
if(index==1)
{
Data=sec;
P0=0xff; // data led ,tat het led
if((setx==3 && bat_nhay==1))
{ index++; index++; }
else
{
L01=0; // bat led 1 Giay
P0=led7_data[Data%10];//xuat gia tri hang don vi
}
}
if(index==2)
{
P0=0xff;
L02=0; // bat led 2 Chuc Giay
P0=led7_data[Data/10]; //xuat gia tri hang chuc
}
if(index==3)
{
Data=min;
P0=0xff;
if((setx==1 && bat_nhay==1))
{ index++; index++; }
else
{
L03=0; // bat led 3 phut
P0=led7_data[Data%10];
}
}
if(index==4)
{
P0=0xff;
L04=0; // bat led 4 Chuc phut
P0=led7_data[Data/10];
}
if(index==5)
{
Data=hour;
P0=0xff;
if(setx==2 && bat_nhay==1)
{
index++;
index++;
}
else
{
L05=0; // bat led 5 Gio
P0=led7_data[Data%10];
}
}
if(index==6)
{
P0=0xff;
L06=0; // bat led 6 Chuc gio
P0=led7_data[Data/10];
}
if(index==7) index=0; //reset lai chi so chay index
}
TR0=1;
}
//****************************************
void Set_Clock(void) // Kiem tra va hieu chinh gia tri cua gio,phut,giay
{
//Tang
if(sec ==60) {sec=0; }
if(min ==60) {min =0;}
if(hour==24) {hour=0;}
//Giam
if(min ==-1) {min =59;}
if(hour==-1) {hour=23;}
}
//////////////////////////////////////////////////////
void Keypad(void) // Kiem tra phim bam.
{
//*******SET=0: DONG HO CHAY BINH THUONG****************
//*******SET=1: CHINH PHUT******************************
//*******SET=2: CHINH GIO*******************************
if(MENU==0)
{
while(MENU==0)
{;}
setx++;
if(setx==4)
{ setx=0; Write_DS1307();}
}
if(OK==0)
{
while (OK==0)
{;}
setx=0;
Write_DS1307();
}
if(setx==1)
{
if(UP==0)
{
while(UP==0) {;}
min++;
}
if(DOWN==0)
{
while(DOWN==0) {;}
min--;
}
}
if(setx==2)
{
if(UP==0)
{
while(UP==0) {;}
hour++;
}
if(DOWN==0)
{
while(DOWN==0) {;}
hour--;
}
}
if(setx==3)
{
if(UP==0)
{
while(UP==0) {;}
sec=sec+10;;
}
if(DOWN==0)
{
while(DOWN==0) {;}
sec=sec-10;
}
}
Set_Clock();
delay(1000);
}
//************ CHUONG TRINH CHINH *************
void main()
{
delay(5000);
Out_1Hz();
set_main();
time=index=setx=read_time=0;
setup_timer();
while(1)
{
Keypad();
if((setx==0)&&(read_time==1))
{
read_time = 0;
Read_DS1307();
}
else
{
sec = DS1307_read(SEC);
}
}
}
hiện tượng: vi điều khiển đã hoạt động,điểu chỉnh phím tăng giảm ok,nhưng chưa đọc được dữ liệu từ ds1307.Led nhấp nháy 1s chưa hoạt động được,mong các bạn giúp đỡ nhé.Thank!!
Sơ đồ mạch mô phỏng:
![](http://nh9.upanh.com/b6.s25.d1/f6b7f84b457fccb863d39357d623f50a_39905829.112201222533pm.png)
code:
#include <REGX51.H>
//==========================================
//Cac chan dieu khien
#define SEC 0x00
#define MIN 0x01
#define HOUR 0x02
char sec,hour,min;
sbit L01 = P2^0; //LED 1
sbit L02 = P2^1; //
sbit L03 = P2^2;
sbit L04 = P2^3;
sbit L05 = P2^4;
sbit L06 = P2^5; //LED 6
sbit SCL = P1^1; // Dieu khien doc ghi Data
sbit SDA = P1^0; // Dieu khien xung Clock
sbit MENU = P3^0;
sbit OK = P3^4;
sbit DOWN = P3^2;
sbit UP = P3^1;
//************************************************** ****************************
// KHAI BAO BIEN, MANG...
unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //Decimal to Led7seg
unsigned char Data,time,index,setx,bat_nhay,read_time=0;
// KHAI BAO HAM, CHUONG TRINH CON
void set_main(void); // Chuong trinh khoi tao main
void setup_timer(void); // Chuong trinh cai dat timer
void delay(unsigned int time); // Delay
void Set_Clock(void); // Kiem tra va hieu chinh gia tri cua gio,phut,giay
void Keypad(void); // Kiem tra xu ly phim nhan
void T1_ISR(void); // Ngat timer 1 de nhay led
void T0_ISR(void); // Ngat timer 0 de quet led
// CAC CHUONG TRINH CON CHO I2C
//************************************************** ****************************
void I2C_start(void)
{
SCL = 1; SCL = 0;
SDA = 1; SCL = 1;
delay(2);
SDA = 0; delay(2);
SCL = 0; delay(2);
}
void I2C_stop(void)
{
SCL = 1; SCL = 0;
SDA = 0; delay(2);
SCL = 1; delay(2);
SDA = 1;
}
bit I2C_write(unsigned char dat)
{
unsigned char i;
for (i=0;i<8;i++)
{
SDA = (dat & 0x80) ? 1:0;
SCL=1;SCL=0;
dat<<=1;
}
SCL = 1; delay(2);
SCL = 0;
return dat;
}
unsigned char I2C_read(void)
{
bit rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++) /* For loop read data 1 byte */
{
delay(2);
SCL = 1; delay(2); /* Set SCL */
rd_bit = SDA; /* Keep for check acknowledge */
dat = dat<<1;
dat = dat | rd_bit; /* Keep bit data in dat */
SCL = 0; /* Clear SCL */
}
return dat;
}
//************************************************** ****************************
// CAC CHUONG TRINH CON CHO DS1307
//************************************************** ****************************
unsigned char DS1307_read(unsigned char addr)
{
unsigned int temp,ret;
I2C_start(); /* Start i2c bus */
I2C_write(0xD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_start(); /* Start i2c bus */
I2C_write(0XD1); /* Connect to DS1307 for Read */
ret = I2C_read(); /* Receive data */
I2C_stop();
//************************************************** ********
temp = ret; /*BCD to HEX*/
ret = (((ret/16)*10)+ (temp & 0x0f)); /*for Led 7seg*/
//************************************************** ********
return ret;
}
void DS1307_Write(unsigned char addr,unsigned char dat)
{
unsigned int temp;
//**********************************************
temp = dat ; /*HEX to BCD*/
dat = (((dat/10)*16)|(temp %10)); /*for Led 7seg*/
//**********************************************
I2C_start(); /* Start i2c bus */
I2C_write(0XD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_write(dat); /* Connect to DS1307 for Read */
I2C_stop();
}
void Out_1Hz()
{
I2C_start(); /* Start i2c bus */
I2C_write(0xD0); /* Connect to DS1307 */
I2C_write(0x07); /* thanh ghi CONTROL */
I2C_write(0x10); /* lay ra xung chuan 1Hz ~ 1s */
I2C_stop();
}
void Read_DS1307()
{
sec = DS1307_read(SEC);
min = DS1307_read(MIN);
hour = DS1307_read(HOUR);
}
void Write_DS1307()
{
DS1307_Write(SEC,sec);
DS1307_Write(MIN,min);
DS1307_Write(HOUR,hour);
}
//************************************************** ****************************
void delay(unsigned int time)
{
while(time--); // chuong trinh con delay
}
void set_main(void) // Chuong trinh khoi tao main
{
P0=P1=P3=0x00;
P2=0xFF; // P2 chan dieu khien led
UP=DOWN=MENU=OK=1; // set cac swith len 1,tich cuc muc thap
}
void setup_timer(void) // Setup timer 0;1;
{
TMOD=0x11; // timer0 & timer1 set che do 8 bit tu nap lai
TH0=-1000/256; TL0=-1000%256;
TH1=0x3C; TL1=0xAF;
ET1=1; ET0=1; EA=1;
TF0=0; TF1=0;
TR0=1; TR1=1;
}
void T1_ISR(void) interrupt 3 // Dung ngat Timer0 de doc DS1307
{
TR1=0;TF1=0;
TH1=0x3C; // nap lai gia tri cho thanh ghi
TL1=0xAF;
time++;
if(time==5)
{
time=0; bat_nhay++; read_time=1;
if(bat_nhay==3)
bat_nhay=0; // chop tat khi dieu chinh Clock
}
TR1=1;
}
//*************************************
void T0_ISR(void) interrupt 1 // Dung ngat Timer1 de hien thi 6 Led_7D
{
TR0=0;TF0=0;
TH0=-1000/256; // Nap lai gia tri cho thanh ghi
TL0=-1000%256;
{
index++;
P2=0xFF;L01=L02=L03=L04=L05=L06=1;
if(index==1)
{
Data=sec;
P0=0xff; // data led ,tat het led
if((setx==3 && bat_nhay==1))
{ index++; index++; }
else
{
L01=0; // bat led 1 Giay
P0=led7_data[Data%10];//xuat gia tri hang don vi
}
}
if(index==2)
{
P0=0xff;
L02=0; // bat led 2 Chuc Giay
P0=led7_data[Data/10]; //xuat gia tri hang chuc
}
if(index==3)
{
Data=min;
P0=0xff;
if((setx==1 && bat_nhay==1))
{ index++; index++; }
else
{
L03=0; // bat led 3 phut
P0=led7_data[Data%10];
}
}
if(index==4)
{
P0=0xff;
L04=0; // bat led 4 Chuc phut
P0=led7_data[Data/10];
}
if(index==5)
{
Data=hour;
P0=0xff;
if(setx==2 && bat_nhay==1)
{
index++;
index++;
}
else
{
L05=0; // bat led 5 Gio
P0=led7_data[Data%10];
}
}
if(index==6)
{
P0=0xff;
L06=0; // bat led 6 Chuc gio
P0=led7_data[Data/10];
}
if(index==7) index=0; //reset lai chi so chay index
}
TR0=1;
}
//****************************************
void Set_Clock(void) // Kiem tra va hieu chinh gia tri cua gio,phut,giay
{
//Tang
if(sec ==60) {sec=0; }
if(min ==60) {min =0;}
if(hour==24) {hour=0;}
//Giam
if(min ==-1) {min =59;}
if(hour==-1) {hour=23;}
}
//////////////////////////////////////////////////////
void Keypad(void) // Kiem tra phim bam.
{
//*******SET=0: DONG HO CHAY BINH THUONG****************
//*******SET=1: CHINH PHUT******************************
//*******SET=2: CHINH GIO*******************************
if(MENU==0)
{
while(MENU==0)
{;}
setx++;
if(setx==4)
{ setx=0; Write_DS1307();}
}
if(OK==0)
{
while (OK==0)
{;}
setx=0;
Write_DS1307();
}
if(setx==1)
{
if(UP==0)
{
while(UP==0) {;}
min++;
}
if(DOWN==0)
{
while(DOWN==0) {;}
min--;
}
}
if(setx==2)
{
if(UP==0)
{
while(UP==0) {;}
hour++;
}
if(DOWN==0)
{
while(DOWN==0) {;}
hour--;
}
}
if(setx==3)
{
if(UP==0)
{
while(UP==0) {;}
sec=sec+10;;
}
if(DOWN==0)
{
while(DOWN==0) {;}
sec=sec-10;
}
}
Set_Clock();
delay(1000);
}
//************ CHUONG TRINH CHINH *************
void main()
{
delay(5000);
Out_1Hz();
set_main();
time=index=setx=read_time=0;
setup_timer();
while(1)
{
Keypad();
if((setx==0)&&(read_time==1))
{
read_time = 0;
Read_DS1307();
}
else
{
sec = DS1307_read(SEC);
}
}
}
hiện tượng: vi điều khiển đã hoạt động,điểu chỉnh phím tăng giảm ok,nhưng chưa đọc được dữ liệu từ ds1307.Led nhấp nháy 1s chưa hoạt động được,mong các bạn giúp đỡ nhé.Thank!!
Comment