DS1337 时钟芯片在 C8051F 上的实现
有有效的状态码都是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
- 芯片I2C通信异常无法读写寄存器破解(08-20)
- 基于C8051F330的便携式生理参数监测仪设计(06-17)
- 基于USB接口的高增益数据采集系统的设计(04-03)
- 便携式设备的低功耗MCU系统设计方法及应用(06-10)
- MC8051 IP核基本结构及原理(04-22)
- 基于C8051F120核心的嵌入式彩色显示系统设计(05-04)
