微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > DS1337 时钟芯片在 C8051F 上的实现

DS1337 时钟芯片在 C8051F 上的实现

时间:11-30 来源: 点击:

有有效的状态码都是8的整数倍。

  

  

  

  

  三、在C8051F 上的实现

  3.1 硬件

  

  3.2 软件

  1 typedef struct

  2 {

  3 u8 second; // 0 to 59

  4 u8 minute; // 0 to 59

  5 u8 hour; // 0 to 23 (24-hour TIme)

  6 u8 day; // 0 = Sunday, 1 = Monday, etc.

  7 u8 date; // 1 to 31

  8 u8 month; // 1 to 12

  9 u8 year; // 00 to 99

  10 } DS1337_TIme;

  11

  12 xdata DS1337_TIme TIme;

  13

  14 bit SMB_BUSY;

  15 u8 COMMAND;

  16 u8 Mode;

  17 u8 wr_data[2];

  18 u8 wrnumber;

  19 u8 get_data;

  20

  21

  22 void DS1337_Set_time(DS1337_time dt);

  23

  24

  25 char bcd2bin(char bcd_value)

  26 {

  27 char temp;

  28 temp = bcd_value;

  29 temp 》》= 1;

  30 temp &= 0x78;

  31 return(temp + (temp 》》 2) + (bcd_value & 0x0f));

  32 }

  33

  34

  35 unsigned char bin2bcd(unsigned char value)

  36 {

  37 char retval;

  38 retval = 0;

  39

  40 while(1)

  41 {

  42 if(value 》= 10)

  43 {

  44 value -= 10;

  45 retval += 0x10;

  46 }

  47 else

  48 {

  49 retval += value;

  50 break;

  51 }

  52 }

  53 return(retval);

  第25行的函数是将BCD码转化为二进制数。第35行的函数是将二进制数转化为BCD码。

  1 void init_iic(void)

  2 {

  3 SMB0CN = 0x44; // Enable SMBus with acknowledge low (AA = 1)

  4 SMB0CR = 146; // SMBus clock rate = 100 kHz 146

  5 EIE1 "= 2; // SMBus interrupt enable

  6 SI = 0;

  7 SMB_BUSY = 1;

  8 }

  9

  10

  11 void Write_DS1337(u8 adrress, u8 data1)

  12 {

  13 Mode = 1;

  14 wrnumber = 2 ;

  15 wr_data[0] = adrress;

  16 wr_data[1] = data1;

  17 SMB0CN = 0x44;

  18 COMMAND = DS1337_ADDR;

  19 STO = 0;

  20 STA = 1;

  21 SMB_BUSY = 1;

  22 while(SMB_BUSY);

  23 }

  24

  25

  26 int Read_DS1337(u8 adrress)

  27 {

  28 Mode=0;

  29 SMB0CN = 0x44;

  30 COMMAND = (DS1337_ADDR | 0x01);

  31 wr_data[0] = adrress;

  32 STO = 0;

  33 STA = 1;

  34 SMB_BUSY = 1;

  35 while(SMB_BUSY);

  36 return get_data;

  37 }

  第1行的函数初始化SMBus总线。第11行的函数为DS1337写操作。第26行的函数为DS1337读操作。

  1 void DS1337_init()

  2 {

  3 u8 status;

  4 DS1337_time DT;

  5

  6 DT.second = 30;

  7 DT.minute = 50;

  8 DT.hour = 21;

  9 DT.day = 2;

  10 DT.date = 12;

  11 DT.month = 8;

  12 DT.year = 14;

  13

  14 status = Read_DS1337(DS1337_STATUS_REG);

  15 if((status & 0x80) != 0)

  16 {

  17 DS1337_Set_time(DT);

  18 Write_DS1337(DS1337_CONTROL_REG,DS1337_CTRL_REG_INIT_VAL);

  19 Write_DS1337(DS1337_STATUS_REG,DS1337_CLEAR_STATUS_VAL);

  20 }

  21 }

  22

  23 void DS1337_Set_time(DS1337_time dt)

  24 {

  25 u8 bcd_sec,bcd_min,bcd_hrs,bcd_day,bcd_date,bcd_mon,bcd_year;

  26

  27 bcd_sec = bin2bcd(dt.second);

  28 bcd_min = bin2bcd(dt.minute);

  29 bcd_hrs = bin2bcd(dt.hour);

  30 bcd_day = bin2bcd(dt.day);

  31 bcd_date = bin2bcd(dt.date);

  32 bcd_mon = bin2bcd(dt.month);

  33 bcd_year = bin2bcd(dt.year);

  34

  35 Write_DS1337(DS1337_SECONDS_REG,bcd_sec);

  36 Write_DS1337(DS1337_MINUTES_REG,bcd_min);

  37 Write_DS1337(DS1337_HOURS_REG,bcd_hrs);

  38 Write_DS1337(DS1337_DAY_OF_WEEK_REG,bcd_day);

  39 Write_DS1337(DS1337_DATE_REG,bcd_date);

  40 Write_DS1337(DS1337_MONTH_REG,bcd_mon);

  41 Write_DS1337(DS1337_YEAR_REG,bcd_year);

  42 }

  43

  44 void DS1337_Get_time()

  45 {

  46 u8 bcd_sec,bcd_min,bcd_hrs,bcd_day,bcd_date,bcd_mon,bcd_year;

  47

  48 bcd_sec = Read_DS1337(DS1337_SECONDS_REG);

  49 bcd_min = Read_DS1337(DS1337_MINUTES_REG);

  50 bcd_hrs = Read_DS1337(DS1337_HOURS_REG);

  51 bcd_day = Read_DS1337(DS1337_DAY_OF_WEEK_REG);

  52 bcd_date = Read_DS1337(DS1337_DATE_REG);

53 bcd_mon = Read_DS1337(DS

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top