51驱动DS1302_自己写的代码_献丑了

2020-01-19 19:39发布

我上大四了,现在在北京某公司实习,硬件工程,
代码拖拖拉拉写了两个月的时间,年前考试之前就开始写了,由于考试和找工作的事,耽搁了 ,年后,实习,发现,软件搞好很有必要,所以我以后一码一字都要自己写,以后才能成长
所以又把它拿起来了。今天终于成功了。
亲测能用。里面内嵌了串口调试程序,也就是说时间不仅通过数码管显示,还会把读取出的时分秒发到PC上去,方便调试!
测试时有一个小插曲:就是DS1302运行起来后,走时不准,不像网上说的那个走时不准还比较靠谱的,一分钟差几秒,我这个是实际走十多秒,它才走一秒。用开发板带的例程烧进去也是很不准。大概实际走五秒才走一秒
最后我把纽扣电池卸下了,重新安装回去就好了。解决问题!


献丑了,献给后来人







  1. /*
  2. DS1302时钟芯片数码管显示
  3. zhanglei
  4. 2014年1月28日7:40:14







  5. */
  6. #include <reg52.h>
  7. #include <intrins.h>

  8. #define  SECR  0x81 //对秒寄存器进行读操作
  9. #define  SECW  0x80 //对秒寄存器进行写操作
  10. #define  MINW  0x82 //对分寄存器进行写操作
  11. #define  MINR  0x83 //对分寄存器进行读操作
  12. #define  HOUW  0x84 //对小时寄存器进行写操作
  13. #define  HOUR  0x85 //对小时寄存器进行读操作



  14. unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  15. //数码管显示0~9的段码表
  16. unsigned char code sheet[1]={0x00};
  17. unsigned char h,m,s;
  18. sbit SCLK=P1^0;
  19. sbit IO=P1^1;
  20. sbit RST=P1^2;
  21. sbit ACC7=ACC^7;
  22. //显示延时函数
  23. void delayms(unsigned char i)
  24. {
  25.     unsigned char j;
  26.     for(;i>0;i--)
  27.         {
  28.           for(j=0;j<200;j++);
  29.         }




  30. }
  31. //函数功能:通过串口中断测试读取出来的时,分,秒
  32. //入口参数:读取出来的数据m,h,s
  33. //返回值:无
  34. void Com_Init()
  35. {
  36.    SCON= 0x40;                //串口方式1
  37.    PCON=0;                     //SMOD=0
  38.    REN=1;                     //允许接收
  39.    TMOD= 0x20;                //定时器1定时方式2
  40.    TH1= 0xfd;                //11.0592M 9600波特率
  41.    TL1= 0xfd;
  42.    TR1= 1;                  //启动定时器   
  43. }


  44. //函数功能:SPI总线字节写函数
  45. //入口参数:寄存器地址addr,写入寄存器的数据dat
  46. //返回值:无

  47. void writedata(unsigned char addr,unsigned char dat)
  48. {
  49.    unsigned char i;
  50.    unsigned char j;
  51.      RST=0;
  52.          SCLK=0;
  53.          RST=1;
  54.          for(i=0;i<8;i++)
  55.          {
  56.                 SCLK=0;
  57.         IO=(bit)(addr&0x01);
  58.                 addr>>=1;
  59.                 SCLK=1;
  60.                 _nop_();
  61.                 _nop_();
  62.           }
  63.           for(j=0;j<8;j++)
  64.           {
  65.             SCLK=0;
  66.                 IO=(bit)(dat&0x01);
  67.                 dat>>=1;
  68.                 SCLK=1;
  69.                 _nop_();
  70.                 _nop_();
  71.           }
  72.           RST=0;
  73.           SCLK=1;
  74. }

  75. //SPI总线读取数据函数
  76. //入口参数:addr 存储数据的地址
  77. //返回值:返回SPI总线上的数据

  78. unsigned char readdata(unsigned char addr)
  79. {
  80.    unsigned char i;
  81.    unsigned char date;
  82.    RST=0;
  83.    SCLK=0;
  84.    IO=0;
  85.    RST=1;
  86.          for(i=0;i<8;i++)
  87.          {
  88.             SCLK=0;
  89.                 IO=(bit)(addr&0x01);
  90.                 addr>>=1;
  91.                 SCLK=1;
  92.                 _nop_();
  93.                 _nop_();
  94.           }

  95.    for(i=0;i<8;i++)
  96.    {
  97.     ACC7=IO;//数据是从低位开始读取的
  98.     SCLK=1;       
  99.         SCLK=0;
  100.     ACC>>=1;
  101.    }
  102.    SCLK=1;
  103.    RST=0;
  104.    date=ACC;
  105.    return date;
  106. }



  107. //函数功能:读取小时,分,秒数据并显示
  108. //入口参数:无
  109. //返回值:无
  110. void ledshow()
  111. {
  112.    
  113.    h=readdata(HOUR);//读取小时  
  114.    m=readdata(MINR);//读取分钟
  115.    s=readdata(SECR);//读取秒
  116.    //打印时,分,秒
  117.    SBUF=h;
  118.    while(TI==0);
  119.    TI=0;
  120.    SBUF=m;
  121.    while(TI==0);
  122.    TI=0;
  123.    SBUF=s;
  124.    while(TI==0);
  125.    TI=0;
  126.    SBUF=sheet[0];
  127.    while(TI==0);
  128.    TI=0;


  129. /***

  130. *******zhanglei  test ledshow
  131. //   h=0x20;
  132. //   m=0x24;
  133. //   s=0x22;
  134. ******/
  135.    P2=0xfd;
  136.    P0=tab[(h&0x0f)];
  137.    delayms(5);
  138.    P2=0xfe;
  139.    P0=tab[((h>>4)&0x07)];
  140.    delayms(5);
  141.    P2=0xf7;
  142.    P0=tab[(m&0x0f)];
  143.    delayms(5);
  144.    P2=0xfb;
  145.    P0=tab[((m>>4)&0x07)];
  146.    delayms(5);
  147.    P2=0xdf;
  148.    P0=tab[(s&0x0f)];
  149.    delayms(5);
  150.    P2=0xef;
  151.    P0=tab[((s>>4)&0x07)];
  152.    delayms(5);
  153.    
  154. }



  155. void main(void)
  156. {
  157.      Com_Init();
  158.          writedata(0x8e,0x00);//对0x8e寄存器操作,去掉写保护,对最高位WP写0        ·
  159.          //对DS1302写入时间 20:24:22
  160.          writedata(HOUW,0x20);//设置小时,模式24h制,
  161.          writedata(MINW,0x58);//设置分钟
  162.          writedata(SECW,0x22);//设置秒并且使DS1302开始走时
  163.          writedata(0x8e,0x80);//进行写保护
  164.          while(1)
  165.          {
  166.            delayms(3);
  167.            ledshow();
  168.          }

  169. }






复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
丙寅电子
1楼-- · 2020-01-22 07:15
感谢分享!
Ray______
2楼-- · 2020-01-22 11:51
感觉1302这个芯片不怎么好,不同的有时差别好大,之前用过一个半坏不坏的
磊磊映画
3楼-- · 2020-01-22 14:12
Ray______ 发表于 2014-11-29 11:21
感觉1302这个芯片不怎么好,不同的有时差别好大,之前用过一个半坏不坏的

是你买的那写不好,不要那局部否定全部
Ray______
4楼-- · 2020-01-22 17:05
 精彩回答 2  元偷偷看……
qsq0128
5楼-- · 2020-01-22 18:42
记录,以后有用
tangjiaqq
6楼-- · 2020-01-22 20:56
还是写的很好的

一周热门 更多>