DS1302时钟芯片在STM32F0中的完整应用代码

发布者:RainbowGarden最新更新时间:2022-05-24 来源: eefocus关键字:DS1302  时钟芯片  STM32F0 手机看文章 扫描二维码
随时随地手机看文章


/**********************第一:首先对端口进行配置****************/

//DS1302时钟端口定义

void GPIO_Configuration(void) 

{

    GPIO_InitTypeDef GPIO_InitStructure;

    

    //SCLK

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_ResetBits(GPIOB, GPIO_Pin_12);

 

    //RST

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_ResetBits(GPIOA, GPIO_Pin_0);

 

    /*IO:PB2配置为开漏模式,此模式下能够实现真正的双向IO口*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_ResetBits(GPIOB, GPIO_Pin_2);

    

}

 

uint8_t read_1302(uint8_t add);

void ds1302_data(uint8_t *read);

void write_1302byte(uint8_t dat) ;

void write_1302(uint8_t add,uint8_t dat);

void ds1302_init(uint8_t *write,uint8_t *time);

 

uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址 

uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址

 

void main(char src[]) 

{

   

   /**********************第二:把一个十进制时间戳转换成常规格式的时间****************/

 

char myTime[11] = "1516766898";//存放十进制时间戳

   time_t t;  

   struct tm *p;

   t=atoi(myTime);

   //time(&t);

   p=gmtime(&t);   

   

   uint8_t Second=0,Min=0,Hour=0,Day=0,Month=0,Weekday=0,Year=0,Year_end=0;

   

   Second = (uint8_t)(p->tm_sec);

   Min = (uint8_t)(p->tm_min);

   Hour = (uint8_t)(p->tm_hour+8);

   Day = (uint8_t)(p->tm_mday);

   Month = (uint8_t)(1+p->tm_mon);

   Weekday = (uint8_t)(p->tm_wday);

   //Year = (uint8_t)(1900+p->tm_year);

   

   int unitPlace,tenPlace;

   unitPlace = (1900+p->tm_year)/1%10;   //获取年的个位

   tenPlace  = (1900+p->tm_year)/10%10;  //获取年的十位

   

   Year_end = (uint8_t)(tenPlace*10 + unitPlace);

   

   uint8_t start_time[] = {Second,Min,Hour,Day,Month,Weekday,Year_end};

   ACCLOG("Second = %dnMin = %dnHour = %dnDay = %dnMonth = %dnWeekday = %dnYear_end = %dn",Second,Min,Hour,Day,Month,Weekday,Year_end);

   

   /**********************第三:ds1302_init()函数:用常规格式的时间初始化DS1302***/

   ds1302_init(write,start_time);

   

   /**********************第四:ds1302_data()函数*******************************

               (1)把时间写入DS1302

               (2)读出DS1302里的时间

              (3)把读出的时间转换成十进制时间戳

              (4)把这个十进制时间戳转换成字符串存入一个字符数组里

   ******************************************************************/                             

   ds1302_data(read);  

   

}

 

/**********************************DS1302时钟子函数如下*****************************************/

 

//写一个字节的数据sck上升沿写数据

void write_1302byte(uint8_t dat)                             

{  

    uint8_t i = 0;  

    GPIO_ResetBits(GPIOB,GPIO_Pin_12); //ds1302clk=0  

    delay_us(2);//延时大约2us  

      

    for(i = 0;i < 8;i ++)  

        {  

            GPIO_ResetBits(GPIOB,GPIO_Pin_12);   //ds1302clk=0;  

            if(dat&0x01)  

                GPIO_SetBits(GPIOB,GPIO_Pin_2);  

            else                            //ds1302dat=(dat&0x01)  

                GPIO_ResetBits(GPIOB,GPIO_Pin_2);                  

            delay_us(2);  

            GPIO_SetBits(GPIOB,GPIO_Pin_12);    //发送一位数据,clk上升沿,//ds1302clk=1  

            dat >>= 1;  

            delay_us(1);  

        }     

}

 

 

//向DS1302指定寄存器写入一个字节的数据

void write_1302(uint8_t add,uint8_t dat)                            

