很神奇啊,高手看看

2019-03-24 19:39发布

我写了一个1602显示时钟,用的是DS12C887,神奇的是写年的时候,01年,02年,都可以,写为03年或者以后就所有数据出错,?????高手解释一下,那里的问题???,而且,写成2002年12月31日24:59:59让他自己跑,很顺利就进入03年了   我一头雾水啊…… 新建 Microsoft Word 文档.doc (38 KB, 下载次数: 11) 2011-11-1 18:49 上传 点击文件名下载附件            并且,还有一个问题,就是掉点之后时钟芯片似乎就不走了,比如我在20:21:30关电,过一会打开,现实的将是20:21:31,也就是说,每次重新供电是,时间都是以上次掉电时的时间为基础开始计时。这又是为什么??   #include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int sbit dsrw=P1^6;
sbit dsds=P1^7;
sbit dscs=P1^4;
sbit dsas=P1^5;
sbit dsirq=P3^3;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
sbit line=P2^2;       //DS18B20数据线 
uint temp;
bit symbol;
uint temperature;
uchar code time1[]="20  -  -  ";
uchar code time2[]="  :  :     C";
uchar code number[]="0123456789";
uchar year,month,day,date,hour,minute,second; void delay(uint count)
{
 uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
 } void dsreset()                      //初始化函数
{
 uint i;
 i=103;
 line=0;
 while(i>0)  i--;
 
 line=1;
 i=4;
 while(i>0)  i--;
 
} /*void tmpwritebyte(uchar a)             //写字节
{
 uint i,j;
 bit temp1;
 temp1=a;
 for(j=8;j>0;j--)
     {
  if(temp1==0)
   {
  
      line=0;
         i=8;
   while(j>0) j--;
    line=1;
      i++;i++;
  }
  else
  {
     
   line=0;
   i++;i++;
   line=1;
   i=8;
   while(j>0) i--;
  }
  a=a>>1;
  temp1=a;
  }
}*/
void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      line=0;
      i++;i++;
      line=1;
      i=8;while(i>0)i--;
    }
    else
    {
      line=0;       //write 0
      i=8;
   while(i>0)
      i--;
      line=1;
      i++;i++;
    }   }
}
bit tmpreadbit()                   //读一位
{
 uint i;
 bit a;
 //line=1;
 line=0;
 i++;
 line=1;
 i++;i++;i++;i++;
 a=line;
 i=8;
 while(i>0) i--;
 return a;
} uchar tmpread()         
{  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}  void tmpchange()
{
 
 dsreset();
 delay(1);
 tmpwritebyte(0xcc);
 tmpwritebyte(0x44);
 
}
uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}
void write_com(uchar com)                //1602
{
 P0=com;
 rs=0;
 lcden=0;
 delay(2);
 lcden=1;
 delay(2);
 lcden=0;
 
} void write_date(uchar date)            //1602
{
 P0=date;
 rs=1;
 lcden=0;
 delay(2);
 lcden=1;
 delay(2);
 lcden=0;
 
} void dswrite(uchar a, uchar b)        
{
 dscs=0;
 dsds=1;
 dsrw=1;
 dsas=1;
 P0=a;
 dsas=0;
 dsrw=0;
 P0=b;
 dsrw=1;
 dsas=1;
 dscs=1;
} uchar dsread(uchar a)
{
 uchar b;
 dscs=0;
 dsds=1;
 dsrw=1;
 dsas=1;
 P0=a;
 dsas=0;
 dsds=0;
 P0=0xff;
 b=P0;
 dsds=1;
 dsas=1;
 dscs=1;
 return b;
 
} void dsfirst()
{
 dswrite(0x0a,0x20);
 dswrite(0x0b,0x26);
 
} void init1602()
{
    uchar i;
 dula=0;
 wela=0;
 write_com(0x38);
 delay(1);
 write_com(0x0c);
 delay(1);
 write_com(0x06);
 delay(1);
 write_com(0x01);
 delay(1);
    write_com(0x80+0);
    for(i=0;i<10;i++)
 {
  write_date(time1);
 } 
    write_com(0xc0+3);
    for(i=0;i<12;i++)
 {
     write_date(time2);
 }
} void init_time()
{
 dswrite(0,30);
 dswrite(1,0);
 dswrite(2,00);
 dswrite(3,0);
 dswrite(4,22);
 dswrite(5,0);
 dswrite(6,1);
 dswrite(7,31);
 dswrite(8,10);
 dswrite(9,0);                //????,写0,1,2都可以,写3以上就全乱了(包括别的位),但自己跑到3就正常
} void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uint h)
{
 uchar ge,shi;
 shi=a/10;
 ge=a%10;
 write_com(0x80+2);
 write_date(number[shi]);
 write_date(number[ge]);
 shi=b/10;
 ge=b%10;
 write_com(0x80+5);
 write_date(number[shi]);
 write_date(number[ge]);
 shi=c/10;
 ge=c%10;
 write_com(0x80+8);
 write_date(number[shi]);
 write_date(number[ge]);
 write_com(0x80+11);
 switch(d)
 {
  case 1:write_date('M');write_date('O');write_date('N');break;
  case 2:write_date('T');write_date('U');write_date('E');break;
  case 3:write_date('W');write_date('E');write_date('N');break;
  case 4:write_date('T');write_date('H');write_date('U');break;
  case 5:write_date('F');write_date('R');write_date('I');break;
  case 6:write_date('S');write_date('A');write_date('T');break;
  case 7:write_date('S');write_date('U');write_date('N');break;
 }
 write_com(0xc0+3);
 shi=e/10;
 ge=e%10;
 write_date(number[shi]);
 write_date(number[ge]);
 write_com(0xc0+6);
 shi=f/10;
 ge=f%10;
 write_date(number[shi]);
 write_date(number[ge]);
 write_com(0xc0+9);
 shi=g/10;
 ge=g%10;
 write_date(number[shi]);
 write_date(number[ge]);
 
 write_com(0xc0+12);
 shi=h/100;
 ge=h/10-10*shi;
 write_date(number[shi]);
 write_date(number[ge]);
}  
void main()
{
 //dsfirst();
 dsreset();
 init_time();
 init1602();
 while(1)
 {
     tmpchange();
     delay(100);
     temperature=tmp();
   year=dsread(9);
   month=dsread(8);
  day=dsread(7);
   date=dsread(6);
  hour=dsread(4);
   minute=dsread(2);
  second=dsread(0);
  display(year,month,day,date,hour,minute,second,temperature);
    
 }
 
} [ 本帖最后由 sphshine 于 2011-11-2 18:11 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
abo6016
1楼-- · 2019-03-25 02:55
楼主你的文档我下了打不开,你最好还是把程序贴出来吧
jishuaihu
2楼-- · 2019-03-25 07:18
12887里面有一位是控制振荡电路工作的,看看不是不是操作哪一位了,不过按说一般情况下掉电的时候是不会影响哪一位的!
sphshine
3楼-- · 2019-03-25 09:50
 精彩回答 2  元偷偷看……
sphshine
4楼-- · 2019-03-25 12:54
给你贴出来了
孤獨の快樂
5楼-- · 2019-03-25 18:46
写03 04之类的会显示什么呢?
sphshine
6楼-- · 2019-03-25 21:03
写03以后的 只要是DS12887能写入的地方,全是乱码

一周热门 更多>