首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

单片机ds1302写了一周还是只能读时间,不能写进时间,跪求各位大师帮小弟我看看!

2012-12-14 
单片机ds1302写了一周还是只能读时间,不能写进时间,跪求各位大师帮我看看!!中间还有红外和读取温度湿度数

单片机ds1302写了一周还是只能读时间,不能写进时间,跪求各位大师帮我看看!!

中间还有红外和读取温度湿度数据,主函数就不写了吧?想用红外来改变时间,但是现在连时间初始化都不行,跪求原因!!!

#include "1302.h"
#include "delay.h"

/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/ 

void Write1302(unsigned char dat)
{
  unsigned char i; 
  SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  delaynus(2);       //稍微等待,使硬件做好准备
  for(i=0;i<8;i++)      //连续写8个二进制位数据
    {
     DATA=dat&0x01;    //取出dat的第0位数据写入1302  低位在前,高位在后
 delaynus(2);       //稍微等待,使硬件做好准备
 SCLK=1;           //上升沿写入数据
 delaynus(2);      //稍微等待,使硬件做好准备
 SCLK=0;           //重新拉低SCLK,形成脉冲
 dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
  }

 }
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/ 
void WriteSet1302(unsigned char Cmd,unsigned char dat)
 {  
        RST=0;           //禁止数据传递
delaynus(2);     //稍微等待,使硬件做好准备
        SCLK=0;          //确保写数居前SCLK被拉低
delaynus(2);     //稍微等待,使硬件做好准备
    RST=1;           //启动数据传输
    delaynus(2);     //稍微等待,使硬件做好准备
    Write1302(Cmd);  //写入命令字
    Write1302(dat);  //写数据
RST=0;           //禁止数据传递
delaynus(2);     //稍微等待,使硬件做好准备
DATA=1;
    SCLK=1;          //将时钟电平置于高电平状态

 }
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/ 
 unsigned char Read1302(void)
 {
    unsigned char i,dat;
delaynus(2);       //稍微等待,使硬件做好准备
for(i=0;i<8;i++)   //连续读8个二进制位数据
 { dat>>=1;
 if(DATA==1)    //如果读出的数据是1
 dat|=0x80;    //将1取出,写在dat的最高位
 SCLK=1;       //将SCLK置于高电平,为下降沿读出
 delaynus(2);  //稍微等待
 SCLK=0;       //拉低SCLK,形成脉冲下降沿
 delaynus(2);  //稍微等待
  } 
  return dat;        //将读出的数据返回
}  
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/ 
unsigned char  ReadSet1302(unsigned char Cmd)
 {
  unsigned char dat;
  RST=0;                 //拉低RST


  SCLK=0;                //确保写数居前SCLK被拉低
  RST=1;                 //启动数据传输
  Write1302(Cmd);       //写入命令字
  dat=Read1302();       //读出数据
  SCLK=1;              //将时钟电平置于已知状态
  RST=0;               //禁止数据传递
  return dat;          //将读出的数据返回
}
/*****************************************************
函数功能: 1302进行初始化设置
***************************************************/ 
void Init_DS1302(void)
{

   WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
   WriteSet1302(0x80,((55/10)<<4|(55%10)));   //根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((59/10)<<4|(59%10)));   //根据写分寄存器命令字,写入分的初始值

WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值

WriteSet1302(0x86,((18/10)<<4|(18%10))); //根据写日寄存器命令字,写入日的初始值

WriteSet1302(0x88,((6/10)<<4|(6%10))); //根据写月寄存器命令字,写入月的初始值

WriteSet1302(0x8c,((9/10)<<4|(9%10)));   //根据写年寄存器命令字,写入年的初始值

WriteSet1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式

WriteSet1302(0x8E,0x80);              //根据写状态寄存器命令字,写入保护指令
}


void Ds1302_Write_Time(void) 
{
WriteSet1302(0x8e,0x00);//关闭写保护 
WriteSet1302(0x80,0x80);//暂停 
//Ds1302_Write_Byte(ds1302_charger_add,0xa9);//涓流充电 
WriteSet1302(0x84,BCDhour);//时 
WriteSet1302(0x82,BCDminute);//分
WriteSet1302(0x80,BCDsecond);//秒
WriteSet1302(0x8e,0x80);//打开写保护 
}


[解决办法]
#include "1302.h"
#include "delay.h"

/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/ 

void Write1302(unsigned char dat)
{
  unsigned char i; 
  //SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  //delaynus(2);       //稍微等待,使硬件做好准备 //(这个两个多余的)
  for(i=0;i<8;i++)      //连续写8个二进制位数据
    {
         DATA=dat&0x01;    //取出dat的第0位数据写入1302  低位在前,高位在后
         delaynus(2);       //稍微等待,使硬件做好准备
         SCLK=1;           //上升沿写入数据
         delaynus(2);      //稍微等待,使硬件做好准备
         SCLK=0;           //重新拉低SCLK,形成脉冲
         dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位


      }
    
 }
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/ 
void WriteSet1302(unsigned char Cmd,unsigned char dat)
 {      
        RST=0;           //禁止数据传递
        delaynus(2);     //稍微等待,使硬件做好准备
        SCLK=0;          //确保写数居前SCLK被拉低
        delaynus(2);     //稍微等待,使硬件做好准备
        RST=1;           //启动数据传输
        delaynus(2);     //稍微等待,使硬件做好准备
        Write1302(Cmd);  //写入命令字
        Write1302(dat);  //写数据
        RST=0;           //禁止数据传递
        delaynus(2);     //稍微等待,使硬件做好准备
        DATA=1;//(这个是什么意思?)
        SCLK=1;          //将时钟电平置于高电平状态

 }
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/ 
 unsigned char Read1302(void)
 {
    unsigned char i,dat;
    delaynus(2);       //稍微等待,使硬件做好准备//(这个可以不要)
    for(i=0;i<8;i++)   //连续读8个二进制位数据
     {     dat>>=1;
         if(DATA==1)    //如果读出的数据是1
         dat
[解决办法]
=0x80;    //将1取出,写在dat的最高位
         SCLK=1;       //将SCLK置于高电平,为下降沿读出
         delaynus(2);  //稍微等待
         SCLK=0;       //拉低SCLK,形成脉冲下降沿
         delaynus(2);  //稍微等待
      }     
  return dat;        //将读出的数据返回
}  
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/ 
unsigned char  ReadSet1302(unsigned char Cmd)
 {
  unsigned char dat;
  RST=0;                 //拉低RST
  SCLK=0;                //确保写数居前SCLK被拉低
  RST=1;                 //启动数据传输
  Write1302(Cmd);       //写入命令字


  dat=Read1302();       //读出数据
  SCLK=1;              //将时钟电平置于已知状态
  RST=0;               //禁止数据传递
  return dat;          //将读出的数据返回
}
/*****************************************************
函数功能: 1302进行初始化设置
***************************************************/ 
void Init_DS1302(void)
{  (写入时间的话可以直接写如:WriteSet1302(0x80,0x55)  

   WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
   WriteSet1302(0x80,((55/10)<<4
[解决办法]
(55%10)));   //根据写秒寄存器命令字,写入秒的初始值

    WriteSet1302(0x82,((59/10)<<4
[解决办法]
(59%10)));   //根据写分寄存器命令字,写入分的初始值

    WriteSet1302(0x84,((23/10)<<4

热点排行