找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1430|回复: 3
打印 上一主题 下一主题
收起左侧

我悬赏一百黑币,请求帮我解答这个疑惑,关于ds1302的程序的一点问题

[复制链接]
跳转到指定楼层
楼主
ID:329253 发表于 2018-5-25 22:01 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
麻烦帮我看看,最后我用串口打印出来的数值始终不对,最后打印出来的是00 08 F8  08  00 F8跟我设置好的时间不一样呀
#include "reg51.h"
sbit RST= P3^5;
sbit SCLK= P3^6;
sbit DPIO= P3^4;
unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char time[7];       
void delay()
{         
         unsigned char i;
     unsigned char j;
         for(i=0;i<6;i++)
       for(j=0;j<6;j++);
}
void sendbyte(unsigned char addr ,unsigned char dat)
{
  unsigned char i;
  RST        =0;
   delay();
  SCLK =0;
   delay() ;
  RST        =1;
   delay();
        for(i=0;i<8;i++)
        {
         DPIO=addr&0x01;
         addr>>=1;
         SCLK =1;
         delay();
          SCLK =0;
          delay();
        }
           for(i=0;i<8;i++)
        {
         DPIO=dat&0x01;
         dat>>=1;
         delay();
         SCLK =1;
         delay();
         delay();
          SCLK =0;
          delay();
        }

         RST=0;
         delay();
         SCLK =0;
         delay();
}
unsigned char read(unsigned char addr)
{
  unsigned char i;
  unsigned char dat;
  unsigned char tmp;
  RST        =0;
  delay();
  SCLK =0;
  RST        =1;
  delay();
        for(i=0;i<8;i++)
        {
         DPIO=addr&0x01;
         addr>>=1;
         SCLK =1;
         delay();
          SCLK =0;
          delay();
        }
           for(i=0;i<8;i++)
        {
          DPIO=tmp;
         dat|=tmp<<7;
         SCLK =1;
         delay();
          SCLK =0;
          delay();
        }

         RST=0;
         delay();
         SCLK =0;
         delay();
         DPIO = 0;
         delay();
         return dat;
}
void read_reg()
{
        unsigned char i;
    for(i=0;i<8;i++)

        {
        time[i]=read( READ_RTC_ADDR[i]);
        }
}
void write()
{
   unsigned char i;
        sendbyte(0x8e,0x00);
         time[0]=0x30;
         time[1]=0x35;
         time[2]=0x20;
         time[3]=0x25;
         time[4]=0x05;
         time[5]=0x05;
         time[6]=0x18;
        for(i=0;i<7;i++)
   {
   sendbyte(WRITE_RTC_ADDR[i],time[i]);
   delay();
        }
        sendbyte(0x8E, 0x80);
}
void uart_init(void)
{
        // 波特率9600
        SCON = 0x50;           // 串口工作在模式1(8位串口)、允许接收
        PCON = 0x00;        // 波特率不加倍

        // 通信波特率相关的设置
        TMOD = 0x20;        // 设置T1为模式2
        TH1 = 253;
        TL1 = 253;                   // 8位自动重装,意思就是TH1用完了之后下一个周期TL1会
                                        // 自动重装到TH1去

        TR1 = 1;                // 开启T1让它开始工作
}

