搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2013-5-9 07:25:03 | 显示全部楼层 |阅读模式
这次想做个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();
        }

}
附上模拟电路图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-5-9 07:54:46 | 显示全部楼层
怎么没有人了。。。????求助啊

出0入0汤圆

发表于 2013-5-9 08:27:44 | 显示全部楼层
同求。。。。。。

出0入0汤圆

发表于 2013-5-9 09:31:33 | 显示全部楼层
一部分一部分的测试了

出0入0汤圆

发表于 2013-5-9 10:03:25 | 显示全部楼层
用串口先输出来看结果,如果这个你不想也估计没人能帮你了

出0入0汤圆

 楼主| 发表于 2013-5-9 14:10:23 | 显示全部楼层
bbssilverkey 发表于 2013-5-9 10:03
用串口先输出来看结果,如果这个你不想也估计没人能帮你了

已经解决了 ,折腾了几个小时 谢谢

出0入0汤圆

发表于 2013-5-9 17:48:25 | 显示全部楼层
大哈欠E 发表于 2013-5-9 14:10
已经解决了 ,折腾了几个小时 谢谢

呵呵,加油吧,以后经常都会遇到这种事.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表