打印

哪位前辈帮我看一下STM32控制DS1302读不出时间

[复制链接]
1608|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ykyong918|  楼主 | 2013-6-26 00:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//main.c
#include "stm32f10x.h"
#include <1302.h>
#include <1602.h>
//#include <jianpen.h>
#include <delay.h>
__IO uint32_t TimingDelay;
__IO uint32_t ReadTime_1302;
uint8_t i;
//uint8_t table0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};     //
uint8_t num;
uint8_t  table[]="TIME   :  :   W ";
uint8_t  table1[]="DATE 2013-06-25";
uint8_t flag;
int8_t miao;
int8_t fen;
int8_t shi;
int8_t Year;
uint8_t Month,Day,Week;
GPIO_InitTypeDef init_gpioa;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
init_gpioa.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
init_gpioa.GPIO_Mode = GPIO_Mode_Out_OD;
init_gpioa.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&init_gpioa);
init_gpioa.GPIO_Pin = GPIO_Pin_All;
init_gpioa.GPIO_Mode = GPIO_Mode_Out_PP;
init_gpioa.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&init_gpioa);
init_gpioa.GPIO_Pin = GPIO_Pin_All;
init_gpioa.GPIO_Mode = GPIO_Mode_Out_PP;
init_gpioa.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&init_gpioa);
   init();//1602显示初始化
   for(num=0;num<17;num++)
{
write_data(table[num]);
}

write_com(0x80+0x40);

for(num=0;num<17;num++)
{

write_data(table1[num]);
}
while(1)
{
miao=Read1302(0x81);         //从1302里读回秒钟的数
dislay(0x0B,miao);         //送到1602上显示秒钟的读数
fen=Read1302(0x83);
dislay(8,fen);
shi=Read1302(0x85);
dislay(5,shi);
Year=Read1302(0x8d);
dislay(0x47,Year);
Month=Read1302(0x89);
dislay(0x4a,Month);
Day=Read1302(0x87);
dislay(0x4d,Day);
Week=Read1302(0x8b);         //从1302里读回星期的数
write_com(0x8f);         //在1602的0x8f的位置显示星期
write_data(0x30+Week);         //给1602送星期要显示的数
}

//DS1302.c
#include <1302.h>
void Write1302(u8 dat) //void writeds1302_dat(u8 dat) //DS302.c

u8 i;

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

   {

GPIOA->ODR&=0xffef; //GPIOA->ODR&=0<<4;

GPIOA->ODR&=0xfff7; //GPIOA->ODR&=0<<3; //sclk=0;

if(dat&0x01)

GPIOA->ODR|=1<<4; //io=dat&0x01;

dat=dat>>1;

GPIOA->ODR|=1<<3; //sclk=1;

    }

}

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

void WriteByte1302(u8 add,u8 dat)

{

GPIOA->ODR&=0xffdf;//GPIOA->ODR&=0<<5; //res=0;????????????

delayms(1); //_nop_();

GPIOA->ODR&=0xfff7;//GPIOA->ODR&=0<<3; //sclk=0;

delayms(1); //_nop_();

GPIOA->ODR|=1<<5; //GPIOA->ODR|=1<<5; //res=1;

delayms(1); //_nop_();

Write1302(add);

Write1302(dat);

GPIOA->ODR&=0xffdf;//GPIOA->ODR&=0<<5; //res=0;

delayms(1); //_nop_();

}

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

u8 ReadByte1302(u8 dat)

{

u8 i,temp,dat0,dat1,dat2;

GPIOA->ODR&=0xffdf;//GPIOA->ODR&=0<<5; //res=0;

delayms(1); //_nop_();

GPIOA->ODR&=0xfff7;//GPIOA->ODR&=0<<3;//sclk=0;

delayms(1); //_nop_();

GPIOA->ODR|=1<<5; //res=1;

delayms(1); //_nop_();

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

{

GPIOA->ODR&=0xffef;//GPIOA->ODR&=0;

GPIOA->ODR&=0xfff7;//GPIOA->ODR&=0<<3; //sclk=0;

if(dat&0x01)

GPIOA->ODR|=1<<4; //io=dat&0x01;

dat=dat>>1;

GPIOA->ODR|=1<<3; //sclk=1;

}

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

{

temp=temp>>1;

GPIOA->ODR&=0xfff7;//GPIOA->ODR&=0<<3; //sclk=0;

if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))

temp=temp|0x80;

GPIOA->ODR|=1<<3; //sclk=1;

}

GPIOA->ODR&=0xffdf;//GPIOA->ODR&=0<<5; //res=0;

delayms(1); //_nop_();
//dat0=temp;
        dat1=temp/16;
  dat2=temp%16;
  dat0=dat1*10+dat2;
return(dat0);
u8 Read1302(u8 addr)

{
uint8_t dat;
dat=ReadByte1302(addr);
return dat;
}

相关帖子

沙发
ykyong918|  楼主 | 2013-6-26 00:41 | 只看该作者
读不回来时间,显示都是Q5 也不动,

使用特权

评论回复
板凳
dirtwillfly| | 2013-6-26 10:07 | 只看该作者
#include <1302.h>
void Write1302(u8 dat) //void writeds1302_dat(u8 dat) //DS302.c

函数定义时用的u8类型变量,调用时却用了16位的数据

使用特权

评论回复
地板
dirtwillfly| | 2013-6-26 10:13 | 只看该作者
其他的我没仔细看,你再检查下程序有没有问题

使用特权

评论回复
5
ykyong918|  楼主 | 2013-6-26 13:26 | 只看该作者
嗯,前辈就是前辈一眼就看出了一个错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

23

帖子

0

粉丝