打印

LCD和DS1302显示不正确,没有时间,是静止的00:00:80

[复制链接]
2810|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这样怎么办。。。。。。我在IO口已经上拉电阻但是没有效果。仿真也没问题
#define   RST0()     RST=0
unsigned  char     time[]={0x00,0x0b,0x0b,0x02,0x01,0x01,0x0c};
//写入dat
void ds1302_write(unsigned char dat)   
{  
  uchar i;
  DDR_1();
  for (i=0;i<8;i++)
  {
   if(dat & 0x01) IO1();
   else  IO0() ;
   dat=dat>>1;
   SLCK0();_nop_();
   SLCK1();        _nop_();
  }
}
//输出dat
unsigned char   ds1302_read()   
{
  uchar i;
  uchar dat=0x00;
  DDR_0();
  for (i=0;i<8;i++)
  {
   SLCK1(); _nop_();
   SLCK0();_nop_();
   if(io()) dat |=(1<<i);
  }
  return dat/16*10+dat%16;
}
//读取指定地址adress中的dat
unsigned char  ds1302_readadress(unsigned char adress)
{
  uchar dat;
  RST0(); _nop_();
  SLCK0(); _nop_();
  RST1(); _nop_();
  ds1302_write(adress);
  dat=ds1302_read();
  SLCK1(); _nop_();
  RST0();  _nop_();
  return dat;
}
//在指定地址adress写入dat
void ds1302_writeadress(unsigned char adress ,unsigned char dat)
{
  RST0();  _nop_();
  SLCK0(); _nop_();
  RST1();  _nop_();
  ds1302_write(adress) ;
  ds1302_write(dat);
  SLCK1(); _nop_();
  RST0();
}

//读取时间
void ds1302_readtime()
{ uchar i;
  uchar adress=0x81;
  for (i=0;i<7;i++)
  {
  time=ds1302_readadress(adress);
  adress +=2;
   _nop_();_nop_();
   _nop_();_nop_();
  }       
}

相关帖子

沙发
泊明相对|  楼主 | 2015-6-1 16:49 | 只看该作者
程序是这样的/
sbit  RS=P2^0;        //写信号
sbit  RWW=P2^1;        //读信号
sbit  E=P2^2;  //使能信号
#define e1   E=1
#define rd1  RWW=1  
#define rs1  RS=1  
#define e0   E=0
#define rd0  RWW=0
#define rs0  RS=0
#define PP P0
//延时函数ms
void _delay_ms(uint t)
{
   uint i,j;
   for(i=0;i<t;i++)
     for(j=0;j<120;j++);
}
//延时函数us
void _delay_us(uchar t)
{
   while(t>0)t--;
}
//写1602控制字
void  lcd1602_writecrtl(uchar  dat)
{
  rd0;//读信号置0
  rs0;//写信号置0
  _delay_us(5);
  PP=dat;
  e1;//使能信号置1
  _delay_us(5);
  e0;//使能信号置0
}
//写1602数据
void  lcd1602_writenumber(uchar dat)
{
  rd0;//读信号置0
  rs1;//写信号置1
  _delay_us(5);
  PP=dat;
  e1;//使能信号置1
  _delay_us(5);
  e0;//使能信号置0
}
//1602初始化
void  lcd1602_init()  
{
  lcd1602_writecrtl(0x38); //显示模式
  lcd1602_writecrtl(0x06); //显示光标移动位置
  lcd1602_writecrtl(0x0c); //显示开及光标设置
  lcd1602_writecrtl(0x01); //显示清屏
}
//显示地址
void  lcd1602_adr(uchar dat)  
{
  lcd1602_writecrtl(0x80 | dat);
}
//行显示-
void LCD1602_string(uchar hang,uchar lie,uchar const *p)
{
        uchar a;
        if(hang == 1) a = 0x00;
        if(hang == 2) a = 0x40;
        a = a + lie - 1;
        lcd1602_adr(a);
        while(1)
        {
                if(*p == '\0') break;
                lcd1602_writenumber(*p);
                p++;
        }
}
//uchar code zifux[]="1234567812345678"
//LCD1602_string(1,1,zifux);
//LCD1602_string(2,1,zifux);

使用特权

