中级会员
 
- 积分
- 355
- 金钱
- 355
- 注册时间
- 2015-11-28
- 在线时间
- 71 小时
|
5金钱
大神们代码如下
#ifndef _DS_1302_
#define _DS_1302_
#include "sys.h"
#include "delay.h"
#include "usart.h"
/*定义DS1302相关的端口和寄存器*/
#define SCLK PAout(1)//定义DS1302的时钟信号sclk
#define IO PAout(2)//定义输出的ds1302的数据
#define DS_RST PAout(3)
#define READ_IO PAin(2)
/*定义的端口的输入输出方向*/
#define SDA_IN() {GPIOA->CRL&=0xFFFFF0FF;GPIOA->CRL|=0xFFFFF8FF;}
#define SDA_OUT() {GPIOA->CRL&=0xFFFFF0FF;GPIOA->CRL|=0xFFFFF3FF;}
/*******定义相关的寄存器*******************/
#define DS_SEC_REG 0x80//秒寄存器
#define DS_MIN_REG 0x82//分寄存器
#define DS_HOR_REG 0x84//小时寄存器
#define DS_DAY_REG 0x86//天寄存器
#define DS_MONTH_REG 0x88//月寄存器
#define DS_WEEK_REG 0x8a//星期寄存器
#define DS_year_REG 0x8c//年寄存器
#define DS_CONTRLO_REG 0x8e//控制寄存器
#define DS_CHARGE_REG 0x90//涡流充电寄存器
#define DS_SCLKBURST_REG 0xbe//时钟多字节寄存器
/******************************************/
//时间结构体定义
typedef struct
{
vu16 year;
vu8 month;
vu8 day;//定义了volatile类型的变量年、月、日
vu8 hour;
vu8 min;
vu8 sec;
vu8 week;
vu8 mode;//12/24模式
vu8 am_pm;//上下午指示
vu8 charge;//充电指示 1开启、0关闭
float temperature;//温度显示
}_calender_obj;
/*************函数的声明**************/
void DS1302_Init(void);//DS1302的初始化
void DS1302_Write_Byte(u8 Reg,u8 Date);//在固定寄存器写入数据
u8 DS1302_Read_Byte(u8 Reg);//在固定寄存器读取数据
void DS1302_Set(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 sec);//设置初始时间
void DS1302_Mode(u8 mode);
u8 BCDT0Num(u8 BCD);
#endif
上边是定义的端口
#include "calender.h"
_calender_obj calender;//定义一个日历结构体变量
/*************初始化函数****************/
void DS1302_Init(void)
{
RCC->APB2ENR|=1<<2;//使能端口A时钟
GPIOA->CRL&=0xffff000f;
GPIOA->CRL|=0x00003330;//PA1,PA2,A3推挽输出
DS_RST=0;
SCLK=0;
IO=0;
}
void DS1302_Write(u8 dat)
{
u8 i;
for(i=0; i<8; i++)
{
if(dat&(0x01<<i)) IO=1;
else IO=0;
SCLK=1;
delay_us(1);
SCLK=0;
}
}
u8 DS1302_Read(void)
{
u8 i,byte=0;
for(i=0;i<8;i++)
{
byte >>= 1;
if(READ_IO==1) byte |= 0x80;
SCLK=1;
delay_us(1);
SCLK=0;
}
return(byte);
}
/*****************写一个字节******************/
void DS1302_Write_Byte(u8 addr,u8 data)
{
SDA_OUT();
DS_RST=0;
SCLK=0;
DS_RST=1;
delay_us(1);
DS1302_Write(addr);
DS1302_Write(data);
delay_us(1);
DS_RST=0;
}
u8 DS1302_Read_Byte(u8 addr)
{
u8 data=0;
DS_RST=0;
SCLK=0;
DS_RST=1;
SDA_OUT();
delay_us(1);
DS1302_Write(addr);
SDA_IN();
data = DS1302_Read();
delay_us(1);
DS_RST=0;
return(data);
}
void DS1302_Set(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 sec)
{
DS1302_Write_Byte(DS_year_REG,year);
DS1302_Write_Byte(DS_MONTH_REG,month);
DS1302_Write_Byte(DS_DAY_REG,day);
DS1302_Write_Byte(DS_HOR_REG,hour);
DS1302_Write_Byte(DS_MIN_REG,min);
DS1302_Write_Byte(DS_SEC_REG,sec);
}
void DS1302_Mode(u8 mode)
{
if(mode)
DS1302_Write_Byte(DS_MIN_REG,0x00);
else
DS1302_Write_Byte(DS_MIN_REG,0x10);
}
main函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "calender.h"
#include "led.h"
int main()
{
u8 a;
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600);//串口初始化
delay_init(72);//延时初始化
DS1302_Init();//ds1302初始化
LED_Init();
//DS1302_Mode(0);
//DS1302_Set(16,3,31,10,50,0);
DS1302_Write_Byte(DS_year_REG,0x16);
while(1)
{
a=DS1302_Read_Byte(0x85);
printf("%d\r\n",a);
////// //printf("%d\r\n",DS1302_Read_Byte(DS_year_REG));
LED0=1;
delay_ms(200);
LED0=0;
delay_ms(200);
|
|