各位大神,如题:本人使用STM32F103c8t6进行DS1302时钟程序的编写,用数码管进行时钟显示;但是无论怎样修改时序、程序,时间在数码管显示均为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端口时钟
-
- //配置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]);
- }
- }
复制代码
|