评论回复
板凳
泊明相对|  楼主 | 2015-6-1 16:50 | 只看该作者
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#define uchar  unsigned char
#define uint   unsigned int
//用液晶屏显示参数
uchar code zifx0[]="0123456789abcdef";
uchar code zifu0[]="Parking:5  Use:x";
uchar code zifu1[]="   12:00:00     ";
uchar code zifu2[]="   Waiting      ";
uchar code zifu3[]="   Full...      ";
//按键
sbit key1=P2^3;
sbit key2=P2^4;
sbit key3=P2^5;
//报警
sbit beer=P2^7;
//信号
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
sbit s5=P1^4;
//判断车位标志
uchar bz1;
uchar bz2;
uchar bz3;
uchar bz4;
uchar bz5;
uchar use;
//报警
uchar bzb=0;
//显示
uchar bzx=0;
uint  jishu1;
#include "time.h"       
#include "1602.h"
//蜂鸣器-------------
void beerc()
{
  beer=0; _delay_ms(40);  beer=1; _delay_ms(20);
}
//-------------------------------------------------------------
void ctrl()
{
  //读取时间------------------
  ds1302_readtime();
  //判断车位------------------
  if(s1==0)bz1=1;else bz1=0;
  if(s2==0)bz2=1;else bz2=0;
  if(s3==0)bz3=1;else bz3=0;
  if(s4==0)bz4=1;else bz4=0;
  if(s5==0)bz5=1;else bz5=0;
  use=bz1+bz2+bz3+bz4+bz5;
  //-显示使用
  lcd1602_adr(0x0f);  
  lcd1602_writenumber(0x30+use%10);
  //-显示时分秒
  if(bzx==1)
  {
          lcd1602_adr(0x43);  
          lcd1602_writenumber(0x30+time[2]%100/10);
          lcd1602_writenumber(0x30+time[2]%10);
          lcd1602_writenumber(':');      
          lcd1602_writenumber(0x30+time[1]%100/10);
          lcd1602_writenumber(0x30+time[1]%10);
          lcd1602_writenumber(':');      
          lcd1602_writenumber(0x30+time[0]%100/10);
          lcd1602_writenumber(0x30+time[0]%10);
  }
  //-车位状态
  if(bzx==0)
  {
          lcd1602_adr(0x43);  
          if(use<5)
          {
           lcd1602_writenumber('W');      
           lcd1602_writenumber('a');      
           lcd1602_writenumber('t');      
           lcd1602_writenumber('i');      
           lcd1602_writenumber('n');      
           lcd1602_writenumber('g');      
           lcd1602_writenumber(' ');      
           lcd1602_writenumber(' ');
          }      
          if(use==5)
          {
           lcd1602_writenumber('F');      
           lcd1602_writenumber('u');      
           lcd1602_writenumber('l');      
           lcd1602_writenumber('l');      
           lcd1602_writenumber('.');      
           lcd1602_writenumber('.');      
           lcd1602_writenumber('.');      
           lcd1602_writenumber('.');
          }      
  }
  //-按键
  if(key1==0){bzx=1;if(use==5)bzb=1;while(key1==0);}
  if(key2==0){bzx=1;if(use==5)bzb=1;while(key2==0);}
  if(key3==0){bzb=0;while(key3==0);}

  if(bzb==1)beerc();
}
//主函数
void main()
{
  _delay_ms(1);
  //初始化
  lcd1602_init();
  LCD1602_string(1,1,zifu0);
  LCD1602_string(1,1,zifu0);
  LCD1602_string(2,1,zifu1);
   //定时器0配置方式1 16
  TMOD|=0x01;       
  //使能定时器0
  ET0=1;
  //定时器的初值
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  //停止开启定时器0
  TR0=1;
  EA=1;       
  while(1)
   {
         ctrl();
        }
}
//----T0 计数                 
void  Time0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  if(bzx==1)
  {
   jishu1=jishu1+1;
   if(jishu1>60){jishu1=0;bzx=0;}
  }

使用特权

评论回复
地板
泊明相对|  楼主 | 2015-6-1 16:50 | 只看该作者
求帮助

使用特权

评论回复
5
泊明相对|  楼主 | 2015-6-1 16:59 | 只看该作者
就是这样

QQ图片20150601162509.jpg (1.66 MB )

QQ图片20150601162509.jpg

使用特权

评论回复
6
ningling_21| | 2015-6-2 09:37 | 只看该作者

1302没有初始化,时间怎么会动?

使用特权

评论回复
7
lmy0485| | 2015-6-10 07:02 | 只看该作者
80肯定不走啊 秒地址CH位为1 意思是停止震荡进入低功耗
秒数据80H=10000000B
秒地址10000000 写入数据最高位第8CH位 数据为0 就走了
简单一点就是说 把秒地址赋值写入数据就走了
仔细看一下DS1302说明书
虽然付错值能自动纠正,秒针有80秒的吗?

使用特权

评论回复
8
springvirus| | 2015-7-24 17:21 | 只看该作者
DS12C887,遇过类似现象,要不就是一个固定时间,至今未解决。

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