{  

    GPIO_ResetBits(GPIOA,GPIO_Pin_0); //只有在rst为高电平的时候才能进行数据传输  

    GPIO_ResetBits(GPIOB,GPIO_Pin_12); //只有clk为低电平的时候,rst才能被置为高电平  

    //ds1302rst=0;  

    //ds1302clk=0;  

    delay_us(1);                     //略微延时  

    GPIO_SetBits(GPIOA,GPIO_Pin_0);   //clk = 0之后,这里将rst拉高,准备传送数据  

    //ds1302rst=1;  

    delay_us(2);                     //时间大约2us  

    write_1302byte(add);             //先发地址  

    write_1302byte(dat);             //然后发数据  

    GPIO_ResetBits(GPIOA,GPIO_Pin_0); //这里释放总线  

    GPIO_ResetBits(GPIOB,GPIO_Pin_12); //拉低clk,以备下一次数据发送  

    //ds1302clk=0;  

    //ds1302rst=0;  

    delay_us(5);  

  

 

//从DS1302指定寄存器读数据

uint8_t read_1302(uint8_t add)                     

{  

    uint8_t i=0;  

    uint8_t Return_dat=0x00;  

    GPIO_ResetBits(GPIOA,GPIO_Pin_0);            //ds1302rst=0;  

    GPIO_ResetBits(GPIOB,GPIO_Pin_12);           //ds1302clk=0;  

    delay_us(3);                                 //略微延时2us  

    GPIO_SetBits(GPIOA,GPIO_Pin_0);             //ds1302rst=1;  

    delay_us(3);                                //时间要大约3us  

    write_1302byte(add);                       //先写寄存器的地址  

    for(i=0;i<8;i++)  

    {  

        GPIO_SetBits(GPIOB,GPIO_Pin_12);       //ds1302clk=1; 

        delay_us(5);

        Return_dat >>= 1;  

        delay_us(5);

        GPIO_ResetBits(GPIOB,GPIO_Pin_12);     //ds1302clk=0;//拉低时钟线,以便于数据的读入  

        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==1)    //数据线此时为高电平  

        {Return_dat = Return_dat|0x80;}  

    }  

      delay_us(1);  

      GPIO_ResetBits(GPIOA,GPIO_Pin_0);        //ds1302rst=0;释放总线  

      return Return_dat;  

}

 

//标准时间转换成时间戳

long GetTick(char *str_time)  

{  

    struct tm stm;  

    int iY, iM, iD, iH, iMin, iS;  

  

    memset(&stm,0,sizeof(stm)); 

    

    iY = atoi(str_time);  

    iM = atoi(str_time+5);  

    iD = atoi(str_time+8);  

    iH = atoi(str_time+11);  

    iMin = atoi(str_time+14);  

    iS = atoi(str_time+17);

    

    stm.tm_year=iY-1900;  

    stm.tm_mon=iM-1;  

    stm.tm_mday=iD;  

    stm.tm_hour=iH-8;//注意时区转换  

    stm.tm_min=iMin;  

    stm.tm_sec=iS;  

  

    return mktime(&stm);  

}

 

//my_itoa

void my_itoa(long i, char *string)  

