打印
[51单片机]

DS1302+LCD1602

[复制链接]
1515|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wanhongru|  楼主 | 2013-7-25 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写出来的程序 结果时间不走,还显示Date:85-85-85   85:85:85,到底问题出在哪了,#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar code digit[10]={"0123456789"};
sbit SCLK=P1^4;
sbit DATA=P1^5;
sbit RST=P1^6;

/*延时若干微秒*/
void delaynus(uchar n)
{
uchar i;
for(i=0;i<n;i++);
}

/*函数功能:向1302写一个字节数据*/
void Write1302(uchar dat)
{
uchar i;
RST=1;
SCLK=0; //先置低,等拉高后就开始写数据
delaynus(2);//保持一段时间
for(i=0;i<8;i++)
   {
  if(dat&0x01)  {DATA=1;}
  else{DATA=0;}
   delaynus(2);//保持一段时间
    SCLK=1; //上升沿,单片机开始向DS1302写数据
    delaynus(2);//保持一段时间,使数据写完
    SCLK=0; //重新拉低SCLK
    dat>>=1;//位右移,准备写入下一个数据位
   }
   RST=0;
}

/*根据命令字,向1302写入一个字节数据*/
void WriteSet1302(uchar Cmd,uchar dat)
{
RST=0; //根据时序图得出
SCLK=0; //同上
RST=1;  //启动数据传输
delaynus(2); //SCLK为低,持续一段时间
Write1302(Cmd);          //写指令
Write1302(dat);   //写数据
SCLK=1;
RST=0;   //禁止数据传递
}

/*从1302读一个字节数据*/
uchar Read1302(void)
{
uchar i,dat;
  RST=1;
delaynus(2);
for(i=0;i<8;i++) //连续读8个二进制位
    {
     dat>>=1; //将dat的数据位右移,因为最先读出的是最低位
     if(DATA==1)
     {dat|=0x80;} //将1取出,写在本次的最高位
     else {dat&=0x7f;}
     SCLK=1; //将SCLK置高,根据时序图得出的初始状态
     delaynus(2);//等待一段时间
     SCLK=0;  //开始读数据
     delaynus(2);//等待一段时间,数据读完
    }
    RST=0;
    return dat; //将读出的数据返回
}

/*根据命令字,向1302读取一个字节数据*/
uchar ReadSet1302(uchar Cmd)
{
uchar dat;
RST=0; //初始化,由时序图得出
SCLK=0; //同上
RST=1;//开始数据传输
Write1302(Cmd); //写命令字
dat=Read1302(); //读出数据
SCLK=1;   //将电平置于已知状态
RST=0;    //禁止数据传递
return dat;   //将读出的数据返回
}

/*函数功能:将1302初始化*/
void Init_DS1302(void)
{
WriteSet1302(0x8e,0x00) ; //根据写状态命令字,写入不保护指令
WriteSet1302(0x80,0x10) ; //根据写秒命令字,写入秒的初值
WriteSet1302(0x82,0x00) ; //根据写分命令字,写入分的初值
WriteSet1302(0x84,0x12) ; //根据写小时命令字,写入小时的初值
WriteSet1302(0x86,0x16) ; //根据写日命令字,写入日的初值
WriteSet1302(0x88,0x11)  ;//根据写月命令字,写入月的初值
WriteSet1302(0x8c,0x08)  ;//根据写年命令字,写入年的初值
WriteSet1302(0x8e,0x80) ;  //写保护开
}

/*对液晶模块的操作程序*/
sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;


/*函数功能:延时1ms*/
void delay1ms()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}

/*函数功能:延时若干ms*/
void delaynms(uchar n)
{
uchar i;
for(i=0;i<n;i++)
delay1ms();
}



/*函数功能:将模式设置指令或显示地址写入液晶模块*/
void WriteInstruction(uchar dictate)
{
RS=0;RW=0;//写指令
P0=dictate;//将数据给P0口
delaynms(5);
E=1;//开始写入液晶模块
delaynms(5);
E=0;//液晶模块开始执行命令
}

