关于ds1302和lcd1602问题,请大神指教,好人好报,急。

2020-01-30 13:38发布

这次想做个ds1302的时钟用lcd1602来显示,可是在写完程序之后发现模拟的电路运行不正常,我觉得电路应该没问题,1302已经给他置了初值进去便能计时,现在lcd1602不能显示出正确的时间,我估计是读取1302哪里的问题,要么就是转换为bcd码 再转换为十进制错了  这里的转换我一直不理解 我用的是模块化编程 贴上一部分代码  我是小白 望大神指教。谢谢了。

这个是1302的程序
#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit rst=P3^4;
sbit sclk=P3^5;
sbit io=P3^6;
uchar  time_data[7]={13,1,5,6,20,47,32} ;//年 星期 月 日 小时 分 秒
uchar  time_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar  read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}        ;
void write_ds1302_byte(uchar dat)
{
  uchar i;
  for(i=0;i<8;i++)
  {
   sclk=0;
   io=dat&0x01;   //从低位开始传输
   dat=dat>>1;
   sclk=1;                   //数据在上升沿有效 开始写入
   
   }
}
uchar read_ds1302_byte(uchar add)
{
  uchar i;
  uchar dat;
  rst=0;
  _nop_();
  sclk=0;
  _nop_();
  rst=1;
  write_ds1302_byte(add);  //由于写时sclk为高电平
  for(i=0;i<8;i++)
  {
    sclk=0;                                 //读下降沿有效
        dat=dat>>1;          //只移7位
        if(io)
        {
         dat=dat|0x80;
          sclk=1;
       }
    }
   rst=0;
   _nop_();
   sclk=0;
   _nop_();
   sclk=1;
   _nop_();
   io=1;
   return(dat);
}

void write_ds1302(uchar add,uchar dat)
{

  rst=0;
  _nop_();
  rst=1;
  _nop_();
  sclk=0;
  write_ds1302_byte(add);
  write_ds1302_byte(dat);
  rst=0;
  _nop_();
  io=1;
  sclk=1;
}
void set_rtc()
{
  uchar i,j;
  for(i=0;i<7;i++)
   {
            j=time_data[i]/10;                      //十位
         time_data[i]=time_data[i]%10;          //个位
         time_data[i]=j*16+time_data[i];  //转换为十六进制
      }
  write_ds1302(0x8e,0x00);             //去除写保护
   for(i=0;i<7;i++)
   {
           write_ds1302(time_add[i],time_data[i]);
    }
   write_ds1302(0x8e,0x80);                           //加写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
   time_data[i]=read_ds1302_byte(read_add[i]); //读取的是16进制数 需转换
   }
}

这是1602的代码
#include"LCD1602.H"
#include<reg52.h>
#include"DELAY.H"
#include"dds1302.h"
#define uchar unsigned char
#define uint  unsigned int
sbit rs=P1^1;
sbit rw=P1^2;
sbit en=P1^3;

unsigned char digital[10]={"0123456789"} ;

void write_data(unsigned char dat)
{
  rs=1;
  rw=0;
  en=0;
  P0=dat;
  delay_50us(6);
  en=1;
  delay_50us(20);
  en=0;
}
void write_command(unsigned char com)           /***lcd1602写指令***/
{
  rs=0;
  rw=0;
  en=0;       //先拉低使能端,因为初始化默认为高电平
  P0=com;
  delay_50us(6);
  en=1;
  delay_50us(20);
  en=0;
}

void disp_year()
{
  uint i ,j;                 //十位 个位
  i=time_data[0]/16;         //十位
  j=time_data[0]%16;         //个位
  write_command(0x80+5);
  write_data(digital[i]);
  write_command(0x80+6);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms

}
void disp_month()
{
  uchar i ,j;                 //十位 个位
  i=time_data[2]/16;         //十位
  j=time_data[2]%16;         //个位
  write_command(0x80+8);
  write_data(digital[i]);
  write_command(0x80+9);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms

   }
void disp_date()                          //日
{
   uchar i ,j;                 //十位 个位
  i=time_data[3]/16;         //十位
  j=time_data[3]%16;         //个位
  write_command(0x80+11);
  write_data(digital[i]);
  write_command(0x80+12);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms

}
void disp_day()                    /***星期***/
{
   uchar i ,j;                 //十位 个位
  i=time_data[1]/16;         //十位
  j=time_data[1]%16;         //个位
  write_command(0x80+14);           //第一列 14行
  write_data(digital[i]);
  write_command(0x80+15);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms
}
void disp_hour()
{
  uchar i ,j;                 //十位 个位
  i=time_data[4]/16;         //十位
  j=time_data[4]%16;         //个位
  write_command(0xc0+5);           //第一列 14行
  write_data(digital[i]);
  write_command(0xc0+6);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms
}
void disp_minute()
{
  uchar i ,j;                 //十位 个位
  i=time_data[5]/16;         //十位
  j=time_data[5]%16;         //个位
  write_command(0xc0+8);           //第一列 14行
  write_data(digital[i]);
  write_command(0xc0+9);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms
}
void disp_second()
{
  uint i ,j;                 //十位 个位
  i=time_data[4]/16;         //十位
  j=time_data[4]%16;         //个位
  write_command(0xc0+11);           //第一列 14行
  write_data(digital[i]);
  write_command(0xc0+12);
  write_data(digital[j]);
  delay_50us(200);        //延时1ms
  }
void disp_all_date()
{
disp_year() ;
disp_month();
disp_day()  ;   //星期
disp_date();    //日
disp_hour();
disp_minute();
disp_second();
}

void init_lcd1602(void)
{
write_command(0x38);
delay(20);
write_command(0x38);
delay(20);
write_command(0x38);
write_command(0x0c);
delay(20);
write_command(0x06);
delay(20);
write_command(0x01);
delay(20);
}

这是主函数main()

#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#include"DELAY.H"
#include"LCD1602.H"

void main()
{
set_rtc();
init_lcd1602();
write_command(0x80);
write_data('D');
write_data('a');
write_data('t');
write_data('e');
write_data(':');
   while(1)
   {
    read_rtc();
    disp_all_date();
        }

}
附上模拟电路图片
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
大哈欠E
1楼-- · 2020-01-30 15:39
怎么没有人了。。。????求助啊
lmt50211
2楼-- · 2020-01-30 21:25
同求。。。。。。
xiaobendan001
3楼-- · 2020-01-30 22:02
 精彩回答 2  元偷偷看……
bbssilverkey
4楼-- · 2020-01-31 03:24
用串口先输出来看结果,如果这个你不想也估计没人能帮你了
大哈欠E
5楼-- · 2020-01-31 09:11
bbssilverkey 发表于 2013-5-9 10:03
用串口先输出来看结果,如果这个你不想也估计没人能帮你了

已经解决了 ,折腾了几个小时 谢谢
bbssilverkey
6楼-- · 2020-01-31 13:56
大哈欠E 发表于 2013-5-9 14:10
已经解决了 ,折腾了几个小时 谢谢

呵呵,加油吧,以后经常都会遇到这种事.

一周热门 更多>