4674|17

50

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

很神奇啊,高手看看 [复制链接]

我写了一个1602显示时钟,用的是DS12C887,神奇的是写年的时候,01年,02年,都可以,写为03年或者以后就所有数据出错,?????高手解释一下,那里的问题???,而且,写成2002年12月31日24:59:59让他自己跑,很顺利就进入03年了   我一头雾水啊…… 新建 Microsoft Word 文档.doc (38 KB, 下载次数: 11)

           并且,还有一个问题,就是掉点之后时钟芯片似乎就不走了,比如我在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 编辑 ]
此帖出自51单片机论坛

最新回复

不好意思,我没有看清你的IC型号,呵呵。像这类芯片,我曾经听到过有人说,很多货都是翻新的,内部的电池性能不能有保障,除非在正规代理商那里拿货。这类片子我没有用过,所以只能建设性的给个思路。 1. 如果有可能的话,换一个新的片子试一试。 2. 还是多看看数据手册,直接看原版的数据手册,不要看中文翻译版的。  详情 回复 发表于 2011-11-5 08:01
点赞 关注
 

回复
举报

56

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

回复 楼主 sphshine 的帖子

楼主你的文档我下了打不开,你最好还是把程序贴出来吧
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
12887里面有一位是控制振荡电路工作的,看看不是不是操作哪一位了,不过按说一般情况下掉电的时候是不会影响哪一位的!
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 jishuaihu 的帖子

经过检查,是按照datasheet写的,应该没有什么误操作啊,,,请指教~~~真是一头雾水

[ 本帖最后由 sphshine 于 2011-11-2 18:42 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 沙发 abo6016 的帖子

给你贴出来了
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

6
 
写03 04之类的会显示什么呢?
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 孤獨の快樂 的帖子

写03以后的 只要是DS12887能写入的地方,全是乱码
此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 4楼 sphshine 的帖子

有没有单独供电的电池?
此帖出自51单片机论坛
 
 
 

回复

199

帖子

0

TA的资源

纯净的硅(初级)

9
 
你能不能别为难这个时钟芯片。。。。写入24点。。我晕死
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

10
 

回复 9楼 老阮 的帖子

眼睛真尖,看了好几次没看出这个毛病!
此帖出自51单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(初级)

11
 
真历害,这要用放大镜来看
此帖出自51单片机论坛
 
 
 

回复

123

帖子

0

TA的资源

一粒金砂(高级)

12
 
1. 写入03全乱后,再把其他所有的都读出来,多读几遍,再看看,数据是否正常?
2. 因为你是连续写入的,所以一下检查时序, 时序插入延时试一试!
3. 掉电后有后备电池或者大电容供上吗?晶体是否在掉电后停振呢?因为维持RAM数据的电压可能比维持晶体的电压要低,所以检查一下晶体是否停振!
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

13
 

回复 9楼 老阮 的帖子

不好意思  打错了 是23
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 8楼 gongjihua 的帖子

没有  但他内部不是有供电吗?
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 12楼 liufan 的帖子

延时大约500微秒也不行  我觉得这个时间够长了;  多读几遍也不行;;  至于您的第三个,还真没有……12C887不是有内部电源吗?
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

16
 
12887内部是有电池的,这个不需要外部供电,这种现象好像是使用内部后备电池的时候晶振停振了,还是觉的是设置的问题。
此帖出自51单片机论坛
 
 
 

回复

123

帖子

0

TA的资源

一粒金砂(高级)

17
 
不好意思,我没有看清你的IC型号,呵呵。像这类芯片,我曾经听到过有人说,很多货都是翻新的,内部的电池性能不能有保障,除非在正规代理商那里拿货。这类片子我没有用过,所以只能建设性的给个思路。
1. 如果有可能的话,换一个新的片子试一试。
2. 还是多看看数据手册,直接看原版的数据手册,不要看中文翻译版的。
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

18
 

回复 16楼 jishuaihu 的帖子

可是到底是哪里的问题呢? 一直没调出来啊           真无语了……
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表