/*函数功能:指定字符显示的实际地址*/
void WriteAddress(uchar x)
{
WriteInstruction(x|0x80);
}

/*函数功能:将数据写入液晶模块*/
void WriteData(uchar y)
{
  RS=1;RW=0;//写数据
P0=y;//将数据给P0口
delaynms(5);
E=1;//开始写入液晶模块
delaynms(5);
  E=0;//液晶模块开始执行命令
}

/*函数功能:对LCD的显示模式初始化*/
  void LcdInitiate(void)
  {
  delaynms(15);
  WriteInstruction(0x38);
  delaynms(5);
  WriteInstruction(0x38);
  delaynms(5);
  WriteInstruction(0x38);
  delaynms(5);
  WriteInstruction(0x0c);
  delaynms(5);
  WriteInstruction(0x06);
  delaynms(5);
  WriteInstruction(0x01);
  delaynms(5);
  }

  /*LCD1602数据的显示模式*/

  /*函数功能:显示秒*/
  void DisplaySecond(uchar x)
  {
  uchar i,j;
  i=x/10;
  j=x%10;
  WriteAddress(0x49);
  WriteData(digit[i]);
  WriteData(digit[j]);
  delaynms(50);
  }

   /*函数功能:显示分*/
  void DisplayMinute(uchar x)
  {
  uchar i,j;
  i=x/10;
  j=x%10;
  WriteAddress(0x46);
  WriteData(digit[i]);
  WriteData(digit[j]);
  delaynms(50);
  }

   /*函数功能:显示小时*/
  void DisplayHour(uchar x)
  {
  uchar i,j;
  i=x/10;
  j=x%10;
  WriteAddress(0x43);
   WriteData(digit[i]);
  WriteData(digit[j]);
  delaynms(50);
  }

   /*函数功能:显示日*/
  void DisplayDay(uchar x)
  {
  uchar i,j;
  i=x/10;
  j=x%10;
  WriteAddress(0x0c);
   WriteData(digit[i]);
  WriteData(digit[j]);
  delaynms(50);
  }

   /*函数功能:显示月*/
  void DisplayMonth(uchar x)
  {
  uchar i,j;
  i=x/10;
  j=x%10;
  WriteAddress(0x09);
   WriteData(digit[i]);
  WriteData(digit[j]);
  delaynms(50);
  }

  /*函数功能:显示年*/
  void DisplayYear(uchar x)
  {
  uchar i,j;
  i=x/10;
  j=x%10;
  WriteAddress(0x06);
   WriteData(digit[i]);
  WriteData(digit[j]);
  delaynms(50);
  }

  /*函数功能:主函数*/
  void main(void)
  {
  uchar second,minute,hour,day,month,year;
  uchar ReadValue;
   LcdInitiate();
   WriteAddress(0x01);
   WriteData('D');
   WriteData('a');
   WriteData('t');
   WriteData('e');
   WriteData(':');
   WriteAddress(0x08);
   WriteData('-');
   WriteAddress(0x0b);
   WriteData('-');
   WriteAddress(0x45);
   WriteData(':');
   WriteAddress(0x48);
   WriteData(':');
  Init_DS1302();
     while(1)  
         {
         ReadValue=ReadSet1302(0x81); //从DS1302的秒寄存器读出数据
        
         second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);    //BCD码转 十进制数
         DisplaySecond(second);
      
         ReadValue=ReadSet1302(0x83); //从分寄存器读数据
         minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
         DisplayMinute(minute);

         ReadValue=ReadSet1302(0x85); //从小时寄存器读数据
         hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
         DisplayHour(hour);
         
         ReadValue=ReadSet1302(0x87); //从日寄存器读数据
         day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
         DisplayDay(day);

         ReadValue=ReadSet1302(0x89); //从月寄存器读数据
         month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
         DisplayMonth(month);

         ReadValue=ReadSet1302(0x8d); //从年寄存器读数据
         year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
         DisplayYear(year);
        
         }
  }

相关帖子

沙发
zl_dai| | 2014-2-7 18:00 | 只看该作者
应该不错

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