// 通过串口发送1个字节出去
void uart_send_byte(unsigned char c)
{
   // 第1步,发送一个字节
   SBUF = c;

   // 第2步,先确认串口发送部分没有在忙
   while (!TI);

   // 第3步,软件复位TI标志位
   TI = 0;
}
void main()
{         
    unsigned char k;
         uart_init();
     write();
       
         while(1)
    {
            read_reg();
               for(k=0;k<7;k++)
            {
              uart_send_byte(time[k]);
              }
            delay();
     }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:155507 发表于 2018-5-26 10:11 | 只看该作者
DS1302 须要BCD处理


  1. #include "reg51.h"
  2. #define ds1302_sec_add                        0x80                //秒数据地址
  3. #define ds1302_min_add                        0x82                //分数据地址
  4. #define ds1302_hr_add                        0x84                //时数据地址
  5. #define ds1302_date_add                        0x86                //日数据地址
  6. #define ds1302_month_add                0x88                //月数据地址
  7. #define ds1302_day_add                        0x8a                //星期数据地址
  8. #define ds1302_year_add                        0x8c                //年数据地址
  9. #define ds1302_control_add                0x8e                //控制数据地址
  10. #define ds1302_charger_add                0x90                                          
  11. #define ds1302_clkburst_add                0xbe
  12. sbit RST= P3^5;
  13. sbit SCLK= P3^6;
  14. sbit DPIO= P3^4;
  15. unsigned char code READ_RTC_ADDR[7]  = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  16. unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  17. unsigned char time[7];        

  18. void delay()
  19. {         
  20.         unsigned char i;
  21.         unsigned char j;
  22.         for(i=0;i<6;i++)
  23.         for(j=0;j<6;j++);
  24. }

  25. void sendbyte(unsigned char addr ,unsigned char dat)
  26. {
  27.         unsigned char i;
  28.         RST  =0;
  29.         delay();
  30.         SCLK =0;
  31.         delay() ;
  32.         RST  =1;
  33.         delay();
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 DPIO=addr&0x01;
  37.                 addr>>=1;
  38.                 SCLK =1;
  39.                 delay();
  40.                 SCLK =0;
  41.                 delay();
  42.         }
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 DPIO=dat&0x01;
  46.                 dat>>=1;
  47.                 delay();
  48.                 SCLK =1;
  49.                 delay();
  50.                 delay();
  51.                 SCLK =0;
  52.                 delay();
  53.         }

  54.         RST=0;
  55.         delay();
  56.         SCLK =0;
  57.         delay();
  58. }

  59. unsigned char read(unsigned char addr)
  60. {
  61.         unsigned char i;
  62.         unsigned char dat;
  63.         unsigned char tmp;
  64.         RST  =0;
  65.         delay();
  66.         SCLK =0;
  67.         RST  =1;
  68.         delay();
  69.         for(i=0;i<8;i++)
  70.         {
  71.                 DPIO=addr&0x01;
  72.                 addr>>=1;
  73.                 SCLK =1;
  74.                 delay();
  75.                 SCLK =0;
  76.                 delay();
  77.         }
  78.         for(i=0;i<8;i++)
  79.         {
  80.                 DPIO=tmp;
  81.                 dat|=tmp<<7;
  82.                 SCLK =1;
  83.                 delay();
  84.                 SCLK =0;
  85.                 delay();
  86.         }

  87.         RST=0;
  88.         delay();
  89.         SCLK =0;
  90.         delay();
  91.         DPIO = 0;
  92.         delay();
  93.         return dat;
  94. }
  95. void read_reg()
  96. {
  97.         unsigned char i, tmp;
  98.         unsigned char time_buf[8] ;
  99.         for(i=0;i<8;i++)

  100.         {
  101.                 time_buf[i]=read( READ_RTC_ADDR[i]);
  102.         }
  103.         for(i=0;i<8;i++)
  104.         {           //BCD处理
  105.                 tmp=time_buf[i]/16;
  106.                 time[i]=time_buf[i]%16;
  107.                 time[i]=time[i]+tmp*10;
  108.         }
  109. }
  110. void write()
  111. {
  112.         unsigned char i, tmp;
  113.         unsigned char time_buf[8] ;
  114.         sendbyte(0x8e,0x00);
  115.         time[0]=0x30;
  116.         time[1]=0x35;
  117.         time[2]=0x20;
  118.         time[3]=0x25;
  119.         time[4]=0x05;
  120.         time[5]=0x05;
  121.         time[6]=0x18;
  122.         for(i=0;i<7;i++)
  123.         {                  //DS1302 须要BCD处理
  124.                 tmp=time[i]/10;
  125.                 time_buf[i]=time[i]%10;
  126.                 time_buf[i]=time_buf[i]+tmp*16;
  127.         }
  128.         for(i=0;i<7;i++)
  129.         {
  130.                 sendbyte(WRITE_RTC_ADDR[i],time_buf[i]);
  131.                 delay();
  132.         }
  133.         sendbyte(0x8E, 0x80);
  134. }
  135. void uart_init(void)
  136. {
  137.         // 波特率9600
  138.         SCON = 0x50;           // 串口工作在模式1(8位串口)、允许接收
  139.         PCON = 0x00;        // 波特率不加倍

  140.         // 通信波特率相关的设置
  141.         TMOD = 0x20;        // 设置T1为模式2
  142.         TH1 = 253;
  143.         TL1 = 253;                   // 8位自动重装,意思就是TH1用完了之后下一个周期TL1会
  144.         // 自动重装到TH1去

  145.         TR1 = 1;                // 开启T1让它开始工作
  146. }

  147. // 通过串口发送1个字节出去
  148. void uart_send_byte(unsigned char c)
  149. {
  150.         // 第1步,发送一个字节
  151.         SBUF = c;

  152.         // 第2步,先确认串口发送部分没有在忙
  153.         while (!TI);

  154.         // 第3步,软件复位TI标志位
  155.         TI = 0;
  156. }

  157. void main()
  158. {         
  159.         unsigned char k;
  160.         uart_init();
  161.         write();
  162.        
  163.         while(1)
  164.         {
  165.                 read_reg();
  166.                 for(k=0;k<7;k++)
  167.                 {
  168.                         uart_send_byte(time[k]);
  169.                 }
  170.                 delay();
  171.         }

  172. }

复制代码
回复

使用道具 举报

板凳
ID:329253 发表于 2018-5-26 21:14 | 只看该作者
angmall 发表于 2018-5-26 10:11
DS1302 须要BCD处理

打印出来和原来一样呀,什么情况?
回复

使用道具 举报

地板
ID:155507 发表于 2018-5-26 22:21 | 只看该作者
请检查你的DS1302时钟模块和单片机怎样接线
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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