{  

    int power = 0, j = 0;  

  

    j = i;  

    for (power = 1; j>10; j /= 10)  

        power *= 10;  

  

    for (; power>0; power /= 10)  

    {  

        *string++ = '0' + i / power;  

        i %= power;  

[1] [2]
关键字:DS1302  时钟芯片  STM32F0 引用地址:DS1302时钟芯片在STM32F0中的完整应用代码

上一篇:用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中
下一篇:STM32F103+语音识别模块HBR640

推荐阅读最新更新时间:2024-11-12 13:08

ds1302 CVAVR程序
//串行数码管显示 年-月-日 时-分-秒 //芯片 ATMEGA16L //时钟 4MHz 内部 // DS1302 上升沿读写数据 // DS1302 读数据时 IO口上拉无效 //短延时 2us wait(); 长延时 n ms delay_nms(); #include mega16.h //#include delay.h #define hc164_da ta PORTD.0 #define hc164_clk PORTD.1 void hc164_send_byte (unsigned char byte); // 数码管显示 //相关定义: #define uint unsigned int
[单片机]
电子钟(DS1302+AT89C2051的红外遥控钟)
;遥控器各按键数据码,可根据不同的遥控器修改对应的键码 muteM EQU 10h ;静音键 闹铃开/关 timerT EQU 0Ch ;菜单键 进入/退出设置状态 leftL EQU 46h ;左移键 rightR EQU 47h ;右移键 upU EQU 19h ;增加键 downD EQU 1dh ;减少键 d_off EQU 16H ;显示键 LED数码管显示/关闭 recall EQU 44H ;日历键 DS1302初始化操作 K_on BIT P3.0 ;闹铃输出 LED1 BIT P3.3 LED2 BIT P3.4 LED3CLK BIT P3.5 ;DS1302 LED4IO BIT P3.7 RST BIT
[单片机]
STM32F0(6)ADC采样初始化
void ADC_Init(void) { // PA1 -- 电池电压采样引脚 -- 浮空输入 GPIOA- MODER &= ~GPIO_MODER_MODER1_1; // 浮空输入 GPIOA- MODER &= ~GPIO_MODER_MODER1_0; GPIOA- PUPDR &= ~GPIO_PUPDR_PUPDR1_1; GPIOA- PUPDR &= ~GPIO_PUPDR_PUPDR1_0; // 配置adc相关功能 RCC- APB2ENR |= RCC_APB2ENR_ADC1EN; ADC1- CFGR1 |= ADC_CFGR1_CONT; // 连续转换 ADC1- SMPR |=
[单片机]
时钟芯片DS1302的PIC程序
include p16f877.inc CBLOCK 20H SEC ;秒 MIN ;分 HOU ;小时 DATE ;日期 MON ;月 DAY ;日 YERR ;年 DDD ;写使能位 TIME_TX ;1302发送寄存器 TIME_RX ;1302接收寄存器 COUNT1 ; COUNT2 ; DELAY1 DELAY2 ENDC ;================================= ;1302子程序说明 ; DS1302INI ;1302初始化,先禁止RST,设定充电方式 ; SET_TIME ;一次发送7个数据设定时间,包含写使能寄存器,8个数据 ; GET
[单片机]
基于AT89S52和CPLD的数字转速表设计
随着人们生活水平的提高,花卉逐渐收到人们的青睐,陶冶情操,净化空气。利用单片机设计了一款家庭智能浇花器实现自动浇花,节省人力,方便人们出差的时候,不至于影响花卉的生长,如果在家也可以关断浇花器,手动浇花。浇花器设置为两种方式,一种是定时定量浇花,一种是根据湿度浇花。采用哪种方式是通过按键控制或者红外遥控的,在采用定时定量浇花时,数码管显示时间和流水时间,在选用根据湿度浇花时,数码管显示是目前的湿度。   1 总体设计   利用AT89S52单片机设计了自动浇花器,针对不同的花卉,此智能浇花器设置为两种方式:一是定时定量浇花,二是利用湿度传感器检测花卉(也可以用于蔬菜等)的湿度,采集的湿度传送到单片机芯片,单片机根据湿度控制是否浇
[单片机]
基于AT89S52和CPLD的数字转速表设计
单片机驱动 DS1302时钟+1602液晶
程序参考C语言代码如下: #include REGX52.H #include “LCD1602.h” #include “DS1302.h” void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i count;i++) for(j=0;j 120;j++); } main() { SYSTEMTIME CurrentTime; LCD_Initial(); Initial_DS1302(); GotoXY(0,0); Print( www.ourhc.cn ); GotoXY(0,1); Print( Time: ); whil
[单片机]
单片机驱动 <font color='red'>DS1302</font>时钟+1602液晶
DS1302与PIC16F877接口程序
;================================================ ;DS1302控制子程序 ;================================================= ;程序包括:DS1302初始化,时间数据写入和读取程序 ;DS1302_init ;init ds1302 ;Set_DS1302 ;set time to ds1302 ;Get_DS1302 ;get time from ds1302 ;================================================= ;============== 1302定
[单片机]
STM32F0的IAP用户程序中断向量表的设置
//Cortex-M0内核中断向量共有48个。 //由于M0内核不具有M3、M4内核的中断向量表重定位功能,须采用以下方式解决IAP向量问题: // 1:复制用户代码中的中断向量表到SRAM首地址 // 2: 开启SRAM的重映射功能,将SRAM的地址映射到0x00000000 // 3: MDK设置RAM运行地址时,要跳过前48个地址(地址为32位,共192字节),中断向量表 // 不能被操作,否则程序运行将出错。 // 中断向量表起始位置位于编译好的用户代码的首地址,共48个地址。 void NVIC_SetVectorTable(void) { uint8_t i; uint32_t *pVecTab=
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved