ds1302程序-stm32

合集下载

单片机ds1302程序

单片机ds1302程序

#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit LCD1602_E=P3^6;sbit LCD1602_RW=P3^5;sbit LCD1602_RS=P3^4;sbit DSIO=P0^7;sbit RST=P0^5;sbit SCLK=P0^6;extern uchar TIME[7];void Ds1302Write(uchar addr, uchar dat);uchar Ds1302Read(uchar addr);void Ds1302Init();void Ds1302ReadTime();void Lcd1602_Delay1ms(uint c); //误差0usvoid LcdWriteCom(uchar com);void LcdWriteData(uchar dat) ;void LcdInit();void LcdDisplay();uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};void main(){LcdInit();Ds1302Init();while(1){Ds1302ReadTime();LcdDisplay();}}void Ds1302Write(uchar addr, uchar dat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。

stm32驱动DS1302

stm32驱动DS1302

stm32驱动DS1302//DS1302.H#ifndef __DS1302_H#define __DS1302_H#include "stm32f10x.h"//*****************DS1302控制命令*******************#define RdSec 0x81#define RdMin 0x83#define RdHour 0x85#define RdDate 0x87#define RdMonth 0x89#define RdWeek 0x8b#define RdYear 0x8d#define RdControl 0x8f#define RdTrickleCharge 0x91#define RdClockBurst 0xbf#define WrSec 0x80#define WrMin 0x82#define WrHour 0x84#define WrDate 0x86#define WrMonth 0x88#define WrWeek 0x8a#define WrYear 0x8c#define WrControl 0x8e#define WrTrickleCharge 0x90#define WrClockBurst 0xbe//对应IO口配置#define DS1302_IORCC RCC_APB2Periph_GPIOC //DS18B20对应IO的时钟#define DS1302_PORT GPIOC#define DS1302_SCK_PIN GPIO_Pin_15 //定义DS18B20对应的IO口#define DS1302_IO_PIN GPIO_Pin_13#define DS1302_CE_PIN GPIO_Pin_14#define DS1302_CLRSCK() (GPIOC->BRR = DS1302_SCK_PIN) //寄存器操作IO状态#define DS1302_SETSCK() (GPIOC->BSRR = DS1302_SCK_PIN)#define DS1302_CLRIO() (GPIOC->BRR = DS1302_IO_PIN)#define DS1302_SETIO() (GPIOC->BSRR = DS1302_IO_PIN) #define DS1302_CLRCE() (GPIOC->BRR = DS1302_CE_PIN)#define DS1302_SETCE() (GPIOC->BSRR = DS1302_CE_PIN) #define DS1302_READ_SDA() (GPIO_ReadInputDataBit(DS1302_PORT, DS1302_IO_PIN)) //定义时间的结构体typedef struct{u8 year;u8 month;u8 date;u8 week;u8 hour;u8 min;u8 sec;}TIME_TypeDef;//内部函数void DS1302_Write8bit(u8 code);u8 DS1302_Read8bit(void);//外部函数void delay_us(u8 us);void RTC_init (void);u8 DS1302_ReadByte(u8 con);void DS1302_WriteByte(u8 con,u8 code);void DS1302_WrintTime(TIME_TypeDef* time);void DS1302_ReadTime(TIME_TypeDef* time);void DS1302_IO_OUT(void);void DS1302_IO_IN(void);u8 NumT oBCD(u8 Num);u8 BCDT oNum(u8 BCD);void time_set();#endif /* __DS1302_H *///DS1302.C#include "stm32f10x.h"#include "DS1302.h"TIME_TypeDef rtc_time={0};//DS1302初始化函数void RTC_init (void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS1302_IORCC, ENABLE );GPIO_InitStructure.GPIO_Pin = (DS1302_SCK_PIN | DS1302_IO_PIN | DS1302_CE_PIN);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(DS1302_PORT, &GPIO_InitStructure);DS1302_WriteByte(WrControl,0x00); //关闭写保护,可以写入数据delay_us(10);if(DS1302_ReadByte(RdTrickleCharge) != 0xA6){delay_us(10);DS1302_WriteByte(WrTrickleCharge,0xA6);}delay_us(10);DS1302_WriteByte(WrControl,0x80); //开启写保护,禁止写入数据}//DS1302?8bitvoid DS1302_Write8bit(u8 code){u8 i;DS1302_IO_OUT();DS1302_CLRSCK();for(i=0;i<8;i++){delay_us(5);if(code&0x01) (DS1302_SETIO());else (DS1302_CLRIO());delay_us(5);DS1302_SETSCK();delay_us(5);DS1302_CLRSCK();code = code >> 1;}}//DS1302?8bitu8 DS1302_Read8bit(void){u8 i,code;DS1302_IO_IN();code=0;DS1302_CLRSCK();delay_us(5);for(i=0;i<8;i++){code = code >>1;if(DS1302_READ_SDA()) code = code|0x80; delay_us(5);DS1302_SETSCK();delay_us(5);DS1302_CLRSCK();}return code;}//读DS1302指定的1Byteu8 DS1302_ReadByte(u8 con){u8 code;DS1302_CLRCE(); //关闭DS1302delay_us(5);DS1302_CLRSCK();delay_us(5);//DS13CLK =0;DS1302_SETCE(); //使能DS1302delay_us(5);DS1302_Write8bit(con); //读代码code=DS1302_Read8bit(); //返回读取的数字delay_us(5);DS1302_SETSCK();delay_us(5);DS1302_CLRCE(); //关闭DS1302return code;}//?DS13021Bytevoid DS1302_WriteByte(u8 con,u8 code){DS1302_CLRCE(); //关闭DS1302delay_us(5);DS1302_CLRSCK();delay_us(5);//DS13CLK =0;DS1302_SETCE(); //使能DS1302delay_us(5);DS1302_Write8bit(con); //写控制命令DS1302_Write8bit(code); //写入数据delay_us(5);DS1302_SETSCK();delay_us(5);DS1302_CLRCE(); //关闭DS1302}//写入时间void DS1302_WrintTime(TIME_TypeDef* time) {DS1302_WriteByte(WrControl,0x00); //关闭写保护DS1302_WriteByte(WrYear,time->year);DS1302_WriteByte(WrMonth,time->month); DS1302_WriteByte(WrDate,time->date);DS1302_WriteByte(WrWeek,time->week);DS1302_WriteByte(WrHour,time->hour);DS1302_WriteByte(WrMin,time->min);DS1302_WriteByte(WrSec,time->sec);DS1302_WriteByte(WrControl,0x80); //开启写保护,禁止写入数据}//读出时间void DS1302_ReadTime(TIME_TypeDef* time){time->year = DS1302_ReadByte(RdYear);time->month = DS1302_ReadByte(RdMonth);time->date = DS1302_ReadByte(RdDate);time->week = DS1302_ReadByte(RdWeek);time->hour = DS1302_ReadByte(RdHour);time->min = DS1302_ReadByte(RdMin);time->sec = DS1302_ReadByte(RdSec);}void delay_us(u8 us){while(us--){__NOP();}}void DS1302_IO_OUT(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DS1302_IO_PIN ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(DS1302_PORT, &GPIO_InitStructure);void DS1302_IO_IN(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DS1302_IO_PIN ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(DS1302_PORT, &GPIO_InitStructure);}//**数值转化为BCD码u8 NumT oBCD(u8 Num){return (Num/10)<<4 | (Num%10);}//***BCD码转化为数值u8 BCDT oNum(u8 BCD){return ((BCD&0x70)>>4)*10 + (BCD&0x0F);}void time_set(){rtc_time.year=NumToBCD(14);rtc_time.month=NumT oBCD(3);rtc_time.date=NumToBCD(12);rtc_time.hour=NumToBCD(21);rtc_time.min=NumToBCD(23);rtc_time.week=NumToBCD(3);rtc_time.sec=NumToBCD(30);DS1302_WrintTime(&rtc_time);// DS1302_ReadTime(&rtc_time);// rt_kprintf("20%d年%d月%d日星期%d\r\n",BCDT oNum(rtc_time.year),BCDToNum(rtc_time.month ),BCDT oNum(rtc_time.date),r tc_time.week);//rt_kprintf("%d : %d : %d\r\n",BCDT oNum(rtc_time.hour),BCD ToNum(rtc_time.min),BCDToNu m(rtc_time.sec));// rt_thread_delay( RT_TICK_PER_SECOND*5); /* sleep 0.5 second and switch to other thread */。

stm32读取DS1302时钟程序 通过串口显示

stm32读取DS1302时钟程序 通过串口显示
unsigned char sz[5]={0x00,0x01,0x02,0x03,0x04};
//-------------------------------------------------------------------------------------------------
void delay_init(void);
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
#define KEY1_PRES 2 //KEY1
#define WKUP_PRES 3 //WK_UP
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

ds1302程序-stm

ds1302程序-stm

/******************************************************************************* File name --> <strong><font color="#FF0000">ds1302</font></strong>.c * Author--> By Sam Chan* Version--> V1.0* Date--> 08 - 23 - 2012* Brief--> 时钟芯片DS1302驱动** Copyright (C) 20*** All rights reserved*********************************************************************************File Update* Version--> V1.0.1* Author--> By Sam Chan* Date--> 10 - 20 - 2013* Revise--> A、增加对STM32控制的移植支持* --> B、增加对内置的RAM操作相关函数* --> C、增加检测DS1302是否存在,是否第一次上电检测函数* --> D、增加对DS1302内置的锂电池充电寄存器参数设置函数和结构体*******************************************************************************/#include "ds1302.h"/******************************************************************************定义变量******************************************************************************/#define Date TimeValue.date#define Min TimeValue.minute#define Sec TimeValue.second#define Hour TimeValue.hour#define Week TimeValue.week#define Month TimeValue.month#define Year TimeValue.yearTime_Typedef TimeValue;//定义时间数据指针void Time_Init(){TimeValue.date=24;TimeValue.hour=6;TimeValue.minute=12;TimeValue.month=5;TimeValue.second=0;TimeValue.week=2;TimeValue.year=16;}Charge_Typedef ChargeValue;//定义充电寄存器/******************************************************************************* Function Name --> GPIO初始化* Description--> none* Input--> none* Output--> none* Reaturn--> none******************************************************************************/void DS1302_GPIOInit(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//开启GPIOC外设时钟/*初始化GPIOC*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);}/******************************************************************************* Function Name --> DS1302写入一个字节数据* Description--> none* Input--> dat:要写入的数据* Output--> none* Reaturn--> none******************************************************************************/void DS1302_Write_Byte(u8 dat){u8 i;DS1302_SDA_OUT();//设置为输出口for(i=0;i<8;i++){DS1302_SCL = 0;//时钟线拉低if(dat & 0x01)DS1302_SDA = 1;//数据线放上数据,先发低位else DS1302_SDA = 0;dat >>= 1;//数据右移一位DS1302_SCL = 1;//发送数据,上升沿有效}}/****************************************************************************** * Function Name --> DS1302读出一个字节数据* Description--> none* Input--> none* Output--> none* Reaturn--> 读到的数据******************************************************************************/ unsigned DS1302_Read_Byte(){u8 ReData=0x00;u8 i;DS1302_SDA_IN();//设置为输入口for(i=0;i<8;i++){if(DS1302_IN_SDA == 1){ReData |= 0x80;}//读出一位数据是“1”DS1302_SCL = 0;//时钟线拉低ReData >>= 1;//数据右移一位,先读取低位,数据补“0”DS1302_SCL = 1;//上升沿读取数据}return(ReData);//返回读取到的数据}/****************************************************************************** * Function Name --> 向DS1302某地址写入数据* Description--> none* Input--> add:要操作的地址*dat:要写入的数据* Output--> none* Reaturn--> none******************************************************************************/ void DS1302_Write_Data(u8 add,u8 dat){DS1302_RST = 0;//复位脚拉低DS1302_SCL = 0;//时钟线拉低DS1302_RST = 1;//复位脚拉高DS1302_Write_Byte(add);//写入要操作地址DS1302_Write_Byte(dat);//写入数据//delay_us(5);DS1302_RST = 0;DS1302_SCL = 0;}/******************************************************************************* Function Name --> 从DS1302某地址读取数据* Description--> none* Input--> add:要操作的地址* Output--> none* Reaturn--> 要读取的寄存器的数值******************************************************************************/unsigned DS1302_Read_Data(u8 add){u8 Temp;DS1302_RST = 1;DS1302_Write_Byte(add);//写入要操作地址Temp = DS1302_Read_Byte();//开始读取数据DS1302_RST = 0;return(Temp);//返回读取到的数据}/******************************************************************************* Function Name --> 主电源对备用电池充电设置* Description--> 如果备用电池接的是可充电的锂电池或者其他可充电电池的时候,*可以打开DS1302的充电电路,利用主供电对电池进行充电,免的换电池的麻烦* Input--> *CHG_dat:寄存器控制指针* Output--> none* Reaturn--> none******************************************************************************/void DS1302_Charge_Manage(Charge_Typedef* CHG_dat){u8 CHG_Value;CHG_Value = (CHG_dat->TCSx << 4) | (CHG_dat->DSx << 2) | CHG_dat->RSx;DS1302_WP_Disable();//取消写保护DS1302_Write_Data(Trickle_Charger_Address,CHG_Value);DS1302_WP_Enable();//打开写保护}/******************************************************************************* Function Name --> DS1302内置的RAM读写操作* Description--> none* Input--> *pBuff:读写数据存放区*WRadd:读写起始地址,范围在RAM_Address0 ~ RAM_Address28之间,最后一位地址有其他用途*num:读写字节数据的数量,范围在1 ~ 28之间*RW:读写判断位。

ds1302程序-stm32

ds1302程序-stm32

/****************************************************************************** * @ File name --> <strong><font color="#FF0000">ds1302</font></strong>.c* @ Author --> By@ Sam Chan* @ Version --> V1.0* @ Date --> 08 - 23 - 2012* @ Brief --> 时钟芯片DS1302驱动** @ Copyright (C) 20*** @ All rights reserved******************************************************************************* ** File Update* @ Version --> V1.0.1* @ Author --> By@ Sam Chan* @ Date --> 10 - 20 - 2013* @ Revise --> A、增加对STM32控制的移植支持* @ --> B、增加对内置的RAM操作相关函数* @ --> C、增加检测DS1302是否存在,是否第一次上电检测函数* @ --> D、增加对DS1302内置的锂电池充电寄存器参数设置函数和结构体*******************************************************************************/ #include "ds1302.h"/****************************************************************************** 定义变量******************************************************************************/ #define Date TimeValue.date#define Min TimeValue.minute#define Sec TimeValue.second#define Hour TimeValue.hour#define Week TimeValue.week#define Month TimeValue.month#define Year TimeValue.yearTime_Typedef TimeValue; //定义时间数据指针void Time_Init(){TimeValue.date=24;TimeValue.hour=6;TimeValue.minute=12;TimeValue.month=5;TimeValue.second=0;TimeValue.week=2;TimeValue.year=16;}Charge_Typedef ChargeValue; //定义充电寄存器/****************************************************************************** * Function Name --> GPIO初始化* Description --> none* Input --> none* Output --> none* Reaturn --> none******************************************************************************/void DS1302_GPIOInit(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIOC外设时钟/* 初始化GPIOC */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);}/****************************************************************************** * Function Name --> DS1302写入一个字节数据* Description --> none* Input --> dat:要写入的数据* Output --> none* Reaturn --> none******************************************************************************/ void DS1302_Write_Byte(u8 dat){u8 i;DS1302_SDA_OUT(); //设置为输出口for(i=0;i<8;i++){DS1302_SCL = 0; //时钟线拉低if(dat & 0x01) DS1302_SDA = 1; //数据线放上数据,先发低位else DS1302_SDA = 0;dat >>= 1; //数据右移一位DS1302_SCL = 1; //发送数据,上升沿有效}}/****************************************************************************** * Function Name --> DS1302读出一个字节数据* Description --> none* Input --> none* Output --> none* Reaturn --> 读到的数据******************************************************************************/ unsigned DS1302_Read_Byte(){u8 ReData=0x00;u8 i;DS1302_SDA_IN(); //设置为输入口for(i=0;i<8;i++){if(DS1302_IN_SDA == 1){ ReData |= 0x80; } //读出一位数据是“1”DS1302_SCL = 0; //时钟线拉低ReData >>= 1; //数据右移一位,先读取低位,数据补“0”DS1302_SCL = 1; //上升沿读取数据}return(ReData); //返回读取到的数据}/****************************************************************************** * Function Name --> 向DS1302某地址写入数据* Description --> none* Input --> add:要操作的地址* dat:要写入的数据* Output --> none* Reaturn --> none******************************************************************************/ void DS1302_Write_Data(u8 add,u8 dat){DS1302_RST = 0; //复位脚拉低DS1302_SCL = 0; //时钟线拉低DS1302_RST = 1; //复位脚拉高DS1302_Write_Byte(add); //写入要操作地址DS1302_Write_Byte(dat); //写入数据//delay_us(5);DS1302_RST = 0;DS1302_SCL = 0;}* Function Name --> 从DS1302某地址读取数据* Description --> none* Input --> add:要操作的地址* Output --> none* Reaturn --> 要读取的寄存器的数值******************************************************************************/ unsigned DS1302_Read_Data(u8 add){u8 Temp;DS1302_RST = 1;DS1302_Write_Byte(add); //写入要操作地址Temp = DS1302_Read_Byte(); //开始读取数据DS1302_RST = 0;return(Temp); //返回读取到的数据}/****************************************************************************** * Function Name --> 主电源对备用电池充电设置* Description --> 如果备用电池接的是可充电的锂电池或者其他可充电电池的时候,* 可以打开DS1302的充电电路,利用主供电对电池进行充电,免的换电池的麻烦* Input --> *CHG_dat:寄存器控制指针* Output --> none* Reaturn --> none******************************************************************************/ void DS1302_Charge_Manage(Charge_Typedef* CHG_dat){u8 CHG_Value;CHG_Value = (CHG_dat->TCSx << 4) | (CHG_dat->DSx << 2) | CHG_dat->RSx;DS1302_WP_Disable(); //取消写保护DS1302_Write_Data(Trickle_Charger_Address,CHG_Value);DS1302_WP_Enable(); //打开写保护}/****************************************************************************** * Function Name --> DS1302内置的RAM读写操作* Description --> none* Input --> *pBuff:读写数据存放区* WRadd:读写起始地址,范围在RAM_Address0 ~ RAM_Address28之间,最后一位地址有其他用途* num:读写字节数据的数量,范围在1 ~ 28之间* RW:读写判断位。

STM32F103DS1302驱动程序

STM32F103DS1302驱动程序

#include "stm32f10x_conf.h"#include "mrhh_f1.h"#include "HPF_TIME.h"#include "HpfDS1302Drive.h"//---------------------------------------------------------------------------------------------------------------// DS1302Çý¶¯F103IO¿ÚÅäÖÃ// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------#if 1#define clkreset GPIOE->BRR=GPIO_Pin_1#define clkset GPIOE->BSRR=GPIO_Pin_1#define rstreset GPIOE->BRR=GPIO_Pin_2#define rstset GPIOE->BSRR=GPIO_Pin_2#define datreset GPIOE->BRR=GPIO_Pin_0#define datset GPIOE->BSRR=GPIO_Pin_0#define datred GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0) //¶ÁÈ¡Êý¾Ý#define DS1302Enable HpfDS1302WritByte(control_add,0x80) //´ò¿ª±£»¤#define DS1302DisEnable HpfDS1302WritByte(control_add,0x00) //¹Ø±Õ±£»¤#define testdat 0x25#define cheaken 0#endif#define dstim 1Ds1302Time DSTime={21,16,1,1,12,0,0,1};void HpfDS1302PinInData(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//ÉÏÀ-ÊäÈëGPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure);}void HpfDS1302PinOutData(void){GPIO_InitTypeDef GPIO_InitSyructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitSyructure.GPIO_Mode=GPIO_Mode_Out_PP;//ÍÆÃâÊä³öGPIO_InitSyructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitSyructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitSyructure);}void HpfDS1302PinClkRst(void){GPIO_InitTypeDef GPIO_InitSyructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitSyructure.GPIO_Mode=GPIO_Mode_Out_PP;//ÍÆÃâÊä³öGPIO_InitSyructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;GPIO_InitSyructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitSyructure);}void HpfDS1302Init(void){HpfDS1302PinClkRst();clkreset;rstreset;//¼Ä´æÆ÷Ö±½ÓÅäÖÃÊä³öµÍµçƽ}//---------------------------------------------------------------------------------------------------------------// DS1302Çý¶¯Ð´ÈëÒ»¸öµØÖ·ºÍÊý¾Ý// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------void HpfDS1302WritByte(u8 addr,u8 data) //дÈëÊý¾ÝÔÚÉÏÉýÑØÓÐЧ {u8 i;HpfDS1302PinOutData();addr&=0xfe; //дÊý¾Ý£¬µØÖ·×îµÍλΪ¸ß rstreset;clkreset;HpfDealyUs(dstim);rstset;HpfDealyUs(dstim);for(i=0;i<8;i++) // дÈëµØÖ·{clkreset;HpfDealyUs(dstim);if(addr&0x01)datset;elsedatreset;clkset;HpfDealyUs(dstim);addr>>=1;// HpfDealyUs(10);}for(i=0;i<8;i++) //дÈëÊý¾Ýdata {clkreset;HpfDealyUs(dstim);if(data&0x01)datset;elsedatreset;clkset;HpfDealyUs(dstim);data>>=1;}rstreset; //Í£Ö¹×ÜÏßclkreset;}//--------------------------------------------------------------------------------------------------------------- // DS1302Çý¶¯¶Áȡһ¸öÊý¾Ý// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------u8 HpfDS1302ReadByte(u8 addr)//¶Áȡһ¸öÊý¾ÝÔÚϽµÑØÓÐЧ£¬Ð´ÈëµØÖ·ÔÚÉÏÉýÑØÓÐЧ {u8 i,tem=0;addr|=0x01; //¶ÁÊý¾Ý£¬µØÖ·×îµÍλΪ1rstreset;clkreset;HpfDealyUs(dstim);rstset; //Æô¶¯×ÜÏßHpfDealyUs(dstim);HpfDS1302PinOutData();for(i=0;i<8;i++){clkreset;HpfDealyUs(dstim);if(addr&0x01)datset;elsedatreset;clkset;HpfDealyUs(dstim);addr>>=1;}HpfDS1302PinInData();for(i=0;i<8;i++){clkreset;HpfDealyUs(dstim);if(datred)tem|=0x80;if(i<7)tem>>=1;clkset;HpfDealyUs(dstim);}rstreset;clkreset;return tem;}u8 HpfDSBCDToNum(u8 BCD) //8421BCDÂëת»»ÎªÊý×Ö{u8 temp,temp1;temp1=BCD&0x0f;temp=((BCD&0xf0)>>4)*10+temp1;return temp;}u8 HpfDSNumToBCD(u8 NUM) //Êý×Öת»»Îª8421BCDÂë{u8 temp;temp=((NUM/10)<<4)|(NUM%10);return temp;}//--------------------------------------------------------------------------------------------------------------- // DS1302Çý¶¯»ñÈ¡Óû§Ê±¼ä²¢×ª»»ÎªbcdÂë²¢¸´ÖƵ½DS1302bufferÖÐ// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------void HpfDSTimrSet(void){HpfWTime *p;Ds1302Time *s;p=GetWRTime();s=&DSTime;s->century=p->MyYear/100+1;s->year=HpfDSNumToBCD(p->MyYear-(s->century-1)*100);s->month=HpfDSNumToBCD(p->MyMon);s->day=HpfDSNumToBCD(p->MyDay);s->hh=HpfDSNumToBCD(p->MyHH);s->mm=HpfDSNumToBCD(p->MyMM);s->ss=HpfDSNumToBCD(p->MySS);s->week=HpfDSNumToBCD(GetWNLWeek(p,s->day));}//--------------------------------------------------------------------------------------------------------------- // DS1302°ÑbufferÖеÄʱ¼äÊý¾ÝдÈëµ½ds1302ÖÐ// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------void HpfDS1302WritData(void){Ds1302Time *s;s=&DSTime;DS1302DisEnable; //¹Ø±Õд±£»¤HpfDS1302WritByte(sec_add,0x80); //ÔÝͣʱÖÓHpfDS1302WritByte(year_add,s->year);HpfDS1302WritByte(month_add,s->month);HpfDS1302WritByte(day_add,s->day);HpfDS1302WritByte(hh_add,s->hh);HpfDS1302WritByte(min_add,s->mm);HpfDS1302WritByte(sec_add,s->ss);HpfDS1302WritByte(week_add,s->week);HpfDS1302WritByte(RAM_Address29,testdat);DS1302Enable;}//--------------------------------------------------------------------------------------------------------------- // DS1302¶Áȡʱ¼äÊý¾Ý²¢×ª»»ÎªÊý×Ö²¢´æÈ뻺´æÆ÷ÖÐ// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------void HpfDS1302ReadData(void){Ds1302Time *s;s=&DSTime;s->year=HpfDSBCDToNum(HpfDS1302ReadByte(year_add));s->month=HpfDSBCDToNum(HpfDS1302ReadByte(month_add));s->day=HpfDSBCDToNum(HpfDS1302ReadByte(day_add));s->hh=HpfDSBCDToNum(HpfDS1302ReadByte(hh_add));s->mm=HpfDSBCDToNum(HpfDS1302ReadByte(min_add));s->ss=HpfDSBCDToNum(HpfDS1302ReadByte(sec_add));s->week=HpfDSBCDToNum(HpfDS1302ReadByte(week_add));}//--------------------------------------------------------------------------------------------------------------- // DS1302°Ñʱ¼äͬ²½µ½Óû§Ê±¼ä// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------void HpfDS1302TimeSyn(void){HpfWTime *p;p=GetWRTime();p->MyYear=(DSTime.century-1)*100+DSTime.year;p->MyMon=DSTime.month;p->MyDay=DSTime.day;p->MyHH=DSTime.hh;p->MyMM=DSTime.mm;p->MySS=DSTime.ss;}//--------------------------------------------------------------------------------------------------------------- // DS1302Çý¶¯»ñÈ¡»º´æÆ÷µØÖ·// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------Ds1302Time *HpfDS1302GetTime(void){HpfDS1302Init();HpfDS1302ReadData();return &DSTime;}//--------------------------------------------------------------------------------------------------------------- // DS1302Çý¶¯RAM²Ù×÷// Ver1.0 By MrHDS// 2016,4.23////bufferΪ»º´æÆ÷µØÖ·£¬ramaddrΪÄÚ´æµØÖ·£¬numΪÁ¬Ðø²Ù×÷µÄ·¶Î§£¬rwΪ1£¬±íʾдÈëÊý¾Ý£¬Îª0±íʾ¶ÁÈ¡Êý¾Ý////////////---------------------------------------------------------------------------------------------------------------void HpfDs1302RamWR(u8 *buffer,u8 ramaddr,u8 num,u8 rw){u8 i;if(ramaddr==RAM_Address29)return;if(rw){for(i=0;i<num;i++){DS1302DisEnable;HpfDS1302WritByte(ramaddr+(i<<1),buffer[i]);DS1302Enable;}}else{for(i=0;i<num;i++)buffer[i]=HpfDS1302ReadByte(ramaddr+(i<<1));}}//---------------------------------------------------------------------------------------------------------------// DS1302Çý¶¯¼ì²éÉ豸ÊÇ·ñºÃ»µ¡£·µ»Ø0±íʾÕý³££¬·µ»Ø1±íʾÊý¾Ý»òÉ豸³öÎÊÌâ//µ±cheakenΪ1ʱ£¬·µ»Ø1±íʾÉ豸Õý³££¬Ê±¼äδ³õʼ»¯£¬·µ»Ø2±íʾӲ¼þ¹ÊÕÏ// Ver1.0 By MrHDS// 2016,4.23//---------------------------------------------------------------------------------------------------------------u8 HpfDS1302Check(void){u8 testnum;// DS1302DisEnable;testnum=HpfDS1302ReadByte(RAM_Address29);// DS1302Enable;if(testnum==testdat)return 0;else{#if cheakenDS1302DisEnable;HpfDS1302WritByte(RAM_Address29,testdat);DS1302Enable;HpfDealyUs(10);testnum=HpfDS1302ReadByte(RAM_Address29);if(testnum==testdat)return 1;#elsereturn 1;#endif}#if !cheakenreturn 2;#endif}。

