各位大神,如題:本人使用STM32F103c8t6進行DS1302時鐘程序的編寫,用數碼管進行時鐘顯示;但是無論怎樣修改時序、程序,時間在數碼管顯示均為F,
說明:硬件電路接線正常。
具體結果如下圖所示。
FF.jpg (132.7 KB, 下載次數: 50)
下載附件
DS1302數碼管顯示F
2019-1-15 16:44 上傳
請各位大神幫忙看看,十分感謝!下面為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端口時鐘
-
- //配置PA12-13-14端口為推挽輸出 ,用于驅動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); //延時
- DS1302_CLK=0;
- delay_us(2); //延時1us
-
- DS1302_RST=1; //設置為高電平,開啟寫數據
- delay_us(4); //延時
- //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); //延時
-
- DS1302_CLK=0; //因為上升沿數據寫入,所以需要設置為低電平,為下一次上升沿寫入數據做準備
- delay_us(2); //延時
-
- }
- //STM32向DS1302 寫入數據
- for(i=0;i<8;i++)
- {
- DS1302_IO_OUT();
- DS1302_DATA_OUT = dat & 0x01;
- dat = dat >> 1;
- DS1302_CLK=1;
- delay_us(2); //延時
-
- DS1302_CLK=0;
- delay_us(2); //延時
-
- }
- DS1302_RST=0; //設置為低電平,結束數據的寫入
- delay_us(4); //延時
-
- }
- //MCU從DS1302 對應 地址 中讀取相應的 數據* **********************************************************************
- u8 DS1302_ReadByte(u8 Add)
- {
- u8 dat=0,i=0,dat1=0;
- DS1302_RST=0;
- delay_us(4); //延時
- DS1302_CLK=0;
- delay_us(2); //延時
- DS1302_RST=1; //設置為高電平,開啟寫數據
- delay_us(4); //延時
-
- //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); //延時
-
- DS1302_CLK=0;
- delay_us(2); //延時
-
- }
-
- //STM從DS1302讀取數據,下降沿有效
- 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); //延時
- DS1302_CLK=0; //
- delay_us(2); //延時
- }
- DS1302_RST=0; //設置為低電平,結束數據的寫入
- delay_us(4);
- DS1302_CLK=1;/
- delay_us(2); //延時
- 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); // 取消寫保護
- for(n=0;n<7;n++)
- {
- DS1302_WriteCommand(WRITE_RTC_ADDR[n],TIME[n]);
- }
- DS1302_WriteCommand(0x8e,0x80);//寫保護生效
- }
- //實時更新DS1302時鐘***********************************************************************
- //秒分時日月周年
- void RTC_DS1302_Time(void)
- {
- u8 i=0;
- for(i=0;i<7;i++)
- {
- TIME[i] = DS1302_ReadByte(READ_RTC_ADDR[i]);
- }
- }
復制代碼
|