Мой вариант связи 89С51 и DS1307 (часы) по шине I2C, все тот же KEIL (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Андрей Сорокин 20 марта 2003 г. 20:17
В ответ на: реализация i2c на AT89S53 отправлено vaja 19 марта 2003 г. 23:19

#include

sbit sda=P3^7;
sbit scl=P1^7;

unsigned char input_time[7];
unsigned char output_time[7];
unsigned char input_data, output_data, control=0x10;

void set_time(unsigned char *input_time);
unsigned char read_time(void);
void start_cond(void);
void stop_cond(void);
void ds_ask(void);
void write_data(unsigned char input_data);
unsigned char read_data(void);
void write_control(void);


void main(void){
sda=1;
scl=1;

input_time[0]=0;//second
input_time[1]=0x25;//minutes
input_time[2]=0x18;//hours
input_time[3]=0x4;//data
input_time[4]=0x20;//date
input_time[5]=0x3;//month
input_time[6]=0x3;//year

// write_control();
// while(1);
// set_time(input_time);
// while(1);
read_time();
while(1);
}

void write_control(void){
start_cond();
write_data(0xD0);
ds_ask();
write_data(0x07);
ds_ask();
write_data(control);
ds_ask();
stop_cond();
return;
}

unsigned char read_time(void){
unsigned char count;
for(count=0; count<8; count++){
start_cond();
write_data(0xD0);
ds_ask();
write_data(count);
ds_ask();
stop_cond();
start_cond();
write_data(0xD1);
ds_ask();
output_time[count]=read_data();
stop_cond();
}
return(output_time[7]);
}


void set_time(unsigned char *input_time){
unsigned char count;
start_cond();
write_data(0xD0);
ds_ask();
write_data(0x00);
ds_ask();
for(count=0; count<8; count++){
write_data(input_time[count]);
ds_ask();
}
stop_cond();
return;
}


void start_cond(void){
sda=1;
scl=1;
sda=0;
scl=0;
return;
}


void stop_cond(void){
sda=0;
scl=1;
sda=1;
return;
}

void ds_ask(void){
sda=1;
scl=1;
while(sda);
scl=0;
return;
}

void write_data(unsigned char input_data){
unsigned char count;
for(count=0; count<8; count++){
sda=((input_data&0x80)?1:0);
input_data<<=1;
scl=1;
scl=0;
}
return;
}

unsigned char read_data(void){
unsigned char count;
output_data=0x00;
for(count=0; count<8;count++){
output_data<<=1;
scl=1;
output_data|=sda;
scl=0;
}
return(output_data);
}



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru