/**********************第一:首先对端口进行配置****************/
//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;
上一篇:用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中
下一篇:STM32F103+语音识别模块HBR640
推荐阅读最新更新时间:2024-11-12 13:08
设计资源 培训 开发板 精华推荐
- nuc120re_download
- NCP1612GEVB:160 W 薄型 PFC 评估板
- iCoupler 技术内部:使用 ADuM3220 隔离式栅极驱动器驱动 H 桥
- 555发声器
- 基于ST1S40IPUR的、具有使能开/关功能的、4A峰值800kHz固定频率PWM同步降压演示板
- 具有 400mA 突发模式操作、2.25MHz 同步降压型稳压器的 LTC3621IMS8E 5Vout 的典型应用
- 基于SLLIMM智能功率模块STIPN1M50T-H的60W电机控制电源板
- L7808C 可调输出稳压器的典型应用(7 至 30 V)
- LM2902DTBG 带迟滞比较器的典型应用
- LTC3631IDD 正负转换器的典型应用电路
- 科学家研发基于AI的身份验证工具 可保护车辆免受网络攻击威胁
- Microchip推出广泛的IGBT 7 功率器件组合,专为可持续发展、电动出行和数据中心应用而设计
- 面向未来驾驶体验 博世推出新型微电子技术
- 英飞凌与马瑞利合作 利用AURIX™ TC4x MCU系列推动区域控制单元创新
- 5C超充,该怎么卷?
- 《2025年度中国汽车十大技术趋势》正式揭晓!你最看好哪个?
- Microchip推出新型VelocityDRIVE™软件平台和车规级多千兆位以太网交换芯片,支持软件定义汽车
- 英特尔中国正式发布2023-2024企业社会责任报告
- can转485数据是如何对应的
- MCU今年的重点:NPU和64位