DS1302时钟程序(完整版),液晶显示

DS1302时钟程序(完整版),液晶显示

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar table0[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //液晶显示数字0——9代码sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit FB=P0^7;sbit start=P1^4;sbit stop=P1^5;uchar i;/*******************延时n微秒函数*****************/void delaynus(uchar n) //n us延时函数{// uchar i;for(i=n;i>0;i--);}/*******************写数据函数*****************/void write1302(uchar add,uchar dat){CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=0;i<8;i++) //写入数据{DATA=dat&0x01;SCLK=1;SCLK=0;dat>>=1;}SCLK=1;CE=0;}/*******************读数据函数*****************/uchar read1302(uchar add){uchar dat;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=8;i>0;i--) //读出数据/********************为神马???**************************/{dat>>=1;if(DATA==1)dat=dat|0x80;SCLK=1;SCLK=0;}SCLK=1;CE=0;return dat;}/*******************DS1302初始化函数*****************/void init1302(){uchar flag;flag=read1302(0x81);if(flag&0x80){write1302(0x8e,0x00);write1302(0x80,0x00);write1302(0x82,(((1/10)<<4)|(1%10)));write1302(0x84,(((20/10)<<4)|(20%10)));write1302(0x86,(((19/10)<<4)|(19%10)));write1302(0x88,(((7/10)<<4)|(7%10)));write1302(0x8a,((2/10)<<4)|(2%10));write1302(0x8c,(((11/10)<<4)|(11%10)));write1302(0x90,0xa5); //充电。

关于STM32驱动DS1302实时时钟的一点思考

关于STM32驱动DS1302实时时钟的一点思考

关于STM32驱动DS1302实时时钟的一点思考之前用51 驱动过DS1302,没用多久就输出了正确的时间。

当时以为这块芯片其实没啥,很简单。

但是现在用STM32 做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO 设置不就行了?但是事情远没有想想的那么简单。

经过3 天的挣扎,现在才知道当时自己是多么天真。

关于DS1302 的基本操作可以看这里:cnblogs/qsyll0916/p/7712695.html好了,废话少说了,进入正题。

首先DS1302 读写方式属于3 线SPI。

CE、SCK、IO。

其中IO 口属于双向IO 口,我们读写都要经过这个IO 口。

在用51 开发的时候,因外他是准双向IO,不需要我们额外关心他的输入输出设置。

需要输出的时候直接写P0= 1;需要检测外部输入的时候直接写if(P0== 1) ,都很方便,但是方便的同时带来的是读写速度上的限制。

那么在STM32 中,每个IO 口都有8 种输出模式。

复杂的同时也意味着每一种模式都是专门定制的,带来了速度上的优势。

所以在移植这个程序的时候,就需要注意这个双向IO 的设置问题。

一开始我也不是很懂,各种百度查资料,各种问人。

最后才知道有两种方式可以实现双向的IO 读写设置。

第一:#define DS1302_DATIN PBin(6)#define DS1302_DATOUT PBout(6)#define DS1302_DAT_INPUT() {GPIOB->CRL&= 0XF0FFFFFF;GPIOB- >CRL|= 8#define DS1302_DAT_OUTPUT() {GPIOB->CRL&=。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/****************************************************************************** * @ File name --> <strong><font color="#FF0000">ds1302</font></strong>.c* @ Author --> By@ Sam Chan* @ Version --> V1.0* @ Date --> 08 - 23 - 2012* @ Brief --> 时钟芯片DS1302驱动** @ Copyright (C) 20*** @ All rights reserved******************************************************************************* ** File Update* @ Version --> V1.0.1* @ Author --> By@ Sam Chan* @ Date --> 10 - 20 - 2013* @ Revise --> A、增加对STM32控制的移植支持* @ --> B、增加对内置的RAM操作相关函数* @ --> C、增加检测DS1302是否存在,是否第一次上电检测函数* @ --> D、增加对DS1302内置的锂电池充电寄存器参数设置函数和结构体*******************************************************************************/ #include "ds1302.h"/****************************************************************************** 定义变量******************************************************************************/ #define Date TimeValue.date#define Min TimeValue.minute#define Sec TimeValue.second#define Hour TimeValue.hour#define Week TimeValue.week#define Month TimeValue.month#define Year TimeValue.yearTime_Typedef TimeValue; //定义时间数据指针void Time_Init(){TimeValue.date=24;TimeValue.hour=6;TimeValue.minute=12;TimeValue.month=5;TimeValue.second=0;TimeValue.week=2;TimeValue.year=16;}Charge_Typedef ChargeValue; //定义充电寄存器/****************************************************************************** * Function Name --> GPIO初始化* Description --> none* Input --> none* Output --> none* Reaturn --> none******************************************************************************/void DS1302_GPIOInit(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIOC外设时钟/* 初始化GPIOC */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);}/****************************************************************************** * Function Name --> DS1302写入一个字节数据* Description --> none* Input --> dat:要写入的数据* Output --> none* Reaturn --> none******************************************************************************/ void DS1302_Write_Byte(u8 dat){u8 i;DS1302_SDA_OUT(); //设置为输出口for(i=0;i<8;i++){DS1302_SCL = 0; //时钟线拉低if(dat & 0x01) DS1302_SDA = 1; //数据线放上数据,先发低位else DS1302_SDA = 0;dat >>= 1; //数据右移一位DS1302_SCL = 1; //发送数据,上升沿有效}}/****************************************************************************** * Function Name --> DS1302读出一个字节数据* Description --> none* Input --> none* Output --> none* Reaturn --> 读到的数据******************************************************************************/ unsigned DS1302_Read_Byte(){u8 ReData=0x00;u8 i;DS1302_SDA_IN(); //设置为输入口for(i=0;i<8;i++){if(DS1302_IN_SDA == 1){ ReData |= 0x80; } //读出一位数据是“1”DS1302_SCL = 0; //时钟线拉低ReData >>= 1; //数据右移一位,先读取低位,数据补“0”DS1302_SCL = 1; //上升沿读取数据}return(ReData); //返回读取到的数据}/****************************************************************************** * Function Name --> 向DS1302某地址写入数据* Description --> none* Input --> add:要操作的地址* dat:要写入的数据* Output --> none* Reaturn --> none******************************************************************************/ void DS1302_Write_Data(u8 add,u8 dat){DS1302_RST = 0; //复位脚拉低DS1302_SCL = 0; //时钟线拉低DS1302_RST = 1; //复位脚拉高DS1302_Write_Byte(add); //写入要操作地址DS1302_Write_Byte(dat); //写入数据//delay_us(5);DS1302_RST = 0;DS1302_SCL = 0;}* Function Name --> 从DS1302某地址读取数据* Description --> none* Input --> add:要操作的地址* Output --> none* Reaturn --> 要读取的寄存器的数值******************************************************************************/ unsigned DS1302_Read_Data(u8 add){u8 Temp;DS1302_RST = 1;DS1302_Write_Byte(add); //写入要操作地址Temp = DS1302_Read_Byte(); //开始读取数据DS1302_RST = 0;return(Temp); //返回读取到的数据}/****************************************************************************** * Function Name --> 主电源对备用电池充电设置* Description --> 如果备用电池接的是可充电的锂电池或者其他可充电电池的时候,* 可以打开DS1302的充电电路,利用主供电对电池进行充电,免的换电池的麻烦* Input --> *CHG_dat:寄存器控制指针* Output --> none* Reaturn --> none******************************************************************************/ void DS1302_Charge_Manage(Charge_Typedef* CHG_dat){u8 CHG_Value;CHG_Value = (CHG_dat->TCSx << 4) | (CHG_dat->DSx << 2) | CHG_dat->RSx;DS1302_WP_Disable(); //取消写保护DS1302_Write_Data(Trickle_Charger_Address,CHG_Value);DS1302_WP_Enable(); //打开写保护}/****************************************************************************** * Function Name --> DS1302内置的RAM读写操作* Description --> none* Input --> *pBuff:读写数据存放区* WRadd:读写起始地址,范围在RAM_Address0 ~ RAM_Address28之间,最后一位地址有其他用途* num:读写字节数据的数量,范围在1 ~ 28之间* RW:读写判断位。

相关文档
最新文档