搜索
bottom↓
回复: 1

51读DS1302然后1602显示,不工作哦,求大侠指导

[复制链接]

出0入0汤圆

发表于 2011-4-24 18:07:01 | 显示全部楼层 |阅读模式
想测试下DS1302时钟芯片,结果仿真可以,实际就不行了,说不清楚,上图

(原文件名:QQ截图未命名.png)


(原文件名:1302.png)


下面的是仿真时的情形,能工作

(原文件名:11.jpg)



就这两个,不知问题出哪,测试发现晶振没起振,程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char


//DS1302管脚定义
sbit SCLK=P1^0;
sbit DQ=P1^1;
sbit RST=P1^2;
//液晶1602管脚定义
sbit rs=P2^6;
sbit lcden=P2^7;
uchar a,b,c,d,e,f;
uchar code table0[]="DATE:";
uchar code table1[]="TIME:";

/*--------------------    函数声明-------------------------------------*/
void delayms(int x);
void  lcd_write(uchar com);//LCD写命令
void  lcd_date(uchar  date);//LCD写数据
void  lcd_start();//LCD初始化
void writedat(uchar address,uchar dat);
uchar readdat(uchar address);
void ds1302_init();
void DS1302open();
//void DS1302close();
void getdisplay();

/*******************************主函数***********************************/

void main()
{     uint i;
      ds1302_init();
      lcd_start();//LCD和DS1302初始化
      lcd_write(0x80);
      for(i=0;i<5;i++)//写上标志
      lcd_date(table0);
      lcd_write(0x80+0x40);
      for(i=0;i<5;i++)
      lcd_date(table1);   
      
      while(1)
      {
          DS1302open();
          delayms(200);  
          getdisplay();
      }
}
/**********************************************************************/

//****写有确切地址的一个字节函数******/////
void writedat(uchar address,uchar dat)
{   int i,j;                         //设置循环变量
     RST=0;                            //禁止读写,避免前面的字节读写的干扰
     SCLK=0;
     RST=1;                            //允许读写
     for(i=0;i<8;i++)                  //写地址
     {   
         DQ=address&0X01;
         SCLK=0;             //发送最低位
         SCLK=1;
         address=address>>1;    //右移,以便发送次低位S
      }                           
     for(j=0;j<8;j++)                  //连续写8bit
      {
                                      
                                      
           DQ=dat&0x01;               
           SCLK=0;                    
           SCLK=1;                    //拉高时钟信号,数据被写入
           dat=dat>>1;                //待发送的数据右移1位,,以便发送
      }
     SCLK=0;                          //写完一个字节,拉低时钟信号          
}

//读有确切单元地址的一个字节函数*//
uchar readdat(uchar address)
{   uchar rdata=0;                    //存放数据的变量
     int i,j;                          //设置循环变量
     RST=0;                            //禁止读写,避免前面的字节读写的干扰
     SCLK=0;
     RST=1;                            //允许读写
     for(i=0;i<8;i++)                  //写地址
     {   
          DQ=address&0X01;             //发送最低位  
          SCLK=0;           
          SCLK=1;            
          address=address>>1; //右移,以便发送次低位
      }                                //设置循环变量         
     for(j=0;j<8;j++)                  //连续读取8bit         
      {
        if(DQ==1)                      //拉低时钟信号,读数据               
        rdata=rdata|0x80;              //把接收到的数据放到接收寄存器的最高位
        else
        rdata=rdata&0x7f;              //拉高时钟信号
        SCLK=1;  
        SCLK=0;  
        rdata=rdata>>1;                //接收寄存器右移1位,,新的最高位来存放高位数据
                  
      }
     SCLK=0;                           //拉低时钟信号,平时保持低电平信号,有利于编程  
     return rdata;                     //返回读取到的数据   
  }

//*DS1302初始化(同时是设置时间函数)**//
void ds1302_init()
  {
   SCLK=0;                             //拉低时钟信号  
   RST=0;                              //复位DS1302
   RST=1;                              //使能DS1302                  
                                       //发写保护寄存器命令 ,往写保护寄存器中写入0,以打开写保护
   writedat(0x8e,0x00);                //允许写DS1302
   writedat(0x82,0x00);                //设置分,00
   writedat(0x84,0x00);                //设置时.00
   writedat(0x86,0x25);                //设置日,15
   writedat(0x88,0x04);                //设置月份3
   writedat(0x8c,0x11);                //设置年2011
   writedat(0x80,0x80);                //设置秒,00,并禁止启动
   RST=0;                              //禁止写,只允许读
  }
/*---------------------------------------------------------*/

void DS1302open()//开始函数
{ uchar val;
  val=readdat(0x81);//读出秒
  RST=1;
  writedat(0x80,val&0x7f);//将秒寄存器第七位置零,开始晶振使能  
  RST=0;
}
/*void DS1302close()//关闭函数
{ uchar val;
  val=readdat(0x81);//读出秒
  RST=1;
  writedat(0x80,val|0x80);//将秒寄存器第七位置零,开始晶振关闭
  RST=0;
}*/
void  lcd_write(uchar com)//写命令
{   delayms(10);
    rs=0;
    lcden=0;
    delayms(1);
    P3=com;
    delayms(1);
    lcden=1;
    delayms(1);
    lcden=0;
}
void  lcd_date(uchar  date)//写数据
{   delayms(10);
     rs=1;
     lcden=0;
     delayms(1);
     P3=date;
     delayms(1);
     lcden=1;
     delayms(1);
     lcden=0;
}
void  lcd_start()//初始化
{   
    lcden=0;
    lcd_write(0x38);
    lcd_write(0x0c);
    lcd_write(0x06);
    lcd_write(0x01);
    delayms(5);   
}

void delayms(int x)
{   int i,j;
    for(i=x;i>0;i--)
    for(j=110;j>0;j--);


}
/*************************读并显示函数****************************/
void  getdisplay()
{

      a=readdat(0X81);  //读秒、时、分、时、日、月、年
      b=readdat(0X83);
      c=readdat(0X85);
      d=readdat(0X87);
      e=readdat(0X89);
      f=readdat(0X8d);
  
      lcd_write(0x80+5);
      lcd_date(2+0x30);
          lcd_date(0+0x30); //写上20前缀
          lcd_date((f>>4)+0x30);
          lcd_date((f&0x0f)+0x30);//写年、月、日、时、分、秒
          lcd_date(0xb0);
          lcd_date((e>>4)+0x30);
          lcd_date((e&0x0f)+0x30);
          lcd_date(0xb0);
          lcd_date((d>>4)+0x30);
          lcd_date((d&0x0f)+0x30);
          lcd_write(0xc0+5);
          lcd_date((c>>4)+0x30);
          lcd_date((c&0x0f)+0x30);
          lcd_date(0xb0);
          lcd_date((b>>4)+0x30);
          lcd_date((b&0x0f)+0x30);
          lcd_date(0xb0);
          lcd_date(((a>>4)&0x07)+0x30);
          lcd_date((a&0x0f)+0x30);
}

是51单片机的,请路过的大侠看看啦,如果有该电路的大侠,可以下载下去试试,看我这程序对不对,然后记得抽空回复我下,小弟感激不尽

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

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 12:28

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

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