下面的代碼能正確讀出三個控制位以及年月日時分秒.
但是同樣的代碼, 在STC12C5A52S2 (包括STC12C5A56S2)上不行, 懷疑在所有1T模式的STC系列(STC10, STC11, STC12, STC15)上都不行.
各位大佬如果有條件請麻煩試一下是否是這個情況.
這個代碼是用于STC89C5x系列的, 實測可以使用
- #include <reg52.h>
- #include <stdio.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- u8 year, month, date, hour, minute, second, week_day;
- u8 alarm_hour, alarm_minute, alarm_second;
- u8 reg_a, reg_b, reg_c;
- void delay(u16 z) {
- u16 x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- sbit DS12_DS = P1^0;
- sbit DS12_RW = P1^1;
- sbit DS12_AS = P1^2;
- sbit DS12_CS = P1^4;
- sbit DS12_IRQ = P3^2;
- void DS12C887_write(u8 addr, u8 dat)
- {
- delay(1);
- DS12_CS = 0; // ds12c887de 使能端 cs=0
- delay(1);
- DS12_AS=1;
- DS12_DS=1;
- DS12_RW=1;
- delay(1);
- P0 = addr;
- delay(1);
- DS12_AS=0;
- DS12_RW=0;
- P0 = dat;
- DS12_RW=1;
- DS12_AS=1;
- delay(1);
- DS12_CS = 1; // ds12c887de 使能端 cs=1
- delay(1);
- }
- u8 DS12C887_read(u8 addr)
- {
- u8 ds_date;
- DS12_AS=1;
- DS12_DS=1;
- DS12_RW=1;
- delay(1);
- DS12_CS = 0;
- delay(1);
- P0 = addr;
- delay(1);
- DS12_AS=0;
- DS12_DS=0;
- P0 = 0XFF;
- ds_date=P0;
- DS12_DS=1;
- DS12_AS=1;
- DS12_CS = 1;
- return ds_date;
- }
- void DS12C887_init()
- {
- DS12C887_write(0x0b, 0x26);
- DS12C887_write(0x0a, 0x20);
- }
- void main()
- {
- P0 = 0x00; // P0口清零
- P1 = 0xff; // P1口全1
- DS12C887_init();//ds12c887 初始化
- EA =1; // 開啟中斷, 開啟TIM1中斷, 開啟外部中斷0
- IT0 =1;
- EX0 =1;
- // 初始化UART
- TMOD = 0x20;
- SCON = 0x40;
- TH1 = 256 - 11.0592 * 1000 * 1000 / 12 / 32 / 9600 + 0.5;
- TCON |= 0x40;
- SCON |= 0x02;
- // 初始化UART結(jié)束
- /* 初始化寫入
- DS12C887_write(9,11); // Year
- DS12C887_write(8,8); // Month
- DS12C887_write(7,7); // Date
- DS12C887_write(6,7); // Week Day
- DS12C887_write(4,9); // Hour
- DS12C887_write(2,27); // Minute
- DS12C887_write(0,25); // Second
- */
- while(1) {
- second = DS12C887_read(0x00);
- alarm_second = DS12C887_read(0x01);
- minute = DS12C887_read(0x02);
- alarm_minute = DS12C887_read(0x03);
- hour = DS12C887_read(0x04);
- alarm_hour = DS12C887_read(0x05);
- date = DS12C887_read(0x07);
- month = DS12C887_read(0x08);
- year = DS12C887_read(0x09);
- reg_a = DS12C887_read(0x0a);
- reg_b = DS12C887_read(0x0b);
- reg_c = DS12C887_read(0x0c);
- printf("%bX-%bX-%bX ", reg_a, reg_b, reg_c);
- printf("%bX-%bX-%bX ", year, month, date);
- printf("%bX:%bX:%bX\r\n", hour, minute, second);
- }
- }
- void exter() interrupt 0
- {
- // 這里處理中斷
- }
復(fù)制代碼
|