|
各位大神,如題:本人使用STM32F103c8t6進(jìn)行DS1302時(shí)鐘程序的編寫,用數(shù)碼管進(jìn)行時(shí)鐘顯示;但是無論怎樣修改時(shí)序、程序,時(shí)間在數(shù)碼管顯示均為F,
說明:硬件電路接線正常。
具體結(jié)果如下圖所示。
DS1302數(shù)碼管顯示F
請各位大神幫忙看看,十分感謝!下面為DS1302程序
程序源碼:
- #include "DS1302.h"
- u8 READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- u8 WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- u8 TIME[7] = {0x00, 0x15, 0x23, 0x01, 0x01, 0x02, 0x13};
- //使用PA引腳作為DS1302的控制引腳,控制引腳的初始化
- //PA12-DATA PA13-RST PA14-CLK
- void DS1302_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能PA端口時(shí)鐘
-
- //配置PA12-13-14端口為推挽輸出 ,用于驅(qū)動(dòng)DS1302
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
-
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_ResetBits(GPIOA,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14); //輸出低
- }
- void DS1302_WriteCommand(u8 Add,u8 dat)
- {
- u8 i=0;
-
- DS1302_RST=0;
- delay_us(4); //延時(shí)
- DS1302_CLK=0;
- delay_us(2); //延時(shí)1us
-
- DS1302_RST=1; //設(shè)置為高電平,開啟寫數(shù)據(jù)
- delay_us(4); //延時(shí)
- //STM32向DS1302 寫入地址
- for(i=0;i<8;i++)
- {
-
- DS1302_IO_OUT();
-
- DS1302_DATA_OUT = Add & 0x01;
-
- Add = Add >> 1; //右移才對,由低位往高位移動(dòng)
-
- DS1302_CLK=1; //因?yàn)樯仙財(cái)?shù)據(jù)寫入,所以需要設(shè)置為高電平
- delay_us(2); //延時(shí)
-
- DS1302_CLK=0; //因?yàn)樯仙財(cái)?shù)據(jù)寫入,所以需要設(shè)置為低電平,為下一次上升沿寫入數(shù)據(jù)做準(zhǔn)備
- delay_us(2); //延時(shí)
-
- }
- //STM32向DS1302 寫入數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- DS1302_IO_OUT();
- DS1302_DATA_OUT = dat & 0x01;
- dat = dat >> 1;
- DS1302_CLK=1;
- delay_us(2); //延時(shí)
-
- DS1302_CLK=0;
- delay_us(2); //延時(shí)
-
- }
- DS1302_RST=0; //設(shè)置為低電平,結(jié)束數(shù)據(jù)的寫入
- delay_us(4); //延時(shí)
-
- }
- //MCU從DS1302 對應(yīng) 地址 中讀取相應(yīng)的 數(shù)據(jù)* **********************************************************************
- u8 DS1302_ReadByte(u8 Add)
- {
- u8 dat=0,i=0,dat1=0;
- DS1302_RST=0;
- delay_us(4); //延時(shí)
- DS1302_CLK=0;
- delay_us(2); //延時(shí)
- DS1302_RST=1; //設(shè)置為高電平,開啟寫數(shù)據(jù)
- delay_us(4); //延時(shí)
-
- //STM32向DS1302 寫入地址
- for(i=0;i<8;i++)
- {
- DS1302_IO_OUT();
-
- DS1302_DATA_OUT = Add & 0x01;
-
- Add = Add >> 1;
-
- DS1302_CLK=1;
- delay_us(2); //延時(shí)
-
- DS1302_CLK=0;
- delay_us(2); //延時(shí)
-
- }
-
- //STM從DS1302讀取數(shù)據(jù),下降沿有效
- for(i=0;i<8;i++)
- {
- DS1302_IO_IN();
-
- dat = dat >> 1;
- dat1 = DS1302_DATA_IN ;
- dat1 = dat1 << 7;
- dat = dat | dat1;
- DS1302_CLK=1; //
- delay_us(2); //延時(shí)
- DS1302_CLK=0; //
- delay_us(2); //延時(shí)
- }
- DS1302_RST=0; //設(shè)置為低電平,結(jié)束數(shù)據(jù)的寫入
- delay_us(4);
- DS1302_CLK=1;/
- delay_us(2); //延時(shí)
- DS1302_IO_OUT();
- DS1302_DATA_OUT=0;
- delay_us(1);
- DS1302_DATA_OUT=1;
- delay_us(1);
- return dat;
- }
- void RTC_DS1302_Init(void)
- {
- u8 n=0;
- DS1302_WriteCommand(0x8e,0x00); // 取消寫保護(hù)
- for(n=0;n<7;n++)
- {
- DS1302_WriteCommand(WRITE_RTC_ADDR[n],TIME[n]);
- }
- DS1302_WriteCommand(0x8e,0x80);//寫保護(hù)生效
- }
- //實(shí)時(shí)更新DS1302時(shí)鐘***********************************************************************
- //秒分時(shí)日月周年
- void RTC_DS1302_Time(void)
- {
- u8 i=0;
- for(i=0;i<7;i++)
- {
- TIME[i] = DS1302_ReadByte(READ_RTC_ADDR[i]);
- }
- }
復(fù)制代碼
|
|